2016-05-11 258 views
6

一个UIButton我知道我可以使用转了所有四个角落的圆形顶角:斯威夫特

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

因为我只想第二轮中,我做了一些研究,发现this

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工作。当我切换扩展成为类型的UIButton并把它传递一个按钮,输出看起来是这样的:

enter image description here

的问题是,我该如何适应这对一个UIButton工作?

+0

请考虑接受我的答案,因为它是最准确的问题答案。这个问题的未来访问者不会仅仅通过看到一堆可行的代码就能满足,但并不能解释为什么它能够工作(这就是目前接受的答案所做的),而是通过看到_where_问题是 - 而且是由我的答案。 –

+0

在这里看到我的答案:http://stackoverflow.com/a/40222533/2594699 –

回答

22

的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() 

角码输出:

enter image description here

+0

你知道我可以如何从按钮中删除它吗?如果我想重复使用按钮但不四舍五入? NVM,这里是:myBtn.layer.mask?.removeFromSuperlayer() –

0

使用此代码,

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

希望它有帮助

+0

bro - 提问者已经调用了像view.roundCorners([。TopLeft,.TopRight],radius:10)'的方法,你能修改您的答案一次 –

+0

雅我知道提问者问,但这个代码是正确的 –

1

你忘了把你的形状层的框架:

mask.frame = layer.bounds 
3

更新您的扩展是这样的:

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

形状l艾尔(屏蔽)需要知道框架

+1

感谢您的代码,它在很多情况下是相当有用的。但请将“maskLayer.frame = rect”更改为“mask.frame = rect” – dreampowder

14

对于SWIFT 3 Kirit莫迪的应答改变为:

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可以使用舍入顶部或底部角的选项:

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

这就是所谓的一个按钮:

myButton.roundedCorners(top: true) 
1

iOS版11取得了它很容易圆角。下面的代码围绕左上角和右下角。

myView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMaxYCorner]