Создать прямоугольник с двумя закругленными углами?

Мне нужно создать прямоугольник с двумя закругленными углами в быстром (код Objective C также хорошо).

В настоящий момент мой код создает два прямоугольника с

CGPathCreateWithRoundedRect(CGRectMake(0, 0, 30, 60), 5, 5, nil); 

а также

 CGPathCreateWithRoundedRect(CGRectMake(0, 0, 30, 60), 0, 0, nil); 

и слияние их (иметь два угла с прямым углом и два закругленных), но я не доволен кодом, и я уверен, что должны быть намного лучшие способы сделать это.

Я новичок в iOS и графическом развитии и быстроте.

В Swift 2.3 вы можете сделать это

 let maskPath = UIBezierPath(roundedRect: anyView.bounds, byRoundingCorners: [.BottomLeft, .BottomRight], cornerRadii: CGSize(width: 10.0, height: 10.0)) let shape = CAShapeLayer() shape.path = maskPath.CGPath view.layer.mask = shape 

В Objective-C вы можете использовать UIBezierPath класса UIBezierPath

 bezierPathWithRoundedRect:byRoundingCorners:cornerRadii: 

пример реализации-

 // set the corner radius to the specified corners of the passed container - (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners { UIBezierPath *rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(10.0, 10.0)]; CAShapeLayer *shape = [[CAShapeLayer alloc] init]; [shape setPath:rounded.CGPath]; view.layer.mask = shape; } 

и вызывать вышеупомянутый метод as-

 [self setMaskTo:anyView byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight]; 

Вот быстрая версия Swift 3, которую вы можете использовать для округления и дополнительных границ.

Примечание. Если вы используете автозапуск, вам может потребоваться вызвать это в одном из обратных вызовов жизненного цикла view, таких как viewDidLayoutSubviews или layoutSubviews после того, как представление было ограничено.

 import UIKit extension UIView { /** Rounds the given set of corners to the specified radius - parameter corners: Corners to round - parameter radius: Radius to round to */ func round(corners: UIRectCorner, radius: CGFloat) { _ = _round(corners: corners, radius: radius) } /** Rounds the given set of corners to the specified radius with a border - parameter corners: Corners to round - parameter radius: Radius to round to - parameter borderColor: The border color - parameter borderWidth: The border width */ func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) { let mask = _round(corners: corners, radius: radius) addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth) } /** Fully rounds an autolayout view (eg one with no known frame) with the given diameter and border - parameter diameter: The view's diameter - parameter borderColor: The border color - parameter borderWidth: The border width */ func fullyRound(diameter: CGFloat, borderColor: UIColor, borderWidth: CGFloat) { layer.masksToBounds = true layer.cornerRadius = diameter / 2 layer.borderWidth = borderWidth layer.borderColor = borderColor.cgColor; } } private extension UIView { @discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer { let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.cgPath self.layer.mask = mask return mask } func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) { let borderLayer = CAShapeLayer() borderLayer.path = mask.path borderLayer.fillColor = UIColor.clear.cgColor borderLayer.strokeColor = borderColor.cgColor borderLayer.lineWidth = borderWidth borderLayer.frame = bounds layer.addSublayer(borderLayer) } } 

Вот что вы делаете в Swift 2.0

 var maskPath = UIBezierPath(roundedRect: anyView.bounds, byRoundingCorners: [.BottomLeft, .BottomRight], cornerRadii: CGSize(width: 10.0, height: 10.0)) 

Основываясь на превосходном ответе Санджая, я написал быстрое расширение CALayer для Swift 2.3, если вам нужно делать подобные «только вокруг некоторых углов» более одного раза.

 extension CALayer { func roundCorners(corners: UIRectCorner, radius: CGFloat) { let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let shape = CAShapeLayer() shape.path = maskPath.CGPath mask = shape } } 

Применение:

 myView.layer.roundCorners([.TopLeft, .TopRight], radius: myCornerRadius) 

