Risposte:
È 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
CGColor
È 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:
Basta fare:
button.layer.cornerRadius = 8.0
button.layer.borderWidth = 1.0
button.layer.borderColor = UIColor.black.cgColor
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
L'impostazione del livello problema borderWidth
ed 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:
Quindi, lo imposti come immagine di sfondo del pulsante:
Se l'immagine è un'immagine modello, puoi impostare il colore della tinta del pulsante e il bordo cambierà:
Ora il bordo verrà evidenziato con il resto del pulsante quando viene toccato.
borderWidth
.
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 @IBDesignable
e @IBInspectable
.
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.
Altre proprietà potrebbero essere aggiunte in modo simile, per il raggio del bordo e per evidenziare il tempo di dissolvenza.
prepareForInterfaceBuilder
viene chiamato solo da IB, non quando si esegue l'app. Quindi imposta anche UIEdgeInsets awakeFromNib
, quindi verrà visualizzato anche durante l'esecuzione dell'app.
Non è necessario importare QuartzCore.h
ora. Prendendo iOS 8 SDK e Xcode 6.1 in riferimento.
Utilizzare direttamente:
[[myButton layer] setBorderWidth:2.0f];
[[myButton layer] setBorderColor:[UIColor greenColor].CGColor];
Ecco una UIButton
sottoclasse 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:
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:
**** 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
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)