UIView의 왼쪽 상단과 오른쪽 상단에만 cornerRadius를 설정하는 방법은 무엇입니까?


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) 레이어는을 기준으로 CAShapeLayer하지 말고 CALayer; (3)의 층을 설정 path하지 shadowPath.
Kurt Revis

1
질문답변 의 가능한 사본 .
스튜어트

베 지어 곡선 알고리즘을 사용하여 CGPath에 곡선을 만듭니다. CoreGraphics의 일부라고 확신합니다. 그렇지 않다면 en.wikipedia.org/wiki/Bézier_curve 에는 훌륭한 정의와 애니메이션이 있습니다.
Nate Symer


답변:


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
그것은 절대 대답이 아닙니다. 작가는 모서리 변경을 레이아웃 변경과 동기화하는 방법이 아니라 특정 모서리를 둥글게하는 방법을 묻고있었습니다.
kelin

1
이것은 대답이 의미가 없습니다.
Tiago Couto

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;

몇 가지 개선 된 Swift 버전 :

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

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

스위프트 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
텍스트 필드에서 시도하십시오. 왼쪽에서 성공, 오른쪽에서 실패
Rainer Liao

10
@RainerLiao 나는 똑같은 문제를 겪었다. 나는이 viewDidLoad방법을 모두 viewDidAppear수행했다.
Lucho

모든 장치에서 작동하도록 어떻게 설정할 수 있습니까? simulator스토리 보드 의 크기에 대해서만 작동합니다 . ex: if the simulator size is 6s it works fine for 6s, but not of others.어떻게 이걸 극복 할 수 있을까요?
Chanaka Caldera

1
Swift 3 버전의 작은 구문 오류 : path.CGPath 이어야한다path.cgPath

@RainerLiao보기가 나타날 때 화면이 튕겨지는 것을 원하지 않으면 viewWillAppear대신 변경하십시오 . 이것은 또한 작동합니다.
Matthew Knippen

263

다음은 @JohnnyRockex 답변 의 Swift 버전입니다.

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호출 해야 합니다.roundCornerslayoutSubviews

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

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

12
훌륭한 확장. 그러나 : .TopRight그리고 .BottomRight나를 위해 작동하지 않는 것 같습니다.
Onichan

4
스위프트 2 :view.roundCorners([.TopLeft , .BottomLeft], radius: 10)
fahrulazmi

2
뷰의 경계가 아직 자동 레이아웃으로 잘 정의되어 있지 않기 때문에 오른쪽에서 작동하지 않습니다. 현재 동일한 문제에 직면하고 있습니다.
dosdos

3
@dosdos view와 layoutSubviews의 서브 클래스가 자기 구석을 돌고 있습니다.
Arbitur

10
자동 레이아웃을 사용하고 뷰에 대한 참조를 반올림하지 않으려면을 호출 .layoutIfNeeded()하면이 메소드를 호출 할 수 있습니다 .
zgjie

209

그리고 마지막으로… iOS11 에는 CACornerMask가 있습니다! 함께 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 그리고…
Sergey Belous

1
장치를 회전 할 때 다른 답변이 작동하지 않습니다.이 코드는 회전을 위해 작동하며 특정 모서리를 둥글게 할 수 있습니다. 이것은 허용되는 답변이어야합니다.
Cloud9999Strife

1
단순하다 아름답다
eharo2

99

스위프트 코드 예제 : https : //.com/a/35621736/308315


직접 아닙니다. 넌해야만 해:

  1. 만들기 CAShapeLayer
  2. 그 설정 path이 될 수있는 CGPathRef기반으로 view.bounds하지만 두 개의 둥근 모서리 (아마 사용하여 +[UIBezierPath bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:])
  3. 당신 view.layer.mask을 설정CAShapeLayer

21
몇 가지 이상의 관점에서 수행하면 성능이 저하 될 수 있다는 경고를
받으십시오

@jjxtra 성능 저하없이 가장 좋은 방법은 무엇입니까? UITableViewCell에 표시하고 싶습니다.
xi.lin

