Як встановити cornerRadius лише для верхнього лівого та верхнього правого кутів UIView?


408

Чи є спосіб встановити cornerRadiusлише верхній лівий і верхній правий кут UIView?

Я спробував наступне, але в кінцевому підсумку більше не бачив виду.

UIView *view = [[UIView alloc] initWithFrame:frame];

CALayer *layer = [CALayer layer];
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRoundedRect:frame byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight) cornerRadii:CGSizeMake(3.0, 3.0)];
layer.shadowPath = shadowPath.CGPath;
view.layer.mask = layer;

9
Після редагування слід виправити три речі: (1) округлий шлях повинен базуватися на view.bounds, а не frame, (2) шар повинен бути a CAShapeLayer, not CALayer; (3) встановити шар path, а не shadowPath.
Курт Ревіс

1
Можливий дублікат цього питання та відповіді .
Стюарт

Використовуйте алгоритм кривої Безьє, щоб створити криві на CGPath. Я впевнений, що це частина CoreGraphics. Якщо ні, en.wikipedia.org/wiki/Bézier_curve має чудові визначення та анімацію.
Нейт Симер


Дивіться моя відповідь тут: stackoverflow.com/a/50396485/6246128
wcarhart

Відповіді:


224

Зверніть увагу на те, що якщо до вас додаються обмеження для макета, ви повинні оновити це у наступному підкласі UIView:

override func layoutSubviews() {
    super.layoutSubviews()
    roundCorners(corners: [.topLeft, .topRight], radius: 3.0)
}

Якщо ви цього не зробите, він не з’явиться.


А для круглих кутів використовуйте розширення:

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

3
Це абсолютно не відповідь, автор запитував, як округлити окремі кути, а не як синхронізувати радіус кута зі змінами макета.
келін

1
Ця відповідь не має сенсу.
Тіаго Куто

1
відповідь була зафіксована недавно .. @kelin
Michael

2
це, безумовно, закругло кут.
aznelite89

Ви повинні це зробити після того, як з'явився погляд
Джонатан.

535

Я не впевнений, чому ваше рішення не спрацювало, але наступний код працює для мене. Створіть маску Безьє та застосуйте її до свого подання. У моєму коді нижче я округляв нижній кут _backgroundViewіз радіусом 3 пікселів. selfце звичай UITableViewCell:

UIBezierPath *maskPath = [UIBezierPath
    bezierPathWithRoundedRect:self.backgroundImageView.bounds
    byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight)
    cornerRadii:CGSizeMake(20, 20)
];

CAShapeLayer *maskLayer = [CAShapeLayer layer];

maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;

self.backgroundImageView.layer.mask = maskLayer;

Швидка версія з деякими вдосконаленнями:

let path = UIBezierPath(roundedRect:viewToRound.bounds, byRoundingCorners:[.TopRight, .BottomLeft], cornerRadii: CGSizeMake(20, 20))
let maskLayer = CAShapeLayer()

maskLayer.path = path.CGPath
viewToRound.layer.mask = maskLayer

Версія Swift 3.0:

let path = UIBezierPath(roundedRect:viewToRound.bounds,
                        byRoundingCorners:[.topRight, .bottomLeft],
                        cornerRadii: CGSize(width: 20, height:  20))

let maskLayer = CAShapeLayer()

maskLayer.path = path.cgPath
viewToRound.layer.mask = maskLayer

Швидке розширення тут


2
спробуйте в текстовому полі. успіх зліва, невдача праворуч
Райнер Ліао

10
@RainerLiao У мене була така ж проблема, я все це робив на viewDidLoadметоді, перемістив його viewDidAppearі він працював.
Лучо

як я можу налаштувати це на будь-який пристрій. це добре працює лише для simulatorрозміру в розміщенні розкадровки. ex: if the simulator size is 6s it works fine for 6s, but not of others.як я можу це подолати.
Чанака Кальдера

1
Маленька синтаксична помилка у версії Swift 3: path.CGPathповинна бутиpath.cgPath
Роб

@RainerLiao, якщо ви не хочете, щоб він блимав у міру перегляду, замініть його viewWillAppear. Це також працює.
Метью Кніппен

263

Ось Swift версія відповіді @JohnnyRockex

extension UIView {

    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
    }

}

view.roundCorners([.topLeft, .bottomRight], radius: 10)

Примітка

Якщо ви використовуєте автоматичний макет , для оптимального ефекту вам потрібно буде підкласифікувати свій клас UIViewта зателефонувати roundCornersу подання layoutSubviews.

