Bir UIView'in yalnızca sol üst ve sağ üst köşesi için cornerRadius nasıl ayarlanır?


408

A'nın cornerRadiusyalnızca sol üst ve sağ üst köşesi için ayar yapmanın bir yolu var mı UIView?

Aşağıdakileri denedim, ancak artık görünümü görmüyor.

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
Düzenlemenizden sonra, düzeltilmesi gereken üç şey: (1) yuvarlak yol temel alınmalıdır view.bounds, değil frame, (2) katman a CAShapeLayerdeğil, olmalıdır CALayer; (3) katmanı pathdeğil, ayarlayın shadowPath.
Kurt Revis

1
Bu soru ve cevabın olası kopyası .
Stuart

Bir CGPath'de eğriler oluşturmak için Bezier eğrisi algoritmasını kullanın. CoreGraphics'in bir parçası olduğuna eminim. Değilse, en.wikipedia.org/wiki/Bézier_curve bazı harika tanımlara ve animasyonlara sahiptir.
Nate Symer


Cevabımı buradan görebilirsiniz: stackoverflow.com/a/50396485/6246128
wcarhart

Yanıtlar:


225

Ekli düzen kısıtlamalarınız varsa, bunu UIView alt sınıfınızda aşağıdaki gibi yenilemeniz gerektiğine dikkat edin:

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

Bunu yapmazsanız görünmez.


Köşeleri yuvarlamak için uzantıyı kullanın:

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
Bu kesinlikle bir cevap değil, yazar belirli köşelerin nasıl yuvarlanacağını, köşe yarıçapının düzen değişiklikleriyle nasıl senkronize edileceğini soruyordu.
kelin

1
Bu cevap mantıklı değil.
Tiago Couto

1
cevap geçenlerde düzeltildi .. @kelin
Michael

2
Bu kesinlikle köşeyi yuvarladı.
aznelite89

Bunu, görünüm ortaya çıktıktan sonra yapmalısınız
Jonathan.

535

Çözümünüzün neden işe yaramadığından emin değilim ama aşağıdaki kod benim için çalışıyor. Bir bezier maskesi oluşturun ve görünümünüze uygulayın. Aşağıdaki kodumda _backgroundView3 piksel yarıçapı ile alt köşelerini yuvarladım . selfbir özel 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;

Bazı geliştirmelerle birlikte hızlı sürüm:

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 sürümü:

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

Burada Swift uzantısı


2
metin alanında deneyin. solda başarı, sağda başarısızlık
Rainer Liao

10
@RainerLiao ben aynı sorunu vardı, tüm viewDidLoadyöntem üzerinde yaptım , taşımak viewDidAppearve işe yaradı.
Lucho

bunu herhangi bir cihazda çalışacak şekilde nasıl ayarlayabilirim. bu sadece simulatorfilm şeridi boyutu için iyi çalışır . ex: if the simulator size is 6s it works fine for 6s, but not of others.bunun üstesinden nasıl gelebilirim.
Chanaka Caldera

1
Swift 3 sürümünde küçük sözdizimi hatası: path.CGPatholmalıpath.cgPath
Rob

@RainerLiao, görünüm göründüğünde titremesini istemiyorsanız bunun viewWillAppearyerine değiştirin . Bu da işe yarıyor.
Matthew Knippen

263

İşte @JohnnyRockex cevap Swift sürümü

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)

Not

Otomatik Mizanpaj kullanıyorsanız , en iyi etki için alt sınıfınızı oluşturmanız ve görünümün UIViewçağrılması gerekir .roundCornerslayoutSubviews

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

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

12
Büyük uzatma. Ancak: .TopRightve .BottomRightbenim için çalışmıyor gibi görünüyor.
Onichan

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

2
Sağda çalışmıyor, çünkü görünümünüzün sınırları otomatik düzenleme ile henüz iyi tanımlanmadı ... Şu anda aynı sorunla karşı karşıyayım.
dosdos

3
@dosdos Görüntüleyen ve mizanpajlı alt sınıflar
Arbitur

10
Otomatik mizanpaj kullanıyorsanız ve görünüme başvuru yapmak istemiyorsanız .layoutIfNeeded(), bu yöntemi çağırabilirsiniz .
zgjie

209

Ve son olarak… iOS11'de CACornerMask var! Bununla CACornerMaskoldukça kolay yapılabilir:

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

