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.