2010-03-11 32 views

Odpowiedz

4

Obiekt textColour nie jest określony jako animateable w docs, więc nie sądzę, można to zrobić za pomocą prostego UIView animacje bloku ...

Można to prawdopodobnie dość prymitywnie wykonane z NSTimer strzelanie co kilka milisekund, za każdym razem ustawianie koloru stopniowo od jednego do drugiego.

Mówię, że jest to prymitywne, ponieważ wymagałoby tablicy lub innego pojemnika z ustawionymi wartościami kolorów, począwszy od koloru początkowego do koloru końcowego, i jestem pewien, że jest sposób, w jaki można to zrobić za pomocą animacji rdzenia lub czegoś podobnego. , Po prostu nie wiem, co to jest.

+0

czyli funkcją wyrzuca tablicę wartości RGB pomiędzy A i B w określonej części. Nie wiem jednak nic o algorytmach kolorów. – dontWatchMyProfile

+0

tutaj są dobre obejścia: [tutaj] (http://stackoverflow.com/questions/6442774/is-uilabels-backgroundcolor-not-animatable/6442868#6442868) i [tutaj] (http://stackoverflow.com/a/3947389/1076848) dzięki Anna Karenina – jackal

+4

należy użyć 'CADisplayLink' zamiast' NSTimer' do ręcznego prowadzenia animacji, gdyż jest zsynchronizowany z aktualizacji wyświetlania. Zobacz [Sesja WWDC 2014 236: Tworzenie Interruptible and Responsive Interactions] (https://developer.apple.com/videos/play/wwdc2014-236/) około 13:00. –

9

Możesz spróbować utworzyć kolejną 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).

11

Powodem, dla którego funkcja textColor nie może być animowana, jest to, że UILabel używa zwykłej CALayer zamiast CATextLayer.

Aby uczynić textColor animatable (jak również tekst, czcionkę, itp.) Możemy podklasę UILabel, aby użyć CATextLayer.

To dość dużo pracy, ale na szczęście ja już to zrobił :-)

można znaleźć kompletne wyjaśnienie + spadek zamiennik open source dla UILabel w tym article

+0

tak wygląda świetnie, bardzo dużo! – Nils

0

znalazłem to bardzo łatwe umieszczanie UIView pod etykietą i animowanie jej nieprzezroczystości. Etykieta musi zostać dodana do tego widoku. Może nie jest to dobre rozwiązanie z punktu widzenia zużycia zasobów, ale całkiem proste.

131

Zamiast masz spróbował wykorzystać Przenikanie przejście na obiekcie sama jak ta, będzie ona daje piękny Fade-in-out blaknięcie efekt z jednego koloru do drugiego:

[UIView transitionWithView:myLabel duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
    myLabel.textColor = NEW_COLOR; 
} completion:^(BOOL finished) { 
}]; 

To jest lepsze niż używanie NSTimers, CATextLayers i tak dalej z różnych powodów. CATextLayer nie ma odpowiedniego wsparcia dla kerningu tekstowego lub NSAttributedText, a NSTimery są opóźnione (plus za dużo kodu). Powyższa animacja przejścia obsługuje sztuczkę, a także może być użyta w animacji łańcucha. Miałem ten sam problem i już wypróbowałem powyższe rozwiązania, ale ten prosty kod działa zamiast cudów.

+6

Ładne, eleganckie, w rzeczywistości najlepsze i najczystsze rozwiązanie. – maksa

+13

Świetnie. Pracuje w Swift tylko samo: 'UIView.transitionWithView (creditsLabel, czas trwania: 0,3, opcje: .TransitionCrossDissolve, animacje: {self.creditsLabel.textColor = UIColor.redColor()}, realizacja: zero)' – SimplGy

+0

Great! dzięki. prosty! – Itzdsp

4

Oto mój kod do animowania 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) { }]; 
16

Swift 4 rozwiązanie:

UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: { 
    self.yourLabel.textColor = .red 
}, completion: nil) 
-1

aktualizowane Swift 3.0

prostu zmieniony z @budidino uwagi

UIView.transition(with: my.label, duration: 0.3, options: .transitionCrossDissolve, animations: { my.label.textColor = .black }, completion: nil)