Irgendwann in meiner App habe ich eine Markierung UIButton
(zum Beispiel wenn ein Benutzer seinen Finger auf der Schaltfläche hat) und ich muss die Hintergrundfarbe ändern, während die Schaltfläche hervorgehoben ist (also während der Finger des Benutzers noch auf der Schaltfläche ist). .
Ich habe folgendes versucht:
_button.backgroundColor = [UIColor redColor];
Aber es funktioniert nicht. Die Farbe bleibt gleich. Ich habe den gleichen Code ausprobiert, wenn die Schaltfläche nicht markiert ist und einwandfrei funktioniert. Ich habe auch versucht, -setNeedsDisplay
nach dem Ändern der Farbe anzurufen, es hatte keine Auswirkung.
Wie kann man die Schaltfläche zwingen, die Hintergrundfarbe zu ändern?
ios
objective-c
xcode
uibutton
MartinMoizard
quelle
quelle
Antworten:
Sie können außer Kraft setzen
UIButton
‚s -setHighlighted
Methode.Ziel c
Swift 3.0 und Swift 4.1
quelle
backgroundColor = isHighlighted ? .lightGray : .white
Ich bin mir nicht sicher, ob diese Art von Lösung das ist, wonach Sie suchen, oder ob sie zu Ihrer allgemeinen Entwicklungslandschaft passt, aber das erste, was ich versuchen würde, wäre, die Hintergrundfarbe der Schaltfläche im touchDown-Ereignis zu ändern.
Option 1:
Sie würden zwei Ereignisse benötigen, um erfasst zu werden. UIControlEventTouchDown ist für den Fall vorgesehen, dass der Benutzer die Taste drückt. UIControlEventTouchUpInside und UIControlEventTouchUpOutside werden verwendet, wenn sie die Schaltfläche loslassen, um sie in den normalen Zustand zurückzusetzen
Option 2:
Geben Sie ein Bild zurück, das aus der gewünschten Hervorhebungsfarbe erstellt wurde. Dies könnte auch eine Kategorie sein.
und ändern Sie dann den markierten Status der Schaltfläche:
quelle
layer.cornerRadius
Option 2 verwenden und verwenden, müssen Sie sicherstellenclipsToBounds
, dass true festgelegt ist, damit auch die Bildecken abgerundet werden.Es besteht keine Notwendigkeit zum Überschreiben
highlighted
als berechnete Eigenschaft . Sie können den Eigenschaftsbeobachter verwenden, um eine Änderung der Hintergrundfarbe auszulösen:Swift 4
quelle
File>New>File>Cocoa Touch Class
und diese festlegensubclass of UIButton
. Benennen Sie die Datei beispielsweiseCustomButton
, die sowohl zum Dateinamen als auch zum Klassennamen wird. Fügen Sie in diese Datei denoverride var highlighted
oben gezeigten Code ein. Stellen Sie im letzten Schritt den UIButton im Interface Builder so ein, dass er dieseCustomButton
Unterklasse verwendet, indem Sie auf die Seite "Eigenschaften" gehen, auf der "Benutzerdefinierte Klasse" steht und ein Dropdown-Feld angezeigt wird. In grauen Buchstaben wird "UIButton" angezeigt. In der Dropdown-Liste sollte CustomButton angezeigt werden. Wählen Sie diese Option aus, und die Schaltfläche ist jetzt in Unterklassen unterteilt.isHighlighted = false
irgendwo am Anfang explizit aufrufen (zum Beispiel bei der Initialisierung).Eine praktische generische Erweiterung in Swift:
Swift 3.0
quelle
In Swift können Sie den Accessor der hervorgehobenen (oder ausgewählten) Eigenschaft überschreiben, anstatt die setHighlighted-Methode zu überschreiben
quelle
highlighted
es sich um eine Immobilie auf UIButton handelt? Die Antwort ist, dass es sich um eine Eigenschaft in UIControl handelt, von der UIButton erbt.Markierte Variable überschreiben. Durch Hinzufügen können
@IBInspectable
Sie die hervorgehobene Hintergrundfarbe im Storyboard bearbeiten, was ebenfalls hilfreich ist.quelle
eine kompaktere Lösung (basierend auf der Antwort von @ aleksejs-mjaliks ):
Swift 3/4 + :
Swift 2:
Wenn Sie nicht überschreiben möchten, ist dies eine aktualisierte Version von @ timur-bernikowichs Antwort ( Swift 4.2 ):
quelle
UIButton-Erweiterung mit Swift 3+ -Syntax :
Verwenden Sie es wie:
Ursprüngliche Antwort: https://stackoverflow.com/a/30604658/3659227
quelle
Hier ist ein Ansatz in Swift, bei dem eine UIButton-Erweiterung verwendet wird, um eine IBInspectable mit dem Namen hervorgehobenBackgroundColor hinzuzufügen. Ähnlich wie bei Unterklassen, ohne dass eine Unterklasse erforderlich ist.
Ich hoffe das hilft.
quelle
Sie können diese Kategorie verwenden, um die Methode setBackgroundColor: forState: hinzuzufügen.
https://github.com/damienromito/UIButton-setBackgroundColor-forState-
quelle
Meine beste Lösung für Swift 3+ ohne Unterklassen.
Mit dieser Erweiterung ist es einfach, Farben für verschiedene Zustände zu verwalten, und Ihre normale Farbe wird automatisch ausgeblendet, falls keine hervorgehobene Farbe bereitgestellt wird.
quelle
AKTUALISIEREN:
Verwenden Sie die UIButtonBackgroundColor Swift-Bibliothek.
ALT:
Verwenden Sie die folgenden Helfer, um ein 1 x 1 Pixel großes Bild mit einer Graustufenfüllfarbe zu erstellen:
oder eine RGB-Füllfarbe:
Verwenden Sie diese
image
Option, um das Hintergrundbild der Schaltfläche festzulegen:Helfer
Hinweis:
ACU
ist das Klassenpräfix meiner statischen Cocoa Touch-Bibliothek mit dem Namen Acani Utilities, wobei AC für Acani und U für Utilities steht.quelle
Versuche dies !!!!
Für TouchedDown Event Set Eine Farbe und für TouchUpInside die andere.
quelle
- (IBAction)onButtonTouchDragOutside:(UIButton *)sender {
, um sicherzustellen, dass die Farbe nicht eingeschaltet bleibt, wenn der Benutzer versehentlich seinen Finger vom Knopf zieht.Unterklassifizieren Sie den UIButton und fügen Sie überprüfbare Eigenschaften für eine bequeme Verwendung hinzu (geschrieben in Swift 3.0):
quelle
Sie können den UIButton unterordnen und einen schönen forState erstellen.
colourButton.h
colourButton.m
Anmerkungen (Dies ist ein Beispiel, ich weiß, dass es Probleme gibt und hier sind einige)
Ich habe einen NSMutableDictionay verwendet, um die UIColor für jeden Status zu speichern. Ich muss eine unangenehme Textkonvertierung für den Schlüssel durchführen, da der UIControlState kein netter Straight Int ist. Wenn Sie ein Array mit so vielen Objekten initiieren und den Status als Index verwenden könnten.
Aus diesem Grund haben Sie viele Schwierigkeiten, z. B. mit einer ausgewählten und deaktivierten Schaltfläche. Es ist etwas mehr Logik erforderlich.
Ein weiteres Problem ist, wenn Sie versuchen, mehrere Farben gleichzeitig einzustellen. Ich habe es nicht mit einer Schaltfläche versucht, aber wenn Sie dies tun können, funktioniert es möglicherweise nicht
Ich habe angenommen, dass dies StoryBoard ist, es gibt kein init, initWithFrame, also füge sie hinzu, wenn du sie brauchst.
quelle
Swift 5 , danke @Maverick
quelle
Einzelheiten
Lösung
Verwendung
quelle
Versuchen Sie dies, wenn Sie ein Bild haben:
oder sehen Sie, ob
showsTouchWhenHighlighted
es Ihnen reicht.quelle
Ich habe eine UIButton-Unterklasse, STAButton , als Open-Source-Lösung ausgewählt , um diese Lücke zu schließen. Verfügbar unter der MIT-Lizenz. Funktioniert für iOS 7+ (ich habe nicht mit älteren iOS-Versionen getestet).
quelle
Um dieses Problem zu lösen, habe ich eine Kategorie erstellt,
backgroundColor
mit der Zustände behandelt werden könnenUIButtons
:ButtonBackgroundColor-iOS
Sie können die Kategorie als Pod installieren .
Einfache Verwendung mit Objective-C
Noch einfacher mit Swift zu bedienen :
Ich empfehle Ihnen, den Pod zu importieren mit:
Use_frameworks verwenden! in Ihrem Podfile erleichtert die Verwendung Ihrer Pods mit Swift und Objective-C.
WICHTIG
Ich habe auch einen Blog-Beitrag mit weiteren Informationen geschrieben.
quelle
quelle
Verwenden Sie https://github.com/swordray/UIButtonSetBackgroundColorForState
Mit CocoaPods zum Podfile hinzufügen
Schnell
Ziel c
quelle
Versuchen Sie
tintColor
:quelle
NSLog(@"%@", _button);
?UIButtonTypeCustom
.Hier ist der Code in Swift, den Sie für den Schaltflächenstatus auswählen können:
Beispiel:
quelle
Legen Sie es ab und Sie können loslegen : * Die Eigenschaft kann in IB eingestellt werden. Wenn kein hervorgehobener Hintergrund festgelegt ist, ändert sich der Hintergrund nicht, wenn Sie darauf drücken
quelle
Die folgende
UIIImage
Erweiterung generiert ein Bildobjekt mit dem angegebenen Farbparameter.Eine beispielhafte Verwendung für eine Schaltfläche kann für das Schaltflächenobjekt wie folgt angewendet werden:
quelle
Einfach ist, dass Sie NUR diese UIButton-Erweiterung verwenden
und benutze dies
quelle
Wenn Sie nicht überschreiben möchten, setzen Sie einfach zwei Aktionen: touchDown touchUpInside
quelle
Swift 3:
quelle
in Swift 5
Für diejenigen, die keinen farbigen Hintergrund verwenden möchten, um den ausgewählten Status zu übertreffen
Sie können das Problem einfach lösen, indem Sie die Anweisung #Selector & if verwenden, um die UIButton-Farben für jeden Status einfach und individuell zu ändern
Beispielsweise:
quelle