2012-07-15 30 views

Odpowiedz

6

NSTimer ma absolutnie żadnego dobra jako narzędzie animacji, ani też nie powinno być stosowane do pomiaru czasu w ogóle, gdzie jest potrzebna precyzja (klatek) Ten blog post doskonale ilustruje mój pozycja, co zrobić z nieanimowanymi właściwościami UILabel, które powinny zostać wysłane do serwera renderowania za pośrednictwem CA, a nie NSTimer. Zamiast UILabel można używać lub owijać CATextLayer i animować jego właściwość foregroundColor w standardowym bloku animacji.

+0

Łącze jest zepsute, byłoby dobrze z przykładem ... – user1506145

+2

Łącze nie jest zepsute ... – CodaFi

0

Oczywiście trzeba by użyć

[UIButton setTitleColor:[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0] forState:UIControlStateNormal]; 

Co do rzeczywiście się go ożywić i zmienić kolor z czasem, trzeba by utworzyć wystąpienie NSTimer i użyć paramater @selector aby skierować go do konkretna metoda do uruchomienia. Za każdym razem, gdy timer się uruchomi, uruchamia metodę, która następnie zmienia kolor twojego Uibutton.

[NSTimer scheduledTimerWithTimeInterval:2.0f 
     target:self 
    selector:@selector(updateCounter:) 
    userInfo:nil 
    repeats:YES]; 

Sprawdź również: http://servin.com/iphone/iPhone-Timers-and-Animated-Views.html

+0

Uzgodnione. +1 dla linku – bkbeachlabs

+0

Należy pamiętać, że nie zastąpi to dobrej animacji CA CA. Obiekty UIColor mogą nie być animowane, ale obiekty CGColor są absolutnie. Gdybyś mógł stworzyć podklasę UILabel, możesz zaimplementować własne renderowanie tekstu i korzystać z nieodłącznych animacji CA. – CodaFi

-2

Ten isnt naprawdę animacja, ale to działa.

Utwórz zegar o dowolnej częstotliwości, z jaką chcesz animować kolory.

Niech ten zegar wywoła metodę, changeColorOnButton przy każdym uruchomieniu.

[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(changeColorOnButton:) userInfo:nil repeats:YES]; 

Utwórz tablicę kolorów, colorsArray (albo zorganizować kolory z wyprzedzeniem, lub dodać kilka do tablicy i przetasować je losowo. Załóż int, intForColorInArray.

W metodzie changeColorOnButton , zrób coś takiego:.

- (void) changeColorOnButton:(UIButton *) button { 

    UIColor *nextColor = [colorsArray objectAtIndex:intForColorArray]; 
    [button.titleLabel.setTextColor:nextColor]; 
    intForColorArray = (intForColorArray +1) % [colorsArray count]; 
} 
+0

wziął metodę timera z @Stuartsoft. Kredyt, na który należy się kredyt. – bkbeachlabs

1

To odpowiada bardzo dobrze here. W zasadzie używa tego przydatnego faceta: [UIView transitionWithView: duration: options: animations: ^() completion: ^()];

13

Zastosowanie przejście z widoku

[UIView transitionWithView:backButton 
          duration:0.5f 
          options:UIViewAnimationOptionTransitionCrossDissolve 
         animations:^{ 
          [backButton setTitleColor:[_peacock lighten:d.primary] forState:UIControlStateNormal]; 
         } 
         completion:^(BOOL finished){ 
         }]; 
+1

Działa świetnie.Możesz również użyć widoku rodzica jako głównego celu, a następnie animować wszystkie widoki podrzędne w wybrany sposób w bloku 'animacje' – Peterdk

0

Można użyć dwóch przycisków (lub etykiet, itp) o różnych kolorach, które umieszczone w tej samej pozycji:

button1 = UIButton(frame: frame) 
button2 = UIButton(frame: frame) // same frame 

button1.setTitleColor(UIColor.redColor(), forState: .Normal) // red 
button2.setTitleColor(UIColor.blueColor(), forState: .Normal) // blue 

Po tym można dotrzeć animację kolorach przez przejście animacja przycisku 2:

UIView.animateKeyframesWithDuration(
    1.0, delay: 0, options: [.Autoreverse, .Repeat], 
    animations: { 
     UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.5, animations: { 
      self.button2.alpha = 1.0 
     }) 

     UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.5, animations: { 
      self.button2.alpha = 0.0 
     }) 
    }, completion: nil)