2016-05-11 22 views
6

so di poter arrotondare tutti e quattro gli angoli utilizzando:Round Top Angoli di un UIButton a Swift

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

Dal momento voglio solo turno, ho fatto qualche ricerca e ha scoperto 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 
    } 
} 

che si chiama in questo modo:

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

Eppure questo non funziona per un UIButton. Quando passo l'estensione di essere per il tipo UIButton e passarlo un pulsante, l'output è simile al seguente:

enter image description here

La domanda è, come faccio adattare questo per lavorare su un UIButton?

+0

Considerare l'accettazione della risposta, perché è la risposta più precisa al problema. I futuri visitatori di questa domanda non saranno soddisfatti semplicemente vedendo un mucchio di codice che funziona, ma non spiega perché funzioni (è quello che fa la risposta attualmente accettata) ma piuttosto vedendo dove è il problema - e che è inchiodato da la mia risposta. –

+0

vedere la mia risposta qui: http://stackoverflow.com/a/40222533/2594699 –

risposta

22

Aggiunta di estensione 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 

    } 
} 

Chiamata in viewDidAppear/viewDidLayoutSubvies:

btnCorner.roundedButton() 

Button angolo OutPut:

enter image description here

+0

Sai come posso rimuovere questo dal pulsante dopo? Se voglio riutilizzare il pulsante ma senza arrotondare? NVM, eccolo qui: myBtn.layer.mask? .removeFromSuperlayer() –

0

utilizzare questo codice,

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

speranza suo utile

+0

bro - l'interrogante ha già chiamato il metodo come 'view.roundCorners ([.Lex, .TopRight], raggio: 10)', puoi modifica la tua risposta una volta –

+0

so che l'interlocutore chiede ma questo codice sopra è corretto –

1

Hai dimenticato di impostare la struttura del vostro livello di forma:

mask.frame = layer.bounds 
3

Update estensione per essere come questo:

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

La forma l ayer (maschera) deve conoscere telaio

+1

grazie per il codice, è abbastanza utile in molti scenari. ma per favore cambia "maskLayer.frame = rect" in "mask.frame = rect" – dreampowder

14

Per rapida risposta di 3 Kirit Modi viene modificato in:

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

All'inizio del fascicolo della estensione non dimenticare di aggiungere:

import UIKit 

Se si desidera un prolungamento per un UIView con la possibilità di arrotondare gli angoli superiori o inferiori è possibile utilizzare:

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

che si chiama per un pulsante come:

myButton.roundedCorners(top: true) 
1

iOS 11 ha reso davvero facile da arrotondare gli angoli. Il codice sottostante arrotonda gli angoli in alto a sinistra e in basso a destra.

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