class View: UIView {
    override func layoutSubviews() {
        super.layoutSubviews()

        self.roundCorners([.topLeft, .bottomLeft], radius: 10)
    }
}

12
Велике розширення. Однак: .TopRightі .BottomRight, здається, не працює на мене.
Оничан

4
on Swift 2 :view.roundCorners([.TopLeft , .BottomLeft], radius: 10)
fahrulazmi

2
Праворуч не працює, тому що межі вашого перегляду ще не добре визначені з автоматичним розгортанням ... На даний момент я стикаюся з тією ж проблемою.
досдос

3
@dosdos Підклас, що переглядає та в layoutSubviews кругляє кути самості.
Арбітур

10
Якщо ви використовуєте автоматичний макет і не маєте посилання на представлення, яке хочете округлити, ви можете зателефонувати .layoutIfNeeded(), тоді цей спосіб.
zgjie

209

І нарешті… є CACornerMask в iOS11! З CACornerMaskцим можна зробити досить просто:

let view = UIView()
view.clipsToBounds = true
view.layer.cornerRadius = 10
view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] // Top right corner, Top left corner respectively

1
це, безумовно, найкраще працює. у нас завжди були проблеми з іншими рішеннями, коли округляли краї динамічно розмірів осередків таблиці.
cornr

2
Для використання цього рішення проект повинен підтримувати iOS 11 і далі.
Інопланетяни

13
@Aliens і ... я це згадав.
Сергій Білоус

1
Інші відповіді не спрацьовують при обертанні пристрою, цей код працює для обертання і дозволяє округляти певні кути, це має бути прийнятою відповіддю.
Cloud9999Strife

1
Simple is beautiful
eharo2

99

Приклад швидкого коду тут: https://stackoverflow.com/a/35621736/308315


Не безпосередньо. Вам доведеться:

  1. Створити CAShapeLayer
  2. Встановіть його pathна CGPathRefоснові, view.boundsале лише з двома закругленими кутами (можливо, використовуючи +[UIBezierPath bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:])
  3. Встановіть свій view.layer.maskбутиCAShapeLayer

21
Попереджуйте, що це зашкодить виставі, якщо ви будете робити це лише на декількох переглядах ...
jjxtra

@jjxtra Отже, який найкращий спосіб зробити це без особливих втрат продуктивності? Я хочу показати це в UITableViewCell.
xi.lin

@ xi.lin з того, що я пам'ятаю, встановивши layer.shouldRasterize == ТАК покращує швидкість у 5 разів або близько того. Але документи говорять, що це працює лише в тому випадку, якщо ви працюєте з непрозорими клітинками. Дай постріл.
codrut

64

Ось короткий метод, реалізований так:

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *openInMaps = [UIButton new];
    [openInMaps setFrame:CGRectMake(15, 135, 114, 70)];
    openInMaps = (UIButton *)[self roundCornersOnView:openInMaps onTopLeft:NO topRight:NO bottomLeft:YES bottomRight:NO radius:5.0];
}

- (UIView *)roundCornersOnView:(UIView *)view onTopLeft:(BOOL)tl topRight:(BOOL)tr bottomLeft:(BOOL)bl bottomRight:(BOOL)br radius:(float)radius {

    if (tl || tr || bl || br) {
        UIRectCorner corner = 0;
        if (tl) {corner = corner | UIRectCornerTopLeft;}
        if (tr) {corner = corner | UIRectCornerTopRight;}
        if (bl) {corner = corner | UIRectCornerBottomLeft;}
        if (br) {corner = corner | UIRectCornerBottomRight;}

        UIView *roundedView = view;
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:roundedView.bounds byRoundingCorners:corner cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        maskLayer.frame = roundedView.bounds;
        maskLayer.path = maskPath.CGPath;
        roundedView.layer.mask = maskLayer;
        return roundedView;
    }
    return view;
}

Що з налаштування кольору? maskLayer.borderWidth = 10; maskLayer.borderColor = [UIColor redColor] .CGColor; це не працює для мене, сер.
кіран

1
@kiran маска не має кольору, ви можете додати другий CAShapeLayer, якщо хочете мати кордон
Johnny Rockex

25

У швидкому 4.1 та Xcode 9.4.1

В iOS 11 цього єдиного рядка достатньо:

detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]//Set your view here

Дивіться повний код:

//In viewDidLoad
if #available(iOS 11.0, *){
        detailsSubView.clipsToBounds = false
        detailsSubView.layer.cornerRadius = 10
        detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
} else {
      //For lower versions
}