1
bu kesinlikle en iyi sonucu verir. dinamik olarak boyutlandırma tableview hücrelerinin kenarlarını yuvarlarken her zaman diğer çözümlerle ilgili sorunlar yaşadık.
cornr

2
Project'in bu çözümü kullanabilmesi için iOS 11 ve sonrasında desteklenmesi gerekir.
Uzaylılar

13
@Aliens ve… Bundan bahsettim.
Sergey Belous

1
Diğer cevaplar cihazı döndürürken çalışmaz, bu kod dönüş için çalışır ve belirli köşeleri yuvarlamanızı sağlar, bu kabul edilen cevap olmalıdır.
Cloud9999Strife

1
Simple is beautiful
eharo2

99

Swift kodu örneği burada: https://stackoverflow.com/a/35621736/308315


Dolaylı. Yapmanız gerekenler:

  1. Oluşturmak CAShapeLayer
  2. Kendi kümesi patholmak için bir CGPathRefdayanmaktadır view.boundsama sadece iki köşeleri yuvarlatılmış (muhtemelen kullanarak +[UIBezierPath bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:])
  3. Setinizi view.layer.maskolmakCAShapeLayer

21
Sadece birkaç
görünümden

@jjxtra Pek çok performans kaybı olmadan bunu yapmanın en iyi yolu nedir? UITableViewCell'de göstermek istiyorum.
xi.lin

@ xi.lin, layer.shouldRasterize == YES ayarını hatırladığımdan 5 kat daha hızlı geliştirir. Ancak dokümanlar, yalnızca saydam olmayan hücrelerle çalıştığınızda işe yaradığını söylüyor. Bi dene.
codrut

64

İşte böyle uygulanan kısa bir yöntem:

- (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;
}

Renk ayarlamaya ne dersiniz? maskLayer.borderWidth = 10; maskLayer.borderColor = [UIColor kırmızıColor] .CGColor; benim için çalışmıyor efendim.
kiran

1
@kiran bir maskenin rengi yok, kenarlık istiyorsanız ikinci bir CAShapeLayer ekleyebilirsiniz
Johnny Rockex

25

Hızlı 4.1 ve Xcode 9.4.1'de

Gelen iOS 11 bu tek satır yeterlidir:

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

Kodun tamamını inceleyin:

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

Ancak daha düşük sürümler için

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

Tam kod.

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
}

Film şeridinde Otomatik Yeniden Boyutlandırmayı kullanıyorsanız bu kodu viewDidLayoutSubviews () öğesine yazın .

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
İOS 9 çalışmıyor ancak 11
Ali Ihsan URAL

İOS 9 için herhangi bir çözüm var mı?
jey

@jay let rectShape = CAShapeLayer () rectShape.bounds = detailsSubView.frame rectShape.position = detailsSubView.center rectShape.path = UIBezierPath (roundRect: ayrıntılarSubView.frame rectShape.position = detailsSubView.center rectShape.path = UIBezierPath (roundedRect: detailsSubView.bounds, byRoundingCorners: [.topLeft, .Right: .adRad; köşe genişliği, köşe genişliği]. 20, yükseklik: 20)). CgPath detailsSubView.layer.mask = rectShape Bu kod iOS 9 için kullanılabilir
iOS

@jay beni bilgilendirmezse kontrol et
iOS

İOS için çalışmıyor 9. Köşe kısmında sınır yoktur.
jey

24

iOS 11, Swift 4
Ve bu kodu deneyebilirsiniz:

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

Ve bunu tablo görünümü hücresinde kullanabilirsiniz.


1
günümüz kodlaması için doğru cevap budur. güle güle maske katmanı.
Alen Liang

1
Bu en iyi cevap olmalı!
fujianjin6471

18

Bu en basit cevap olacaktır:

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

iOS 11 veya üzeri için çözüm olduğunu
anlayın

16

Bu kodu deneyin,

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

Emma: .TopRightve .BottomRightçağrı çünkü belki sizin için çalışmıyor view.roundCornersÖNCE nihai yapılır view boundshesaplanır. Not Bezier Pathanda görünümü sınırları türetilmiştir denir. Örneğin, otomatik düzen görünümü daraltırsa, sağ taraftaki yuvarlak köşeler görünümün dışında olabilir. viewDidLayoutSubviewsGörünümün sınırının son olduğu yeri aramayı deneyin .


