2016-05-11 313 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]