Але для нижчих версій

let rectShape = CAShapeLayer()
    rectShape.bounds = detailsSubView.frame
    rectShape.position = detailsSubView.center
    rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    detailsSubView.layer.mask = rectShape

Повний код є.

if #available(iOS 11.0, *){
    detailsSubView.clipsToBounds = false
    detailsSubView.layer.cornerRadius = 10
    detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
}else{
    let rectShape = CAShapeLayer()
    rectShape.bounds = detailsSubView.frame
    rectShape.position = detailsSubView.center
    rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
    detailsSubView.layer.mask = rectShape
}

Якщо ви використовуєте AutoResizing у дошці розкадрування, напишіть цей код у viewDidLayoutSubviews () .

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if #available(iOS 11.0, *){
        detailsSubView.clipsToBounds = false
        detailsSubView.layer.cornerRadius = 10
        detailsSubView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
    }else{
        let rectShape = CAShapeLayer()
        rectShape.bounds = detailsSubView.frame
        rectShape.position = detailsSubView.center
        rectShape.path = UIBezierPath(roundedRect: detailsSubView.bounds,    byRoundingCorners: [.topLeft , .topRight], cornerRadii: CGSize(width: 20, height: 20)).cgPath
        detailsSubView.layer.mask = rectShape
    }
}

1
Це не робота iOS 9, але працює 11
Алі Іхсан URAL

Будь-яке рішення для ios 9?
Jey

@jay нехай rectShape = CAShapeLayer () rectShape.bounds = detailsSubView.frame rectShape.position = detailsSubView.center rectShape.path = UIBezierPath (roundedRect: detailsSubView.bounds, byRoundingCorners: [.topRightingCorners: [.topRighting, Corners:,. CgPath detailsSubView.layer.mask = rectShape Цей код може працювати для iOS 9
iOS

@jay перевірити, чи не повідомляйте мене
iOS

Не працює для ios 9. Її немає кордону на кутовій частині.
Jey

24

iOS 11, Swift 4.
Ви можете спробувати цей код:

if #available(iOS 11.0, *) {
   element.clipsToBounds = true
   element.layer.cornerRadius = CORNER_RADIUS
   element.layer.maskedCorners = [.layerMaxXMaxYCorner]
} else {
   // Fallback on earlier versions
}

І ви можете використовувати це в комірці перегляду таблиці.


1
це правильна відповідь на сьогоднішнє кодування. до побачення, щоб замаскувати шар.
Ален Лян

1
Це має бути найкращою відповіддю!
fujianjin6471

18

Це була б найпростіша відповідь:

yourView.layer.cornerRadius = 8
yourView.layer.masksToBounds = true
yourView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]

Тег, що це рішення для iOS 11 або вище
Ankur Lahiry

16

Спробуйте цей код,

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:( UIRectCornerTopLeft | UIRectCornerTopRight) cornerRadii:CGSizeMake(5.0, 5.0)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = self.view.bounds;
maskLayer.path  = maskPath.CGPath;

view.layer.mask = maskLayer;

15

Емма: .TopRightі .BottomRightне працюють для вас, можливо, тому, що виклик view.roundCornersвиконується ДО ПЕРШОГО фіналу view bounds. Зауважте, що Bezier Pathпоходження виходить за межі перегляду в момент його виклику. Наприклад, якщо автоматична компонування звузить вигляд, круглі кути праворуч можуть бути поза вікном перегляду. Спробуйте зателефонувати viewDidLayoutSubviews, де обмеження перегляду остаточне.


Дякую. Для мене те, що вирішило проблему, було переміщенням дзвінка до реалізації, наданої "Arbitur" з viewDidLoad та viewWillAppear до viewDidAppear. Я міг би це зробити, оскільки мій контроль спочатку встановлений на прихований.
Матті

Ти правий. Це створить проблему з автоматичним розкладом, і ви зробили гарну роботу.
Ashish Kakkad

15

Swift 4 Swift 5 простий шлях в 1 рядок

Використання:

//MARK:- Corner Radius of only two side of UIViews
self.roundCorners(view: yourview, corners: [.bottomLeft, .topRight], radius: 12.0)

Функція:

//MARK:- Corner Radius of only two side of UIViews
func roundCorners(view :UIView, corners: UIRectCorner, radius: CGFloat){
        let path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        view.layer.mask = mask
}

В Objective-C

Використання:

[self.verticalSeparatorView roundCorners:UIRectCornerTopLeft radius:10.0];

Функція, що використовується в категорії (лише один кут):

-(void)roundCorners: (UIRectCorner) corners radius:(CGFloat)radius {
        UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
        CAShapeLayer *mask = [[CAShapeLayer alloc] init];
        mask.path = path.CGPath;
        self.layer.mask = mask;
    }

Пам'ятайте лише, що кути вашої точки зору не обчислюються до тих пір, поки не буде виконано viewDidLayoutSubviews, тож вам слід зателефонувати в функцію roundCorners
Jirson Tavera

Ви можете сказати, як я можу додати тінь до цих поглядів?
Вадлапаллі Мастхан

@ShakeelAhmed це не спрацює, якщо ви хочете додати тінь до перегляду.
mojtaba al moussawi

спочатку додайте радіус кута, а потім додайте тінь
Shakeel Ahmed

10

Моє рішення для округлення конкретних кутів UIView та UITextFiels у швидкому використанні

.layer.cornerRadius

і

layer.maskedCorners

фактичних полів UIView або UITextFields.

Приклад:

fileprivate func inputTextFieldStyle() {
        inputTextField.layer.masksToBounds = true
        inputTextField.layer.borderWidth = 1
        inputTextField.layer.cornerRadius = 25
        inputTextField.layer.maskedCorners = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner]
        inputTextField.layer.borderColor = UIColor.white.cgColor
    }

