Come creare il bordo in UIButton?


Risposte:


352

È possibile impostare le proprietà dei bordi sul CALayer accedendo alla proprietà layer del pulsante.

Per prima cosa aggiungi Quarzo

#import <QuartzCore/QuartzCore.h>

Imposta proprietà:

myButton.layer.borderWidth = 2.0f;
myButton.layer.borderColor = [UIColor greenColor].CGColor;

Vedere:

https://developer.apple.com/documentation/quartzcore/calayer#//apple_ref/occ/cl/CALayer

Il CALayer nel link sopra ti permette di impostare altre proprietà come raggio d'angolo, maskToBounds ecc ...

Inoltre, un buon articolo sul divertimento dei pulsanti:

https://web.archive.org/web/20161221132308/http://www.apptite.be/tutorial_custom_uibuttons.php


3
Assicurati di collegare la tua destinazione al framework QuartCore nella scheda Fasi di costruzione dell'editor di destinazione.
— zekel,

1
Devo importare il quarzo? Posso ancora accedere al livello del pulsante senza di esso. Il mio scopo è chiedere: quali vantaggi stiamo ottenendo importando Quartz
— Alix il

1
più 1 per l'utilizzoCGColor
— Anurag Sharma,

51

È molto semplice, basta aggiungere l'intestazione quartzCore nel tuo file (per questo devi aggiungere il framework quartz al tuo progetto)

e poi fai questo

[[button layer] setCornerRadius:8.0f];

[[button layer] setMasksToBounds:YES];

[[button layer] setBorderWidth:1.0f];

è possibile modificare i valori float come richiesto.

godere.


Ecco un tipico codice moderno ...

self.buttonTag.layer.borderWidth = 1.0f;
self.buttonCancel.layer.borderWidth = 1.0f;

self.buttonTag.layer.borderColor = [UIColor blueColor].CGColor;
self.buttonCancel.layer.borderColor = [UIColor blueColor].CGColor;

self.buttonTag.layer.cornerRadius = 4.0f;
self.buttonCancel.layer.cornerRadius = 4.0f;

è un aspetto simile ai controlli segmentati.

AGGIORNAMENTO per Swift:

  • Non è necessario aggiungere "QuartzCore"

Basta fare:

button.layer.cornerRadius = 8.0
button.layer.borderWidth = 1.0
button.layer.borderColor = UIColor.black.cgColor

23

E in breve tempo, non è necessario importare "QuartzCore / QuartzCore.h"

Usa solo:

button.layer.borderWidth = 0.8
button.layer.borderColor = (UIColor( red: 0.5, green: 0.5, blue:0, alpha: 1.0 )).cgColor

o

button.layer.borderWidth = 0.8
button.layer.borderColor = UIColor.grayColor().cgColor

Secondo XCode 9, "CGColor è stato rinominato cgColor".
— BlenderBender,

20

L'impostazione del livello problema borderWidthed borderColorè che il quando si tocca il tasto del confine non animare l'effetto di evidenziazione.

Ovviamente, puoi osservare gli eventi del pulsante e cambiare il colore del bordo di conseguenza, ma ciò sembra inutile.

Un'altra opzione è quella di creare un UIImage estensibile e impostarlo come immagine di sfondo del pulsante. Puoi creare un set di immagini nei tuoi Images.xcasset in questo modo:

Images.xcassets

Quindi, lo imposti come immagine di sfondo del pulsante:

Proprietà pulsante

Se l'immagine è un'immagine modello, puoi impostare il colore della tinta del pulsante e il bordo cambierà:

Pulsante finale

Ora il bordo verrà evidenziato con il resto del pulsante quando viene toccato.


Da cosa ricava l'immagine?
— Bigfoot11

1
Per fare quell'immagine ho usato Sketch, ma puoi usare Gimp, Illustrator, Photoshop ...
— juanjo,

Bella risposta. È meglio di cambiare livello borderWidth.
— Alexander Doloz,

8

Per cambiare il pulsante Raggio, Colore e Larghezza ho impostato in questo modo:

self.myBtn.layer.cornerRadius = 10;
self.myBtn.layer.borderWidth = 1;
self.myBtn.layer.borderColor =[UIColor colorWithRed:189.0/255.0f green:189.0/255.0f blue:189.0/255.0f alpha:1.0].CGColor;

8

Ecco una versione aggiornata ( Swift 3.0.1 ) dalla risposta di Ben Packard .

import UIKit

@IBDesignable class BorderedButton: UIButton {

