W iOS 7 moje tytuły UIButton pojawiają się i pojawiają w niewłaściwym czasie - późno. Ten problem nie pojawia się w iOS 6. Po prostu używam:
[self setTitle:text forState:UIControlStateNormal];
Wolałbym, żeby stało się to natychmiast i bez pustej ramki. Mrugnięcie jest szczególnie rozpraszające i odciąga uwagę od innych animacji.
self.button.titleLabel.text = text
. Ale to nie zmienia rozmiaru ramki etykiety i nie działa poprawnie z UIControlStatesOdpowiedzi:
Działa to w przypadku niestandardowych przycisków:
W przypadku przycisków systemowych musisz to dodać przed ponownym włączeniem animacji (dziękuję @Klaas):
źródło
[_button layoutIfNeeded];
Użyj tej
performWithoutAnimation:
metody, a następnie wymuś natychmiastowe rozmieszczenie układu zamiast później.źródło
[button layoutIfNeeded];
wewnątrz bloku.Zmień typ przycisku na niestandardowy konstruktor interfejsu formularza.
To zadziałało dla mnie.
źródło
W Swift możesz użyć:
źródło
layoutIfNeeded()
przycisk zostanie oznaczony jako wymagający ponownego przerysowania, ale nie stanie się to, dopóki nie przejdzie następny układ, który będzie pozaperformWithoutAnimation
Proszę zanotować :
gdy „ buttonType ” przycisku _ ma wartość „UIButtonTypeSystem” , poniższy kod jest nieprawidłowy:
gdy „ buttonType ” przycisku _ ma wartość „UIButtonTypeCustom” , powyższy kod jest prawidłowy .
źródło
Począwszy od iOS 7.1 jedynym rozwiązaniem, które działało dla mnie, było zainicjowanie przycisku z typem
UIButtonTypeCustom
.źródło
więc znajduję działające rozwiązanie:
najpierw zmieniamy tytuł przycisku, a następnie zmieniamy rozmiar przycisku dla tego tytułu
źródło
Ustaw typ przycisku na UIButtonTypeCustom, a przestanie migać
źródło
Szybki 5
źródło
Zrobiłem rozszerzenie Swift, aby to zrobić:
Działa dla mnie na iOS 8 i 9, z
UIButtonTypeSystem
.(Kod dotyczy Swift 2, Swift 3 i Cel-C powinien być podobny)
źródło
Ustaw typ UIButton jako Niestandardowy. To powinno usunąć animacje pojawiania się i zanikania.
źródło
Zwykle po prostu ustawienie typu przycisku na Niestandardowy działa dla mnie, ale z innych powodów musiałem podklasować UIButton i ustawić typ przycisku z powrotem na domyślny (System), więc miganie pojawiło się ponownie.
Ustawienie
UIView.setAnimationsEnabled(false)
przed zmianą tytułu, a potem ponownie na prawdę, nie uniknęło mrugania dla mnie, bez względu na to, czy zadzwoniłem,self.layoutIfNeeded()
czy nie.To i tylko to w następującej dokładnej kolejności działało dla mnie z iOS 9 i 10 beta:
1) Utwórz podklasę dla UIButton (nie zapomnij też ustawić niestandardowej klasy dla przycisku w Storyboard).
2) Zastąp
setTitle:forState:
w następujący sposób:W Konstruktorze interfejsów możesz pozostawić typ przycisku na System, nie musisz zmieniać go na Typ niestandardowy, aby to podejście działało.
Mam nadzieję, że to pomaga komuś innemu, tak długo walczyłem z irytującymi migającymi przyciskami, że mam nadzieję, że uniknę tego innym;)
źródło
layoutIfNeeded()
:]Możesz po prostu utworzyć przycisk Niestandardowy, który zatrzyma animację podczas zmiany tytułu.
możesz to również zrobić w polu wyboru Scenorys: wybierz przycisk w serii ujęć -> wybierz inspektor atrybutów (czwarty z lewej strony) -> z menu rozwijanego „Typ” wybierz „Niestandardowy” zamiast „System”, który prawdopodobnie został wybrany .
Powodzenia!
źródło
Możesz usunąć animacje z warstwy etykiety tytułu:
źródło
Swift 4 wersja odpowiedzi Xhacker Liu
źródło
UIButton z
system
typem ma domyślną animacjęsetTitle(_:for:)
. Możesz to naprawić na dwa różne sposoby:custom
, z kodu lub Konstruktora interfejsów:źródło
Przekonałem się, że to obejście działa również z UIButtonTypeSystem, ale zadziała tylko wtedy, gdy przycisk jest z jakiegoś powodu włączony .
Musisz je dodać, jeśli chcesz wyłączyć przycisk podczas ustawiania jego tytułu.
(iOS 7, Xcode 5)
źródło
[_button setTitle:@"title" forState:UIControlStateDisabled]
Połączenie powyższych świetnych odpowiedzi daje w rezultacie następujące obejście dla UIButtonTypeSystem :
źródło
Mam brzydki problem z animacją podczas zmiany tytułów przycisków w kontrolerach widoku w UITabBarController. Tytuły, które zostały pierwotnie ustawione w serii ujęć, pojawiły się na krótko, zanim zaczęły pojawiać się nowe wartości.
Chciałem iterować przez wszystkie podviewy i używać tytułów przycisków jako kluczy, aby uzyskać ich zlokalizowane wartości za pomocą NSLocalizedString, takich jak;
Dowiedziałem się, że to, co wyzwala animację, to tak naprawdę wywołanie btn.titleLabel.text. Aby nadal korzystać ze scenariuszy i dynamicznie lokalizować komponenty w ten sposób, ustawiam identyfikator przywracania każdego przycisku (w Inspektorze tożsamości) na taki sam jak tytuł i używam go jako klucza zamiast tytułu;
Nie idealne, ale działa ..
źródło
Możesz ustawić tytuł poza blokiem animacji, pamiętaj tylko o wywołaniu
layoutIfNeeded()
wewnątrz performWithoutAnimation:Jeśli masz kilka przycisków, rozważ wywołanie
layoutIfNeeded()
super widoku:źródło
Rozszerzenie Xhacker Liu przekonwertowane na Swift 3:
źródło
Może lepszym rozwiązaniem jest wygenerowanie 2 animacji i 2 przycisków, aby uniknąć problemu z animacją i zmianą tekstu przycisku?
Utworzyłem drugi przycisk uibutton i wygenerowałem 2 animacje, to rozwiązanie działa bez żadnych problemów.
źródło
Mam do pracy z kombinacją odpowiedzi:
źródło
Wygodne rozszerzenie do zmiany tytułu animowanego przycisku w Swift, które ładnie współpracuje z domyślną implementacją:
źródło
UIButton
.