Swift 3.0 (В этом примере границы были получены из представления не со слоя. Использование границ из представления делает этот код для работы с представлениями в UITableViewCell.):

 func roundCorners(corners: UIRectCorner, radius: CGFloat, viewBounds: CGRect) { let maskPath = UIBezierPath(roundedRect: viewBounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let shape = CAShapeLayer() shape.path = maskPath.cgPath mask = shape } 

Применение:

 myView.layer.roundCorners(corners: [.topLeft, .topRight], radius: myCornerRadius, viewBounds: bounds) 

Swift 3 – Полезное расширение UIView когда вам нужно округлить определенные углы некоторых видов:

 extension UIView { func round(corners: UIRectCorner, radius: CGFloat) { let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.cgPath self.layer.mask = mask } } 

то просто используйте его так:

 someView.round(corners: [.topLeft, .topRight], radius: 5) 

2017 …

введите описание изображения здесь

 @IBDesignable class RoundedEnds: UIView { override func layoutSubviews() { setup() } // "layoutSubviews" is best func setup() { let r = self.bounds.size.height / 2 let path = UIBezierPath(roundedRect: self.bounds, cornerRadius:r) let mask = CAShapeLayer() mask.path = path.cgPath self.layer.mask = mask } } 

Для некоторых углов просто измените на:

введите описание изображения здесь

 roundedRect: self.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: r, height: r) 

Обратите внимание, что, как обычно, в Swift было много небольших изменений, например, капитализация констант и т. Д.

Вариант ответа iWasRobbed версии Objective-C:

UIView + RoundCorners.h

 #import <UIKit/UIKit.h> @interface UIView (RoundCorners) /** Rounds the given set of corners to the specified radius - parameter corners: Corners to round - parameter radius: Radius to round to */ - (void)roundCorners:(UIRectCorner)corners radius:(CGFloat)radius; /** Rounds the given set of corners to the specified radius with a border - parameter corners: Corners to round - parameter radius: Radius to round to - parameter borderColor: The border color - parameter borderWidth: The border width */ - (void)roundCorners:(UIRectCorner)corners radius:(CGFloat)radius borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth; /** Fully rounds an autolayout view (eg one with no known frame) with the given diameter and border - parameter diameter: The view's diameter - parameter borderColor: The border color - parameter borderWidth: The border width */ - (void)fullyRoundWithDiameter:(CGFloat)diameter borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth; @end 

UIView + RoundCorners.m

 #import "UIView+RoundCorners.h" @implementation UIView (RoundCorners) - (void)roundCorners:(UIRectCorner)corners radius:(CGFloat)radius { [self _roundCorners:corners radius:radius]; } - (void)roundCorners:(UIRectCorner)corners radius:(CGFloat)radius borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth { CAShapeLayer *mask = [self _roundCorners:corners radius:radius]; [self addBorderWithMask:mask borderColor:borderColor borderWidth:borderWidth]; } - (void)fullyRoundWithDiameter:(CGFloat)diameter borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth { self.layer.masksToBounds = YES; self.layer.cornerRadius = diameter / 2; self.layer.borderWidth = borderWidth; self.layer.borderColor = borderColor.CGColor; } - (CAShapeLayer *)_roundCorners:(UIRectCorner)corners radius:(CGFloat)radius { UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)]; CAShapeLayer *mask = [CAShapeLayer layer]; mask.path = path.CGPath; self.layer.mask = mask; return mask; } - (void)addBorderWithMask:(CAShapeLayer *)mask borderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth { CAShapeLayer *borderLayer = [CAShapeLayer layer]; borderLayer.path = mask.path; borderLayer.fillColor = UIColor.clearColor.CGColor; borderLayer.strokeColor = borderColor.CGColor; borderLayer.lineWidth = borderWidth; borderLayer.frame = self.bounds; [self.layer addSublayer:borderLayer]; } @end 

Обновленный ответ iWasRobbed на работу с версией Swift 3.0 GM:

 import UIKit extension UIView { /** Rounds the given set of corners to the specified radius - parameter corners: Corners to round - parameter radius: Radius to round to */ func round(corners: UIRectCorner, radius: CGFloat) { _round(corners: corners, radius: radius) } /** Rounds the given set of corners to the specified radius with a border - parameter corners: Corners to round - parameter radius: Radius to round to - parameter borderColor: The border color - parameter borderWidth: The border width */ func round(corners: UIRectCorner, radius: CGFloat, borderColor: UIColor, borderWidth: CGFloat) { let mask = _round(corners: corners, radius: radius) addBorder(mask: mask, borderColor: borderColor, borderWidth: borderWidth) } /** Fully rounds an autolayout view (eg one with no known frame) with the given diameter and border - parameter diameter: The view's diameter - parameter borderColor: The border color - parameter borderWidth: The border width */ func fullyRound(diameter: CGFloat, borderColor: UIColor, borderWidth: CGFloat) { layer.masksToBounds = true layer.cornerRadius = diameter / 2 layer.borderWidth = borderWidth layer.borderColor = borderColor.cgColor; } } private extension UIView { @discardableResult func _round(corners: UIRectCorner, radius: CGFloat) -> CAShapeLayer { let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.cgPath self.layer.mask = mask return mask } func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) { let borderLayer = CAShapeLayer() borderLayer.path = mask.path borderLayer.fillColor = UIColor.clear.cgColor borderLayer.strokeColor = borderColor.cgColor borderLayer.lineWidth = borderWidth borderLayer.frame = bounds layer.addSublayer(borderLayer) } } 