Teşekkür ederim. Benim için sorunu çözen, çağrıyı "Arbitur" tarafından verilen uygulamaya viewDidLoad ve viewWillAppear'dan viewDidAppear'a taşımaktı. Kontrolüm başlangıçta gizli olarak ayarlandığından bunu yapabilirim.
Matti

Haklısın. Autolayout ile ilgili sorun yaratacak ve iyi bir iş çıkardınız.
Ashish Kakkad

15

Hızlı 4 hızlı 5 1 satırda kolay yol

Kullanımı:

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

İşlev:

//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
}

Hedef-C'de

Kullanımı:

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

Bir Kategoride kullanılan işlev (yalnızca bir köşe):

-(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;
    }

Sadece görünümünüzün köşelerinin viewDidLayoutSubviews tamamlanana kadar hesaplanmadığını unutmayın, bu nedenle içindeki
roundCorners işlevini çağırmalısınız

bu görünümlere nasıl gölge ekleyebilirim?
Vadlapalli Masthan

@ShakeelAhmed, görünüme bir gölge eklemek istiyorsanız bu çalışmaz.
mojtaba al moussawi

önce köşe yarıçapını ekleyin ve sonra gölge ekleyin
Shakeel Ahmed

10

UIView ve UITextFiels'in belirli köşelerini hızlı bir şekilde yuvarlamak için çözümüm

.layer.cornerRadius

ve

layer.maskedCorners

gerçek UIView veya UITextField öğelerinin.

Misal:

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
    }

Ve kullanarak

.layerMaxXMaxYCorner

ve

.layerMaxXMinYCorner

, Yuvarlanacak UITextField sağ üst ve sağ alt köşesini belirtebilirsiniz.

Sonucu burada görebilirsiniz:

resim açıklamasını buraya girin


Sınır ve belirli köşeler kombinasyonu için mükemmel 🎉🎉🎉
nomnom

8

Hızlı 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
        }
    }
}

Benim durumumda günümü kurtardın, tablo görünümünü belirli hücreler için yuvarlak yapmak zorunda kaldım
Shakti

Benim ihtiyacına göre mükemmel ans. Tüm cevabı kullandım, hiçbir şey benim için işe yaramadı, ama cevabın bana yardımcı oldu ve sorunumu çözdü.
Nikita Patil

6

Bunu programlı olarak yapmanın bir yolu, köşeleri yuvarlatılmış UIViewolan üst kısmının üzerinde bir bölüm oluşturmaktır UIView. Ya da üstünü bir şeyin altına saklayabilirsiniz.


6
Çok çirkin bir çözüm: P
Arbitur

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

En kolay yol, yuvarlak bir köşe tabakasına sahip bir maske yapmaktır.

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

aUIView.layer.mask = maskLayer;

Ve unutmayın:

#import <QuartzCore/QuartzCore.h>

4

Verilmiş olan tüm cevaplar gerçekten çok iyi ve geçerli (özellikle Yunus'u mask mülkü ).

Ancak biraz daha karmaşık bir şeye ihtiyacım vardı çünkü katmanım genellikle boyutları değiştirebilir, bu da her seferinde bu maskeleme mantığını çağırmam gerektiği anlamına geliyordu ve bu biraz can sıkıcıydı.

extensionsGerçek bir inşa etmek için hızlı ve hesaplanmış özellikler kullandımcornerRadiiKatman yerleştirildiğinde maskeyi otomatik olarak güncellemeye özen gösteren özellik .

Bu Peter Steinberg büyük yönleri kullanılarak elde edildi kütüphanesi ile dolaşma için elde edildi.

Tam kod burada:

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 _ { }
    }
  }
}

Bunu açıklayan basit bir blog yazısı yazdım .



2

C # ' da Xamarin ile bir düğmenin her köşesi için bir köşe yarıçapını şu şekilde ayarlayabilirsiniz :

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 çözümünü yeniden kullanmak için hoş bir eklenti

Hızlı 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
} }

kullanım

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

Güzel temiz çözüm
Saldırgan

1

@Apinho kod bitini değiştirdikten sonra Hızlı 4.3'te iyi çalışıyor

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
  }
}

Bu işlevi görüntülemeniz için kullanmak için

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

0

Stephane'nin cevabının başka bir versiyonu .

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'de şu şekilde oluşturun @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

Basit eklenti

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
        }
    }
}

Kullanımı:

view.roundCorners(corners: [.bottomLeft, .bottomRight], radius: 12)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.