2016-05-11 20 views
6

wiem, że mogę cały cztery narożniki za pomocą:Round Top rogach UIButton w Swift

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

Od kiedy tylko chcą drugiej rundzie, zrobiłem kilka badań i stwierdził 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 
    } 
} 

który nazywa się tak:

view.roundCorners([.TopLeft , .TopRight], radius: 10) 

Jednak to nie działa na UIButton. Po zmianie rozszerzenia być dla typu UIButton i przekazać go przycisku, wyjście wygląda następująco:

enter image description here

Pytanie jest, w jaki sposób dostosować to do pracy na UIButton?

+0

Proszę przyjąć moją odpowiedź, ponieważ jest to najbardziej precyzyjna odpowiedź na problem. Przyszli goście tego pytania nie będą usatysfakcjonowani po prostu widząc pakiet kodu, który działa, ale nie wyjaśnia, dlaczego to działa (to jest to, co obecnie przyjmuje odpowiedź), ale raczej widząc, gdzie jest problem - i który został przybity przez moja odpowiedź. –

+0

zobacz moją odpowiedź tutaj: http://stackoverflow.com/a/40222533/2594699 –

Odpowiedz

22

Dodawanie Przedłużenie 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 

    } 
} 

wywołanie w viewDidAppear/viewDidLayoutSubvies:

btnCorner.roundedButton() 

Przycisk Corner wyjściowa:

enter image description here

+0

Czy wiesz, jak mogę usunąć to z przycisku po? Czy chcę ponownie użyć przycisku, ale bez zaokrąglania? NVM, oto jest: myBtn.layer.mask? .removeFromSuperlayer() –

0

użyć tego kodu,

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

nadzieję jej pomocny

+0

bro - osoba pytająca już nazwała taką metodą jak 'view.roundCorners ([TopLeft, .TopRight], promień: 10)', czy możesz zmodyfikuj swoją odpowiedź raz –

+0

tak, wiem, że pytam, ale ten kod jest poprawny –

1

zapomniałeś ustawić klatkę warstwy kształt:

mask.frame = layer.bounds 
3

poinformować Cię rozszerzenie tak:

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

Kształt l Ayer (maska) musi wiedzieć ramy

+1

dzięki za kod, jest całkiem użyteczny w wielu scenariuszach. ale zmień "maskLayer.frame = rect" na "mask.frame = rect" – dreampowder

14

Dla Swift Odpowiedź 3 Kirit Modi jest zmienione na:

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

Na początku pliku tego rozszerzenia nie zapomnij dodać:

import UIKit 

Jeśli chcesz rozszerzenie dla modelu UIView z opcją zaokrąglania górnych lub dolnych narożników można użyć:

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

który nazywa się na przycisku jako:

myButton.roundedCorners(top: true) 
1

iOS 11 stało się naprawdę łatwo zaokrąglone rogi. Poniższy kod zaokrągla górny lewy i prawy dolny róg.

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