    @IBInspectable var borderColor: UIColor? {
        didSet {
            if let bColor = borderColor {
                self.layer.borderColor = bColor.cgColor
            }
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    override var isHighlighted: Bool {
        didSet {
            guard let currentBorderColor = borderColor else {
                return
            }

            let fadedColor = currentBorderColor.withAlphaComponent(0.2).cgColor

            if isHighlighted {
                layer.borderColor = fadedColor
            } else {

                self.layer.borderColor = currentBorderColor.cgColor

                let animation = CABasicAnimation(keyPath: "borderColor")
                animation.fromValue = fadedColor
                animation.toValue = currentBorderColor.cgColor
                animation.duration = 0.4
                self.layer.add(animation, forKey: "")
            }
        }
    }
}

Il pulsante risultante può essere utilizzato all'interno di StoryBoard grazie ai tag @IBDesignablee @IBInspectable.

inserisci qui la descrizione dell'immagine

Inoltre, le due proprietà definite consentono di impostare la larghezza e il colore del bordo direttamente sul builder di interfacce e visualizzare in anteprima il risultato.

inserisci qui la descrizione dell'immagine

Altre proprietà potrebbero essere aggiunte in modo simile, per il raggio del bordo e per evidenziare il tempo di dissolvenza.


Ho problemi con i vincoli su swift 4, ho fatto il pulsante a dimensione intera (da un lato all'altro della larghezza), nel codice x ho visto molto bene l'anteprima del bordo, ma sopra l'emulatore o il dispositivo ho visto il bordo ridotto alla dimensione di il testo all'interno del pulsante, L'unico vincolo di autolayout che ho aggiunto era centrato orizzontalmente, come risolverlo? Grazie!
— Cristian Chaparro A.

@CristianChaparroA. Il motivo è che prepareForInterfaceBuilderviene chiamato solo da IB, non quando si esegue l'app. Quindi imposta anche UIEdgeInsets awakeFromNib, quindi verrà visualizzato anche durante l'esecuzione dell'app.
— Samuël,

6

Non è necessario importare QuartzCore.hora. Prendendo iOS 8 SDK e Xcode 6.1 in riferimento.

Utilizzare direttamente:

[[myButton layer] setBorderWidth:2.0f];
[[myButton layer] setBorderColor:[UIColor greenColor].CGColor];

6

Ecco una UIButtonsottoclasse che supporta l'animazione dello stato evidenziato senza usare le immagini. Aggiorna anche il colore del bordo quando cambia la modalità di tinta della vista.

class BorderedButton: UIButton {
    override init(frame: CGRect) {
        super.init(frame: frame)

        layer.borderColor = tintColor.CGColor
        layer.borderWidth = 1
        layer.cornerRadius = 5

        contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    override func tintColorDidChange() {
        super.tintColorDidChange()

        layer.borderColor = tintColor.CGColor
    }

    override var highlighted: Bool {
        didSet {
            let fadedColor = tintColor.colorWithAlphaComponent(0.2).CGColor

            if highlighted {
                layer.borderColor = fadedColor
            } else {
                layer.borderColor = tintColor.CGColor

                let animation = CABasicAnimation(keyPath: "borderColor")
                animation.fromValue = fadedColor
                animation.toValue = tintColor.CGColor
                animation.duration = 0.4
                layer.addAnimation(animation, forKey: "")
            }
        }
    }
}

Uso:

let button = BorderedButton(style: .System) //style .System is important

Aspetto:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


6

Ciò può essere ottenuto in vari metodi in Swift 3.0 ha funzionato sull'ultima versione agosto - 2017

Opzione 1:

Assegnare direttamente i valori della proprietà borderWidth per il pulsante UI:

  btnUserButtonName.layer.borderWidth = 1.0

Imposta titolo con valori di colore predefiniti per il pulsante UI:

btnUserButtonName.setTitleColor(UIColor.darkGray, for: .normal)

Imposta bordo con colore predefinito per i valori delle proprietà del bordo per il pulsante UI:

btnUserButtonName.layer.borderColor = UIColor.red

Imposta il colore definito dall'utente per i valori delle proprietà del bordo per il pulsante UI:

   let myGrayColor = UIColor(red: 0.889415, green: 0.889436, blue:0.889424, alpha: 1.0 )
   btnUserButtonName.layer.borderColor = myGrayColor.cgColor

Opzione 2: [consigliato]

Utilizzare il metodo di estensione, in modo che il pulsante attraverso l'applicazione appaia coerente e non sia necessario ripetere più righe di codice ovunque.

//Create an extension class in any of the swift file

extension UIButton {
func setBordersSettings() {
        let c1GreenColor = (UIColor(red: -0.108958, green: 0.714926, blue: 0.758113, alpha: 1.0))
        self.layer.borderWidth = 1.0
        self.layer.cornerRadius = 5.0
        self.layer.borderColor = c1GreenColor.cgColor
        self.setTitleColor(c1GreenColor, for: .normal)
        self.layer.masksToBounds = true
    }
}

Utilizzo nel codice:

//use the method and call whever the border has to be applied

btnUserButtonName.setBordersSettings()

Uscita del metodo di estensione Pulsante:

inserisci qui la descrizione dell'immagine


2

Aggiorna con Swift 3

    button.layer.borderWidth = 0.8
    button.layer.borderColor = UIColor.blue.cgColor

inserisci qui la descrizione dell'immagine


2

**** In Swift 3 ****

Per creare il bordo

 btnName.layer.borderWidth = 1
 btnName.layer.borderColor = UIColor.black.cgColor

Per arrotondare l'angolo

 btnName.layer.cornerRadius = 5

1

Swift 5

button.layer.borderWidth = 2

Per cambiare il colore del bordo usare

button.layer.borderColor = CGColor(srgbRed: 255/255, green: 126/255, blue: 121/255, alpha: 1)

1
button.layer.borderColor = Anche UIColor.gray.cgColor è accettabile!
— Carlos Irano,
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.