Come creare un semplice pulsante arrotondato in Storyboard?


104

Ho appena iniziato a imparare lo sviluppo di iOS, non riesco a trovare come creare semplici pulsanti arrotondati. Trovo risorse per le vecchie versioni. Devo impostare uno sfondo personalizzato per un pulsante? In Android, userei solo una patch 9, ma so che iOS non ha questa capacità.

inserisci qui la descrizione dell'immagine

Risposte:


82

Per farlo nello storyboard, è necessario utilizzare un'immagine per il pulsante.

In alternativa puoi farlo in codice:

 btn.layer.cornerRadius = 10
 btn.clipsToBounds = true

2
perché è necessario clipsToBounds? Sembra che quell'ombra non funzioni finché non la rimuovo.
Gintas_

1
Buona risposta, ma puoi farlo in IB, senza immagini. Vedi sotto.
zontar

224

Risposta breve: SI

Puoi assolutamente creare un semplice pulsante arrotondato senza la necessità di un'immagine di sfondo aggiuntiva o di scrivere alcun codice per lo stesso. Basta seguire lo screenshot riportato di seguito, per impostare gli attributi di runtime per il pulsante, per ottenere il risultato desiderato.

Non verrà visualizzato in Storyboardma funzionerà correttamente quando si esegue il progetto.

inserisci qui la descrizione dell'immagine

Nota:
il "Percorso chiave" layer.cornerRadius e il valore sono 5. Il valore deve essere modificato in base all'altezza e alla larghezza del pulsante. La formula è l'altezza del pulsante * 0,50. Quindi gioca intorno al valore per vedere il pulsante arrotondato previsto nel simulatore o sul dispositivo fisico. Questa procedura sembrerà noiosa quando avrai più di un pulsante da arrotondare nello storyboard.


9
Si prega di aggiungere un commento quando si vota in negativo.
Nishant

7
è deludente che IB non possa mostrarlo come un'app di trafilatura run of the mill.
William Cerniuk

2
@WilliamCerniuk: In realtà può. Dai
Nishant

L'impostazione degli attributi di runtime definiti dall'utente funziona effettivamente, visualizzabile nel simulatore dopo la costruzione.
Contro Bulaquena

Come dice la risposta accettata, potrebbe anche essere necessario aggiungere un percorso chiave booleano clipsToBoundsaffinché funzioni.
Max

86

Puoi fare qualcosa del genere:

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? frame.size.height / 2 : 0
    }
}

Imposta la classe su MyButtonin Identity Inspectore in IB avrai roundedproprietà:

inserisci qui la descrizione dell'immagine


4
Di gran lunga la migliore risposta. Ho imparato qualcosa di nuovo oggi fantastico!
Contrassegna il

2
Questa risposta non è completa. Quando avvii l'app, xCode utilizzerà la dimensione del frame della vista nel generatore di interfacce, non la dimensione del frame reale quando l'app è in esecuzione.
Simon Backx

2
Puoi anche usare "didSet" invece di "willSet" e rimuovere l'argomento isRounded.
Simon Backx

1
Se usi un'immagine di sfondo, imposta layer.masksToBounds = trueanche
zontar

34
  1. Crea una lezione Cocoa Touch.

inserisci qui la descrizione dell'immagine

  1. Inserisci il codice nella classe RoundButton.

    import UIKit
    
    @IBDesignable
    class RoundButton: UIButton {
    
        @IBInspectable var cornerRadius: CGFloat = 0{
            didSet{
            self.layer.cornerRadius = cornerRadius
            }
        }
    
        @IBInspectable var borderWidth: CGFloat = 0{
            didSet{
                self.layer.borderWidth = borderWidth
            }
        }
    
        @IBInspectable var borderColor: UIColor = UIColor.clear{
            didSet{
                self.layer.borderColor = borderColor.cgColor
            }
        }
    }
  2. Riferisci l'immagine.

inserisci qui la descrizione dell'immagine


Si prega di smettere di pubblicare ripetutamente la stessa risposta. Questo è considerato rumore. Adatta le tue risposte alle diverse domande o, se sono davvero la stessa domanda, puoi contrassegnarle come duplicate (e quando hai abbastanza reputazione, vota per chiudere).
elixenide

