Swift的UIButton的圆顶angular落

我知道我可以使用四个angular:

myBtn.layer.cornerRadius = 8 myBtn.layer.masksToBounds = true 

既然我只想做两个,我做了一些研究,发现这个 :

 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 , .TopRight], radius: 10) 

然而,这不适用于UIButton。 当我将扩展名切换为UIButtontypes并将其传递给一个button时,输出如下所示:

在这里输入图像说明

问题是,如何适应这个工作在UIButton?

添加UIButton的扩展名:

 extension UIButton{ func roundedButton(){ let maskPAth1 = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.TopLeft , .TopRight], cornerRadii:CGSizeMake(8.0, 8.0)) let maskLayer1 = CAShapeLayer() maskLayer1.frame = self.bounds maskLayer1.path = maskPAth1.CGPath self.layer.mask = maskLayer1 } } 

调用viewDidAppear / viewDidLayoutSubvies:

 btnCorner.roundedButton() 

buttonangular输出:

在这里输入图像说明

对于迅速3 Kirit Modi的答案改为:

 extension UIButton { func roundedButton(){ let maskPAth1 = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [.topLeft , .topRight], cornerRadii:CGSize(width:8.0, height:8.0)) let maskLayer1 = CAShapeLayer() maskLayer1.frame = self.bounds maskLayer1.path = maskPAth1.cgPath self.layer.mask = maskLayer1 } } 

在扩展的文件的开始不要忘记添加:

 import UIKit 

如果你想要一个UIView的扩展,可以select舍入顶部或底部的angular,你可以使用:

 extension UIView { func roundedCorners(top: Bool){ let corners:UIRectCorner = (top ? [.topLeft , .topRight] : [.bottomRight , .bottomLeft]) let maskPAth1 = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii:CGSize(width:8.0, height:8.0)) let maskLayer1 = CAShapeLayer() maskLayer1.frame = self.bounds maskLayer1.path = maskPAth1.cgPath self.layer.mask = maskLayer1 } } 

这被称为button为:

 myButton.roundedCorners(top: true) 

更新你的扩展是这样的:

 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() var rect = self.bounds maskLayer.frame = rect mask.path = path.CGPath self.layer.mask = mask } } 

形状图层(蒙版)需要知道框架

你忘了设置你的形状图层的框架:

 mask.frame = layer.bounds 

使用这个代码,

 let path = UIBezierPath(roundedRect:viewTo.bounds, byRoundingCorners:[.TopRight, .TopLeft], cornerRadii: CGSizeMake(20, 20)) let maskLayer = CAShapeLayer() maskLayer.path = path.CGPath viewTo.layer.mask = maskLayer 

希望它有帮助