Z jakiegoś powodu, kiedy próbuję animować textColor, to nie zadziała. TextColor po prostu nagle zmienia się z A na B. Czy można go animować, powiedzmy z czerwonego na czarny?
Z jakiegoś powodu, kiedy próbuję animować textColor, to nie zadziała. TextColor po prostu nagle zmienia się z A na B. Czy można go animować, powiedzmy z czerwonego na czarny?
Odpowiedzi:
Ta odpowiedź jest przestarzała i nie jest dobrym rozwiązaniem na pierwotne pytanie. Odpowiedź @strange poniżej jest znacznie lepsza i powinna być używana zamiast tej odpowiedzi: https://stackoverflow.com/a/20892927/76559
// Stara odpowiedź poniżej
textColor
Nieruchomość nie jest określony jako animatable w docs, więc nie sądzę, można to zrobić za pomocą prostego bloku animacji UIView ...
Można to prawdopodobnie zrobić dość prymitywnie, NSTimer
wypalając co kilka milisekund, za każdym razem ustawiając kolor stopniowo od jednego do drugiego.
Mówię, że jest to surowe, ponieważ wymagałoby tablicy lub innego pojemnika z ustawionymi wartościami kolorów przechodzącymi od koloru początkowego do koloru końcowego, i jestem pewien, że jest sposób, aby to zrobić za pomocą podstawowej animacji lub czegoś podobnego, po prostu nie robię wiem, co to jest.
CADisplayLink
raczej używać NSTimer
animacji jazdy niż ręcznie, ponieważ jest ona zsynchronizowana z aktualizacjami wyświetlania. Zobacz sesję 236 WWDC 2014: Interruptible and Responsive Interactions w budynku około godziny 13:00.
Zamiast tego, jeśli próbowałeś użyć przejścia przenikania na samym obiekcie w ten sposób, da ci to ładny efekt zanikania z jednego koloru na drugi:
Cel C
[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
myLabel.textColor = NEW_COLOR;
} completion:^(BOOL finished) {
}];
Szybki
UIView.transitionWithView(creditsLabel, duration: 0.25, options: .TransitionCrossDissolve, animations: {
self.creditsLabel.textColor = UIColor.redColor()
},
completion: nil)
Jest to lepsze niż używanie NSTimerów, CATextLayers i tak dalej z różnych powodów. CATextLayer nie ma odpowiedniej obsługi kerningu tekstu ani NSAttributedText, a NSTimery są opóźnione (plus jest za dużo kodu). Powyższa animacja przejścia załatwia sprawę i może być również użyta w animacji łańcucha. Miałem ten sam problem i wypróbowałem już powyższe rozwiązania, ale zamiast tego ten prosty kod działa cuda.
UIView.transitionWithView(creditsLabel, duration: 0.3, options: .TransitionCrossDissolve, animations: { self.creditsLabel.textColor = UIColor.redColor() }, completion: nil)
Rozwiązanie Swift 4 :
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
UILabel
dla with
właściwości. Jeśli zrobisz coś podobnego transition(with: outerView.label…)
i spróbujesz umieścić to w środku, po cichu zawiedzie.
options: .easeInOut
, że tak było , więc zmieniłem to na .transitionCrossDissolve
i działałem.
Powodem, dla którego textColor nie można animować, jest to, że UILabel używa zwykłego CALayer zamiast CATextLayer.
Aby umożliwić animację textColor (jak również tekst, czcionkę itp.), Możemy utworzyć podklasę UILabel, aby używała CATextLayer.
To sporo pracy, ale na szczęście już to zrobiłem :-)
W tym artykule można znaleźć pełne wyjaśnienie + zastępczy zamiennik oprogramowania typu open source dla UILabel
Możesz spróbować utworzyć inną instancję UILabel lub cokolwiek innego, co ma textColor, a następnie zastosować animację między tymi dwoma instancjami (ze starym textColor i tym z nowym textColor).
To była JEDYNA rzecz, która działała dla mnie:
let changeColor = CATransition()
changeColor.duration = 1
CATransaction.begin()
CATransaction.setCompletionBlock {
selected.label.layer.addAnimation(changeColor, forKey: nil)
selected.label.textColor = .blackColor()
}
selected.nameLabel.textColor = .redColor()
CATransaction.commit()
Oto mój kod do animacji koloru tekstu etykiety. Ważnym elementem jest ustalenie textColor do clearColor przed animacją
label.textColor = [UIColor clearColor];
[UIView transitionWithView:label duration:duration/4 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
label.textColor = self.highlightedCellPrimaryTextColor;
} completion:^(BOOL finished) { }];
zaktualizowany swift 3.0
Właśnie zmieniłem z komentarzy @budidino
UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)
Dzięki za odpowiedź @ Strange , działającą doskonale w Swift 5, Xcode 11 z niewielką zmianą składni. Animowałem kolor tekstu dla wielu etykiet UIL. Jeśli tak jest, spróbuj tego
for label in [label1, label2, ...] as [UILabel] { // loop through a @IBOutlet UILabel array
UIView.transition(with: label, duration: 0.3, options: .transitionCrossDissolve, animations: {
label.textColor = .label
}, completion: nil)
}