Usa Storyboard per mascherare UIView e dare angoli arrotondati?


100

Molte domande come questa spiegano come creare una maschera a livello di codice e fornire angoli arrotondati a una vista UIV.

C'è un modo per fare tutto all'interno di Storyboard? Solo chiedere perché sembra che la creazione di angoli arrotondati in Storyboard mantenga una demarcazione più chiara tra presentazione e logica.


Risposte:


264

Sì, lo uso molto, ma a domande come questa è già stata data risposta molte volte.

Ma comunque in Interface Builder. È necessario aggiungere attributi di runtime definiti dall'utente in questo modo:

layer.masksToBounds Boolean YES
layer.cornerRadius Number {View's Width/2}

inserisci qui la descrizione dell'immagine

e abilita

Clips subviews

inserisci qui la descrizione dell'immagine

Risultati:

inserisci qui la descrizione dell'immagine


dove posso aggiungere attributi di runtime definiti dall'utente?
Henson Fang

Come mostro nella prima immagine seleziona la vista, quindi nel riquadro di destra seleziona la terza icona Attributi di runtime definiti dall'utente Fai clic sull'elemento in basso per aggiungere il percorso chiave, il tipo, il valore
Woraphot Chokratanasombat

1
Puoi rendere dinamico il raggio del bordo in modo che sia sempre il 50% della larghezza o deve essere un numero intero statico?
Crashalot

1
Per quanto ne so, solo valore fisso.
Woraphot Chokratanasombat

1
Solo per tua informazione, se come me sei venuto qui pensando che questo avrebbe funzionato su LaunchScreen.storyboard, non lo fa. Otterrai: Error: Launch screens may not use user defined runtime attributes. Sembra che se hai bisogno di un'immagine rotonda su LaunchScreen, non hai più opzioni.
Code Knox

22

Puoi farlo in uno storyboard utilizzando proprietà definite dall'utente. Seleziona la vista che desideri arrotondare e apri il relativo Identity Inspector. Nella sezione Attributi di runtime definiti dall'utente , aggiungi le due voci seguenti:

  • Percorso chiave:, layer.cornerRadiusTipo: Numero, Valore: (qualunque raggio tu voglia)
  • Percorso chiave:, layer.masksToBoundsTipo: booleano, Valore: verificato

Potrebbe essere necessario importare QuartzKitnel file di classe corrispondente della vista (se presente), ma giuro che l'ho fatto funzionare senza farlo. I tuoi risultati possono variare.

EDIT: Esempio di un raggio dinamico

extension UIView {

    /// The ratio (from 0.0 to 1.0, inclusive) of the view's corner radius
    /// to its width. For example, a 50% radius would be specified with
    /// `cornerRadiusRatio = 0.5`.
    @IBDesignable public var cornerRadiusRatio: CGFloat {
        get {
            return layer.cornerRadius / frame.width
        }

        set {
            // Make sure that it's between 0.0 and 1.0. If not, restrict it
            // to that range.
            let normalizedRatio = max(0.0, min(1.0, newValue))
            layer.cornerRadius = frame.width * normalizedRatio
        }
    }

}

Ho verificato che funziona in un parco giochi.


1
Puoi rendere dinamico il raggio del bordo in modo che sia sempre il 50% della larghezza o deve essere un numero intero statico?
Crashalot

5
Puoi, ma solo in codice. Una soluzione interessante, tuttavia, è aggiungere una proprietà IBInspectable alla classe della vista che è un valore numerico compreso tra 0 e 100 e indica la percentuale della larghezza che dovrebbe essere il raggio. Ad esempio, un valore di 50 significa che il raggio dovrebbe essere il 50% della larghezza. Poiché è una proprietà calcolata (non archiviata), puoi persino aggiungerla a un'estensione di UIView in modo che tutte le viste possano avere la proprietà.
NRitH

@NRitH, sarei interessato a vedere qualcosa del genere. Pensi di poter inserire il codice qui?
Cobie Fisher

17

Seleziona vista hai cambiato Corner Rediuse, Border Widthe e Border Color anche usando StoryBord

extension UIView {

    @IBInspectable var cornerRadiusV: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderWidthV: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable var borderColorV: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
}

3
perché usare cornerRadiusV invece di cornerRadius?
luhuiya

1
è impostato cornerRadius utilizzando lo storyboard attraverso, salva la codifica di scrittura in Project
Ananda Aiwale

Ha funzionato perfettamente
Hassan Tareq

0

Anche dopo aver apportato tutte le modifiche allo storyboard, la risposta di Woraphot non funziona per me.

Questo ha funzionato per me:

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

Risposta lunga :

Angoli arrotondati di UIView / UIButton ecc

customUIView.layer.cornerRadius = 10

Spessore del bordo

pcustomUIView.layer.borderWidth = 1

Colore del bordo

customUIView.layer.borderColor = UIColor.blue.cgColor

Questo non cerca di rispondere alla domanda ed è solo un duplicato dell'altra tua risposta qui .
spessore
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.