Posso impostare il colore di sfondo per un pulsante, ma non riesco a capire come impostare il colore di sfondo per UIControlState.Highlighted
. È possibile? o devo percorrere il percorso setBackgroundImage
?Come impostare il colore di sfondo UIButton perStato: UIControlState.Highlighted in Swift
risposta
Se qualcuno si ferma, un altro modo per andare forse più facilmente se si tratta di qualcosa che è necessario più di una volta ... ho scritto una breve proroga per UIButton, funziona bene :
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, forState: forState)
}}
si usa come setBackgroundImage
:
yourButton.setBackgroundColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
Questo distruggerà il layout automatico e rimuoverà il raggio dell'angolo. –
@ stephan1001 come lo farà? L'immagine è solo 1x1 quindi è allungata per adattarsi al pulsante? – ErikPerik
@ user4788711 proprio come l'impostazione di un'immagine di sfondo. Non più, non meno. – winterized
Sotto ci sarà la sola strada da percorrere. Due IBActions. Uno per controllare il colore di sfondo quando si preme un pulsante, uno sul rilascio.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
@IBAction func buttonClicked(sender: AnyObject) { //Touch Up Inside action
button.backgroundColor = UIColor.whiteColor()
}
@IBAction func buttonReleased(sender: AnyObject) { //Touch Down action
button.backgroundColor = UIColor.blueColor()
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
Quando si guardano le opzioni di completamento automatico per il vostro pulsante dopo l'aggiunta di un periodo, è possibile impostare un colore di sfondo, ma non per lo stato specificato. Puoi solo impostare immagini di sfondo. Ora, naturalmente, se sei sposato a farlo in questo modo invece di usare il metodo che mostro sopra, potresti caricare un'immagine del colore desiderato come immagine di sfondo usando la proprietà setbackgroundImageForState.
Funzionerà perfettamente! Grazie! –
Questa soluzione funziona solo in un ViewController ma non in un TableViewController.L'azione toccata funziona anche in TVC ma solo con alcuni millisecondi di ritardo, ma un rapido tocco sullo schermo non cambierà il colore del pulsante. Penso che ci sia un problema con la cella in cui si trova il pulsante, ma non ne sono sicuro. –
Mi sono imbattuto esattamente nello stesso problema. Se tocco la vista solo più di quanto non accada, il colore è già tornato al vecchio colore. Potrei risolvere questo problema con un po 'di ritardo in modo che il colore venga ripristinato qualche millisecondo dopo. Quindi il colore è visibile anche se l'utente tocca solo brevemente. –
Possiamo fare lo stesso usando gli attributi del tempo di esecuzione?
@IBInspectable var HighlightedBackground: Bool {
get {
return true
}
set {
layer.backgroundColor = Common.sharedInstance.OrangeColor.CGColor
print("highlighted state")
}
}
sintassi cambia in @winterized extension per la sintassi Swift 3+
extension UIButton {
func setBackgroundColor(color: UIColor, forState: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self.setBackgroundImage(colorImage, for: forState)
}}
Swift 4 Versione di this solution:
extension UIButton {
func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
UIGraphicsBeginImageContext(CGSize(width: 1, height: 1))
UIGraphicsGetCurrentContext()!.setFillColor(color.cgColor)
UIGraphicsGetCurrentContext()!.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
let colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
setBackgroundImage(colorImage, for: state)
}
}
Solo un piccolo miglioramento del codice , al fine di evitare la forza-scarta provare a fare questo: 'se lasciare currentGraphicsContext = UIGraphicsGetCurrentContext() { currentGraphicsContext.setFillColor (color.cgColor) currentGraphicsContext.fill (CGRect (x: 0, y: 0, larghezza: 1, altezza : 1)) } In aggiunta aggiungere 'layer.masksToBounds = true' per mantenere la funzionalità di' layer.cornerRadius' –
sembra che nessuno qui ha parlato usando chiave valore dell'osservazione ancora, ma è un altro approccio.
Un motivo per farlo invece di selezionare le altre risposte qui è che non è necessario creare continuamente nuove immagini né preoccuparsi degli effetti secondari dell'assegnazione di immagini ai pulsanti (ad esempio effetti cornerRadius).
Ma è necessario creare una classe per l'osservatore, che sarebbe responsabile per la memorizzazione dei diversi colori di sfondo e la loro applicazione nel metodo observeValue()
.
public class ButtonHighlighterObserver: NSObject {
var observedButton:UIButton? = nil
var backgroundColor: UIColor = UIColor.white
var backgroundHighlightColor: UIColor = UIColor.gray
public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// Perform background color changes when highlight state change is observed
if keyPath == "highlighted", object as? UIButton === observedButton {
observedButton!.backgroundColor = observedButton!.isHighlighted ? self.backgroundHighlightColor : self.backgroundColor
}
}
}
Poi tutto quello che dovete fare è gestire addObserver/removeObserver durante il funzionamento:
// Add observer to button's highlighted value
button.addObserver(anObserver, forKeyPath: "highlighted", options: [.new], context: nil)
anObserver.observedButton = button
// ...
// And at deinit time, be sure you remove the observer again
anObserver.observedButton?.removeObserver(item, forKeyPath: "highlighted")
anObserver.observedButton = nil
Controllare questo post https://somethingaboutios.wordpress.com/2016/02/09/uibutton-backgroundcolor-for-uicontrolstateselected/Swift esempio alla fine del post. –