In iOS 7 werden meine UIButton-Titel zur falschen Zeit ein- und ausgeblendet - spät. Dieses Problem tritt unter iOS 6 nicht auf. Ich verwende nur:
[self setTitle:text forState:UIControlStateNormal];
Ich würde es vorziehen, wenn dies sofort und ohne leeren Rahmen geschieht. Dieses Blinken lenkt besonders ab und lenkt die Aufmerksamkeit von anderen Animationen ab.
self.button.titleLabel.text = text
. Aber dies ändert nicht die Größe des Etikettenrahmens und funktioniert nicht richtig mit UIControlStatesAntworten:
Dies funktioniert für benutzerdefinierte Schaltflächen:
Für Systemschaltflächen müssen Sie dies hinzufügen, bevor Sie Animationen wieder aktivieren (danke @Klaas):
quelle
[_button layoutIfNeeded];
Verwenden Sie die
performWithoutAnimation:
Methode und erzwingen Sie dann, dass das Layout sofort statt später erfolgt.quelle
[button layoutIfNeeded];
innerhalb des Blocks aufrufen .Ändern Sie den Schaltflächentyp in den Builder für benutzerdefinierte Formularschnittstellen.
Das hat bei mir funktioniert.
quelle
In Swift können Sie verwenden:
quelle
layoutIfNeeded()
wird die Schaltfläche als neu gezeichnet markiert, dies geschieht jedoch erst beim nächsten Layout-Durchgang, der sich außerhalb desperformWithoutAnimation
Bitte beachten Sie :
Wenn " buttonType " von _button "UIButtonTypeSystem" ist , ist der folgende Code ungültig :
Wenn " buttonType " von _button "UIButtonTypeCustom" ist , ist der obige Code gültig .
quelle
Ab iOS 7.1 war die einzige Lösung, die für mich funktionierte, die Initialisierung der Schaltfläche mit Typ
UIButtonTypeCustom
.quelle
Also finde ich eine funktionierende Lösung:
Zuerst ändern wir den Titel für die Schaltfläche und ändern dann die Größe der Schaltfläche für diesen Titel
quelle
Setzen Sie den Schaltflächentyp auf UIButtonTypeCustom und er hört auf zu blinken
quelle
Swift 5
quelle
Ich habe eine Swift-Erweiterung erstellt, um dies zu tun:
Funktioniert für mich unter iOS 8 und 9 mit
UIButtonTypeSystem
.(Der Code für Swift 2, Swift 3 und Objective-C sollte ähnlich sein.)
quelle
Legen Sie den UIButton-Typ als Benutzerdefiniert fest. Das sollte Ein- und Ausblenden von Animationen entfernen.
quelle
Normalerweise funktioniert es für mich, einfach den Schaltflächentyp auf Benutzerdefiniert zu setzen. Aus anderen Gründen musste ich UIButton unterordnen und den Schaltflächentyp auf den Standardwert (System) zurücksetzen, damit das Blinken wieder angezeigt wurde.
Das Einstellen
UIView.setAnimationsEnabled(false)
vor dem Ändern des Titels und danach wieder auf "Wahr" hat das Blinken für mich nicht vermieden, egal ob ich angerufen habeself.layoutIfNeeded()
oder nicht.Dies und nur dies in der folgenden genauen Reihenfolge funktionierte bei iOS 9 und 10 Beta:
1) Erstellen Sie eine Unterklasse für UIButton (vergessen Sie nicht, die benutzerdefinierte Klasse für die Schaltfläche auch im Storyboard festzulegen).
2) Überschreiben Sie
setTitle:forState:
wie folgt:In Interface Builder können Sie den Schaltflächentyp dem System überlassen, ohne ihn in Benutzerdefinierten Typ ändern zu müssen, damit dieser Ansatz funktioniert.
Ich hoffe das hilft jemand anderem, ich habe so lange mit den nervigen blinkenden Knöpfen gekämpft, dass ich hoffe, es anderen zu vermeiden;)
quelle
layoutIfNeeded()
:]Sie können einfach eine benutzerdefinierte Schaltfläche erstellen, die beim Ändern des Titels nicht mehr animiert wird.
Sie können dies auch im Kontrollkästchen "Storyboard" tun: Wählen Sie die Schaltfläche im Storyboard -> wählen Sie den Attributinspektor (vierter von links) -> wählen Sie im Dropdown-Menü "Typ" die Option "Benutzerdefiniert" anstelle von "System", das wahrscheinlich ausgewählt wurde .
Viel Glück!
quelle
Sie können die Animationen aus der Ebene des Titeletiketts entfernen:
quelle
Swift 4 Version von Xhacker Liu Antwort
quelle
UIButton mit
system
Typ hat implizite Animation aktiviertsetTitle(_:for:)
. Sie können das Problem auf zwei verschiedene Arten beheben:custom
entweder im Code oder im Interface Builder auf ein:quelle
Ich habe festgestellt , dass diese Problemumgehung funktioniert mit UIButtonTypeSystem als gut , aber nur funktionieren , wenn die Taste aktiviert aus irgendeinem Grunde.
Sie müssen diese also hinzufügen, wenn die Schaltfläche beim Festlegen des Titels deaktiviert werden soll.
(iOS 7, Xcode 5)
quelle
[_button setTitle:@"title" forState:UIControlStateDisabled]
Die Kombination der oben genannten hervorragenden Antworten führt zu folgender Problemumgehung für UIButtonTypeSystem :
quelle
Ich habe das hässliche Animationsproblem beim Ändern von Schaltflächentiteln in View-Controllern in einem UITabBarController. Die Titel, die ursprünglich im Storyboard festgelegt wurden, wurden für kurze Zeit angezeigt, bevor sie in ihre neuen Werte übergingen.
Ich wollte alle Unteransichten durchlaufen und die Schaltflächentitel als Schlüssel verwenden, um ihre lokalisierten Werte mit NSLocalizedString abzurufen, z.
Ich fand heraus, dass das, was die Animation auslöst, wirklich der Aufruf von btn.titleLabel.text ist. Um die Storyboards weiterhin zu nutzen und die Komponenten so dynamisch zu lokalisieren, stelle ich sicher, dass die Wiederherstellungs-ID jeder Schaltfläche (im Identitätsinspektor) mit dem Titel identisch ist und diese als Schlüssel anstelle des Titels verwendet wird.
Nicht ideal, funktioniert aber ..
quelle
Sie können den Titel tatsächlich außerhalb eines Animationsblocks
layoutIfNeeded()
festlegen. Rufen Sie nur innerhalb einer performWithoutAnimation auf:Wenn Sie eine Reihe von Schaltflächen haben, rufen Sie einfach die Superansicht
layoutIfNeeded()
auf:quelle
Die Xhacker Liu-Erweiterung wurde in Swift 3 konvertiert:
quelle
Vielleicht ist das Generieren von 2 Animationen und 2 Schaltflächen eine bessere Lösung, um das Problem zu vermeiden, das beim Animieren und Ändern des Textes einer Schaltfläche auftritt?
Ich habe einen zweiten Uibutton erstellt und 2 Animationen generiert. Diese Lösung funktioniert ohne Probleme.
quelle
Ich habe es mit einer Kombination von Antworten zum Laufen gebracht:
quelle
Eine praktische Erweiterung für die Änderung von animierten Schaltflächentiteln in Swift, die mit der Standardimplementierung gut funktioniert:
quelle
UIButton
.