layer.shouldRasterize == YES 설정에서 @ xi.lin 은 속도를 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; 그것은 나를 위해 작동하지 않습니다.
kiran

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
}

스토리 보드에서 자동 크기 조정을 사용하는 경우 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에서는 작동합니다
Ali Ihsan URAL

iOS 9에 대한 솔루션?
jey 2019

@jay let rectShape = CAShapeLayer () rectShape.bounds = detailsSubView.frame rectShape.position = detailsSubView.center rectShape.path = UIBezierPath (roundedRect : detailsSubView.bounds, byRoundingCorners : [.topLeft, .topRight], cornerRadii : CGSize (너비 : 폭 20, 높이 : 20)). cgPath detailsSubView.layer.mask = rectShape이 코드는 iOS 9에서 작동 할 수 있습니다
iOS

@jay check 통보하지 않으면
iOS

iOS 9에서는 작동하지 않습니다. 모서리 부분에 테두리가 없습니다.
jey 2019

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
이것이 오늘날의 코딩에 대한 정답입니다. 마스크 레이어를 안녕히 가십시오.
Alen Liang

1
이것이 가장 좋은 대답이어야합니다!
fujianjin6471 2016 년

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뷰의 경계가 최종인에서 호출하십시오 .


감사합니다. 나를 위해 문제를 해결 한 것은 viewDidLoad 및 viewWillAppear에서 viewDidAppear로 "Arbitur"가 제공하는 구현으로 호출을 이동하는 것이 었습니다. 내 컨트롤이 처음에 숨김으로 설정되어 있기 때문에 그렇게 할 수 있습니다.
Matti

네 말이 맞아 자동 레이아웃에 문제가 발생하고 작업을 완료했습니다.
Ashish Kakkad

15

스위프트 4 스위프트 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이 완료 될 때까지 그 안에 FUNC roundCorners를 호출해야합니다 귀하의보기의 모서리가 계산되지 않은 것을 기억
Jirson Tavera

이 뷰에 그림자를 추가하는 방법을 알려줄 수 있습니까?
Vadlapalli Masthan 2009 년

@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의 오른쪽 상단과 오른쪽 하단을 반올림하도록 지정할 수 있습니다.

결과는 여기에서 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오


테두리와 특정 모서리 조합에 적합 🎉🎉🎉
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
        }
    }
}

당신은 내 경우에 내 하루를 저장 특정 셀에 대한 테이블 뷰를 둥글게해야했다
Shakti

내 요구 사항에 따라 완벽한 대답. 나는 모든 대답을 사용했지만 아무것도 효과가 없었지만 당신의 대답은 나를 도우며 내 문제를 해결했습니다.
Nikita Patil

6

프로그래밍 방식 으로이 작업을 수행하는 방법 은 둥근 모서리가있는 UIView상단 부분 을 만드는 것 UIView입니다. 또는 무언가 밑에 윗면을 숨길 수 있습니다.


6
그것의 매우 추악한 해결책 : 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

가장 쉬운 방법은 둥근 모서리 레이어로 마스크를 만드는 것입니다.

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

이미 주어진 모든 답변은 정말 좋고 유효합니다 (특히 Yunus는 mask 부동산 ).

그러나 레이어가 종종 크기를 변경할 수 있기 때문에 좀 더 복잡한 것이 필요했습니다. 매번 마스킹 로직을 호출해야한다는 것을 의미했습니다. 이는 약간 성가신 일이었습니다.

나는 신속 extensions하고 계산 된 속성을 사용하여 실제를 구축했습니다.cornerRadii레이어가 배치 될 때 마스크 자동 업데이트를 처리 속성 했습니다.

이것은 Peter Steinberg의 위대한 측면을 사용하여 달성되었습니다. 라이브러리를 되었습니다.

전체 코드는 다음과 같습니다.

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

C #에서 Xamarin 을 사용하여 버튼의 각 모서리에 대한 모서리 반경을 설정하는 방법은 다음과 같습니다 .

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 코드의 비트 변경 후 신속한 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

Stephane 의 답변 의 다른 버전 .

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.