І за допомогою

.layerMaxXMaxYCorner

і

.layerMaxXMinYCorner

, Я можу вказати верхній правий і нижній правий кут поля UITextField, яке слід округлювати.

Ви можете побачити результат тут:

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


Ідеально підходить для поєднання кордонів та конкретних кутів nom
nomnom

8

Швидкий 4

extension UIView {

    func roundTop(radius:CGFloat = 5){
        self.clipsToBounds = true
        self.layer.cornerRadius = radius
        if #available(iOS 11.0, *) {
            self.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
        } else {
            // Fallback on earlier versions
        }
    }

    func roundBottom(radius:CGFloat = 5){
        self.clipsToBounds = true
        self.layer.cornerRadius = radius
        if #available(iOS 11.0, *) {
            self.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner]
        } else {
            // Fallback on earlier versions
        }
    }
}

Ви врятували мій день у моєму випадку, я повинен був зробити подання таблиці округленим для конкретних комірок
Шакти

Ідеально підходить під мою вимогу. Я використав усю відповідь, нічого не працювало на мене, але ваша відповідь допомогла мені і вирішила мою проблему.
Микита Патіл

6

Спосіб зробити це програмно - створити UIViewверхню частину тієї, UIViewщо має закруглені кути. Або ви могли ховати верх під чимсь.


6
Це дуже потворне рішення: П
Арбітур

6
    // Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds 
                           byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight) 
                           cornerRadii:CGSizeMake(7.0, 7.0)];

// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = cell.stripBlackImnageView.bounds;
maskLayer.path = maskPath.CGPath; 
// Set the newly created shapelayer as the mask for the image view's layer
view.layer.mask = maskLayer;

4

Найпростішим способом було б зробити маску із закругленим кутовим шаром.

CALayer *maskLayer = [CALayer layer];
maskLayer.frame = CGRectMake(0,0,maskWidth ,maskHeight);
maskLayer.contents = (__bridge id)[[UIImage imageNamed:@"maskImageWithRoundedCorners.png"] CGImage];

aUIView.layer.mask = maskLayer;

І не забудьте:

#import <QuartzCore/QuartzCore.h>

4

Усі наведені відповіді дійсно хороші та справедливі (особливо ідея Юнуса про використання цього maskмайна).

Однак мені було потрібно щось трохи складніше, тому що мій шар часто міняв розміри, а це означає, що мені потрібно викликати цю маскувальну логіку кожен раз, і це було трохи дратує.

Я використовував швидкі extensionsта обчислювані властивості, щоб створити реальну cornerRadiiвластивість, яка піклується про автоматичне оновлення маски, коли шар викладається.

Цього вдалося досягти, використовуючи великі аспекти Пітера Штейнберга бібліотеки « для шипучих хит.

Повний код тут:

extension CALayer {
  // This will hold the keys for the runtime property associations
  private struct AssociationKey {
    static var CornerRect:Int8 = 1    // for the UIRectCorner argument
    static var CornerRadius:Int8 = 2  // for the radius argument
  }