Swift 4:

  let maskPath = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.allCorners], cornerRadii: CGSize(width: 10.0, height: 10.0)) let shape = CAShapeLayer() shape.path = maskPath.cgPath cell.layer.mask = shape return cell 
  • Правильно использовать библиотеку Obj-C в проекте Swift
  • Как прокрутить все UIButtons в моем представлении Swift?
  • Неожиданное название появляется в WebView VC Swift
  • Как конвертировать данные, полученные из UIImagePNGRepresentation (), в String и наоборот?
  • UIBarButtonItem: Как я могу найти его фрейм?
  • Как перенести класс маршрутизатора Alamofire в Swift 3?
  • Swift: невозможно перетащить элементы мышью в пустые разделы в UICollectionViewController и UITableView
  • iOS Swift: изменение размера изображения до 200x200pt / px
  • Swift / вызов делегата с помощью popViewController
  • Swift 2.1 - Неожиданно найден нуль при развертывании опционального вызова метода делегата
  • Квадратное видео с использованием AVFoundation
  • Interesting Posts

    PayPal Mobile Express – «Оплата невозможна с помощью мобильного устройства»

    Каковы различия между этими тремя концепциями, анимацией, переходом и транзакцией в iOS

    Интеграция библиотеки .net в приложение Objective C iOS

    Наблюдение за ключевыми значениями в состоянии UIButton

    Режим подсветки iPhone 5

    Загрузить изображение на сервер – Swift 3

    Как создать UITableView с настраиваемым режимом редактирования

    Каковы хорошие ресурсы (кроме Apple), чтобы понимать сертификаты, подписание кода, предоставление ресурсов и связанные с ними темы?

    ионные push-уведомления на ios не доставлены

    Я хочу создать панель управления, используя файл .traces после профилирования (Xcode Instrument). Является ли это возможным?

    iOS: воспроизведение htaccess защищенного видео mp4 прямо в браузере

    Добавить UIPageControl в UIScrollView

    Индивидуальный лист UIActionSheet

    Странный шум при воспроизведении разных звуков с разными объемами, установленными через OpenAL на iPhone

    Не удалось установить приложение на iPhone из-за ошибки компоновщика Mach-O

    Давайте будем гением компьютера.