Округлые углы только на вершине UIView

Привет, я ищу чистое решение, не перезаписывая drawRect или подобное, чтобы создать UIView с закругленными углами в верхней части UIView . Моя главная проблема здесь заключается в том, чтобы создать переменное решение, если представление будет изменено или что-то в этом роде. Есть ли чистое решение? Apple также делает это в первом элементе таблицы. это не может быть так сложно сделать.

    Вы можете сделать это, установив mask на слой вашего представления:

     CAShapeLayer * maskLayer = [CAShapeLayer layer]; maskLayer.path = [UIBezierPath bezierPathWithRoundedRect: self.bounds byRoundingCorners: UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii: (CGSize){10.0, 10.}].CGPath; self.layer.mask = maskLayer; 

    ВАЖНО: вы должны сделать это в layoutSubviews() вашего представления, так что представление уже было изменено из раскадровки


    В Swift <= 1.2

     let maskLayer = CAShapeLayer() maskLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: .TopLeft | .TopRight, cornerRadii: CGSize(width: 10.0, height: 10.0)).CGPath layer.mask = maskLayer 

    Swift 2.x

     let maskLayer = CAShapeLayer() maskLayer.path = UIBezierPath(roundedRect: bounds, byRoundingCorners: UIRectCorner.TopLeft.union(.TopRight), cornerRadii: CGSizeMake(10, 10)).CGPath layer.mask = maskLayer 

    Swift 3.x

     let maskLayer = CAShapeLayer() maskLayer.path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath layer.mask = maskLayer 

    Просто попробовал с Swift 3.0 , Xcode 8.0 :

    ПОМНИТЕ, чтобы установить вашу кнопку в viewDidLayoutSubviews() или layoutSubViews как описано здесь @rob.

    И когда вы хотите изменить фон на кнопке, вам просто нужно позвонить:

     yourButton.backgroundColor = UIColor.someColour 

    Источник:

     override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() yourButton.layer.masksToBounds = true yourButton.roundCorners(corners: [.topLeft,.topRight], radius: 5) } extension UIButton { func roundCorners(corners:UIRectCorner, radius: CGFloat) { let maskLayer = CAShapeLayer() maskLayer.path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)).cgPath self.layer.mask = maskLayer } } 
    • Вот результат:

    Состояние по умолчанию:

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

    Состояние:

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

    Надеюсь, эта помощь!

    Я справился с этим с помощью Эшли.

    Прежде всего я подclassифицировал UIView. Создание собственного конструктора для моего classа - (id)initWithContentView:(UIView *)aView forTableView:(UITableView *)table andIndex:(NSIndexPath *)indexPath; , В этом конструкторе я определяю, какую ячейку таблицы я хочу стилизовать.

    Затем я перезаписываю l - (void)layoutSubviews для создания CAShapeLayer и применения маски слоя.

    .h Код файла

     typedef enum { tableCellMiddle, tableCellTop, tableCellBottom, tableCellSingle } tableCellPositionValue; @interface TableCellBackgrounds : UIView { tableCellPositionValue position; } - (id)initWithContentView:(UIView *)aView forTableView:(UITableView *)table andIndex:(NSIndexPath *)indexPath; @end 

    .m Код файла

     - (id)initWithContentView:(UIView *)aView forTableView:(UITableView *)table andIndex:(NSIndexPath *)indexPath { self = [super initWithFrame:aView.frame]; [self setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; if(self) { [self setBackgroundColor:[UIColor colorWithRed:(float)230/255 green:(float)80/255 blue:(float)70/255 alpha:1]]; if(table.style == UITableViewStyleGrouped) { int rows = [table numberOfRowsInSection:indexPath.section]; if(indexPath.row == 0 && rows == 1) { self.layer.cornerRadius = 11; position = tableCellSingle; } else if (indexPath.row == 0) position = tableCellTop; else if (indexPath.row != rows - 1) position = tableCellMiddle; else position = tableCellBottom; } } return self; } - (void)layoutSubviews { [super layoutSubviews]; if(position == tableCellTop) { CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:(CGSize){10.0, 10.0}].CGPath; self.layer.mask = maskLayer; } else if (position == tableCellBottom) { CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:(CGSize){10.0, 10.0}].CGPath; self.layer.mask = maskLayer; } } 

    С быстрым 3.0 ниже работала для меня

     let maskLayer = CAShapeLayer() maskLayer.path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath (imageView.)layer.mask = maskLayer 

    Важно: убедитесь, что это «layoutSubviews» не «awakeFromNib» (если вы используете TableViewCell) или аналогичные для UIView, или только верхний левый угол округляется!

    Расширение для UIView, которое округляет выбранные углы (Swift 4):

     extension UIView { /// Round UIView selected corners /// /// - Parameters: /// - corners: selected corners to round /// - radius: round amount func roundCorners(_ corners: UIRectCorner, radius: CGFloat) { let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) let mask = CAShapeLayer() mask.path = path.cgPath self.layer.mask = mask } } 

    пример:

     ratingView.roundCorners([.topLeft, .topRight, .bottomRight], radius: 6) 
      CAShapeLayer * maskLayer = [CAShapeLayer layer]; maskLayer.path = [UIBezierPath bezierPathWithRoundedRect: registerbtn.bounds byRoundingCorners: UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii: (CGSize){9.0, 12.0}].CGPath; registerbtn.layer.mask = maskLayer; 

    это сделает только один округленный округленный

    Прямым способом сделать это было бы определение пути в нужной форме и заполнение его любым цветом, который вы хотите использовать для фона. Для этого вы можете использовать UIBezierPath или CGPath . Например, с помощью CGPath вы можете построить путь, используя такие методы, как CGMoveToPoint() , CGAddLineToPoint() и CGAddArc() . Затем вы заполните его CGContextFillPath() . Взгляните на Кварцевое 2D-руководство по программированию для полного обсуждения.

    Другим способом было бы добавить subview с закругленными углами (вы можете установить свойство cornerRadius слоя subview), но пусть одна сторона подвью будет обрезана родительским представлением.

    Третий способ – добавить фоновое изображение с желаемой формой. Вы можете сделать углы прозрачными и сделать фон представления прозрачным, и вы получите желаемый эффект. Однако это не так хорошо работает для изменения размера.

    Где вы застреваете?

    Interesting Posts

    Как открыть определенный порт, такой как 9090 в Google Compute Engine

    Java, «Имя переменной» не может быть разрешено переменной

    Понимание передовых типов гнезд ZeroMQ

    В чем разница между «отображаемым именем пакета» и «именем пакета» в информационном plist приложения cocoa

    Данные пользователя Chrome: где, помимо библиотеки, может быть?

    В чем разница между атомарным и критическим в OpenMP?

    Android – LinearLayout Горизонтальная с обертыванием детей

    Проверьте, содержит ли список любой другой список

    Изменение цвета navbar в Twitter Загрузочный

    Для чего предназначен регистр «FS» / «GS»?

    Как выполнить файл dex в android с помощью команды?

    Как добавить аргументы командной строки (параметры) для закрепленных приложений в Windows 7?

    Как отсортировать список адресов Ip с помощью c #

    Правильный спецификатор формата для печати указателя (адреса)?

    Могу ли я запустить Linux на планшет Android?

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