  // new computed property on CALayer
  // You send the corners you want to round (ex. [.TopLeft, .BottomLeft])
  // and the radius at which you want the corners to be round
  var cornerRadii:(corners: UIRectCorner, radius:CGFloat) {
    get {
      let number = objc_getAssociatedObject(self, &AssociationKey.CornerRect)  as? NSNumber ?? 0
      let radius = objc_getAssociatedObject(self, &AssociationKey.CornerRadius)  as? NSNumber ?? 0
      return (corners: UIRectCorner(rawValue: number.unsignedLongValue), radius: CGFloat(radius.floatValue))
    }
    set (v) {
      let radius = v.radius
      let closure:((Void)->Void) = {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: v.corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.CGPath
        self.mask = mask
      }
      let block: @convention(block) Void -> Void = closure
      let objectBlock = unsafeBitCast(block, AnyObject.self)
      objc_setAssociatedObject(self, &AssociationKey.CornerRect, NSNumber(unsignedLong: v.corners.rawValue), .OBJC_ASSOCIATION_RETAIN)
      objc_setAssociatedObject(self, &AssociationKey.CornerRadius, NSNumber(float: Float(v.radius)), .OBJC_ASSOCIATION_RETAIN)
      do { try aspect_hookSelector("layoutSublayers", withOptions: .PositionAfter, usingBlock: objectBlock) }
      catch _ { }
    }
  }
}

Я написав простий пост у блозі, пояснюючи це.



2

Ось як можна встановити радіус кута для кожного кута кнопки за допомогою Xamarin у C # :

var maskPath = UIBezierPath.FromRoundedRect(MyButton.Bounds, UIRectCorner.BottomLeft | UIRectCorner.BottomRight,
    new CGSize(10.0, 10.0));
var maskLayer = new CAShapeLayer
{
    Frame = MyButton.Bounds,
    Path = maskPath.CGPath
};
MyButton.Layer.Mask = maskLayer;

2

Прекрасне розширення для повторного використання рішення Yunus Nedim Mehel

Швидкий 2.3

extension UIView {
func roundCornersWithLayerMask(cornerRadii: CGFloat, corners: UIRectCorner) {
    let path = UIBezierPath(roundedRect: bounds,
                            byRoundingCorners: corners,
                            cornerRadii: CGSize(width: cornerRadii, height: cornerRadii))
    let maskLayer = CAShapeLayer()
    maskLayer.path = path.CGPath
    layer.mask = maskLayer
} }

Використання

let view = UIView()
view.roundCornersWithLayerMask(10,[.TopLeft,.TopRight])

Приємне чисте рішення
Агресор

1

Після зміни біту коду @apinho In swift 4.3 працює добре

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

Щоб використовувати цю функцію для перегляду

YourViewName. roundCornersWithLayerMask(cornerRadii: 20,corners: [.topLeft,.topRight])

0

Ще одна версія відповіді Стефана .

import UIKit

    class RoundCornerView: UIView {
    var corners : UIRectCorner = [.topLeft,.topRight,.bottomLeft,.bottomRight]
        var roundCornerRadius : CGFloat = 0.0
        override func layoutSubviews() {
            super.layoutSubviews()
            if corners.rawValue > 0 && roundCornerRadius > 0.0 {
                self.roundCorners(corners: corners, radius: roundCornerRadius)
            }
        }
        private func roundCorners(corners: UIRectCorner, radius: CGFloat) {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }

    }

0

У Swift 4.2 створіть його @IBDesignableтак:

@IBDesignable

class DesignableViewCustomCorner: UIView {

    @IBInspectable var cornerRadious: CGFloat = 0 {
        didSet {
            let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: cornerRadious, height: cornerRadious))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            self.layer.mask = mask
        }
    }

}

0

Просте розширення

extension UIView {
    func roundCorners(corners: UIRectCorner, radius: CGFloat) {
        if #available(iOS 11, *) {
            self.clipsToBounds = true
            self.layer.cornerRadius = radius
            var masked = CACornerMask()
            if corners.contains(.topLeft) { masked.insert(.layerMinXMinYCorner) }
            if corners.contains(.topRight) { masked.insert(.layerMaxXMinYCorner) }
            if corners.contains(.bottomLeft) { masked.insert(.layerMinXMaxYCorner) }
            if corners.contains(.bottomRight) { masked.insert(.layerMaxXMaxYCorner) }
            self.layer.maskedCorners = masked
        }
        else {
            let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
            let mask = CAShapeLayer()
            mask.path = path.cgPath
            layer.mask = mask
        }
    }
}

Використання:

view.roundCorners(corners: [.bottomLeft, .bottomRight], radius: 12)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.