Non so se anche altri si siano imbattuti in questo, ma non appena ho impostato la classe su un pulsante e gli ho assegnato un raggio, larghezza del bordo e colore del bordo, Xcode (9.2) genera un errore che si è verificato un errore di rendering. La creazione dell'app riesce, ma il simbolo rosso "!" continua ad essere visualizzato. Dico solo ... sono tornato alla soluzione solo codice (anche se questo era davvero un modo elegante).
Aeger

10

Ho trovato il modo più semplice per farlo, è impostare il cornerRadius a metà dell'altezza della vista.

button.layer.cornerRadius = button.bounds.size.height/2

No, non l'ho fatto. Se la tua altezza e larghezza sono le stesse (quindi sarebbe stato quadrato), otterrai un cerchio. Ma se la larghezza è maggiore dell'altezza, il pulsante sarà corretto.
FrankkieNL

2
Hai ragione, mi mancava l'immagine inclusa nella domanda che mostra ciò che il poster era effettivamente dopo che corrisponde alla tua risposta più della risposta accettata - voto positivo
Michael Hudson

4

Puoi connettere il IBOutlettuo pulsante dallo storyboard.

Quindi puoi impostare il corner radiustuo pulsante per arrotondare l'angolo.

ad esempio, il tuo outletè myButton,

Obj - C

 self.myButton.layer.cornerRadius = 5.0 ;

veloce

  myButton.layer.cornerRadius = 5.0

Se si desidera un pulsante rotondo esatto, il pulsante widthe heightdeve essere equale cornerRadiusdeve essere uguale all'altezza o alla larghezza / 2 (metà della larghezza o dell'altezza).


4

Come altre risposte hanno suggerito di eseguire la maggior parte di questo lavoro in codice, solo una risposta ha effettivamente fornito un modo per visualizzare le modifiche nell'interfaccia IB dello storyboard. La mia risposta va oltre quella risposta permettendoti di cambiare l'angoloRaggio della vista, pulsante, immagine, ecc.

Si prega di dare un'occhiata al seguente codice. Per usare questo codice crea un nuovo file swift chiamato RoundedView o come vuoi chiamarlo, quindi vai al tuo storyboard e cambia la classe in "RoundedView", "RoundedImageView" o "RoundedButton".

import UIKit

@IBDesignable class RoundedImage: UIImageView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedView: UIView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

1

Durante l'aggiunta layer.cornerRadiusnello storyboard assicurati di non avere spazi iniziali o finali. Se fai copia incolla, potresti ottenere degli spazi inseriti. Sarebbe bello se XCode dicesse una sorta di avviso o errore.


0

Prova questo!!

 override func viewDidLoad() {
   super.viewDidLoad()

   var button = UIButton.buttonWithType(.Custom) as UIButton
   button.frame = CGRectMake(160, 100, 200,40)

   button.layer.cornerRadius =5.0
   button.layer.borderColor = UIColor.redColor().CGColor
   button.layer.borderWidth = 2.0

   button.setImage(UIImage(named:"Placeholder.png"), forState: .Normal)
   button.addTarget(self, action: "OnClickroundButton", forControlEvents: .TouchUpInside)
   button.clipsToBounds = true

   view.addSubview(button)
}
    func OnClickroundButton() {
   NSLog(@"roundButton Method Called");
}

0

L'estensione è l'opzione migliore per questo problema. Crea un'estensione di View o Button

public extension UIView {
  //Round the corners
  func roundCorners(){
    let radius = bounds.maxX / 16
    layer.cornerRadius = radius
  }
}

Chiamalo dal codice

button.roundCorners()

0

Sto usando Xcode versione 11.4

Nella finestra di ispezione degli attributi, puoi definire il raggio dell'angolo.

Non verrà visualizzato nello Storyboard ma funzionerà correttamente quando esegui il progetto.

inserisci qui la descrizione dell'immagine


-1
import UIKit

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()


    }

    func updateCornerRadius(radius:CGFloat) {
        layer.cornerRadius = radius
    }
    @IBInspectable var cornerRadius:CGFloat = 0{
        didSet{
            updateCornerRadius(radius: cornerRadius)
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.