ios - Come animare il colore di sfondo di un UILabel?





iphone core-animation (10)


Eseguire manualmente l'animazione del colore, basata su una callback NSTimer o CADisplayLink con una frequenza fotogrammi ragionevole (ad esempio 20 fps). Dovrai calcolare la tua curva di cambio colore in RGB o HSV in base al tempo trascorso frazionario durante il tempo di animazione completo (2,0 secondi nell'esempio), oppure utilizzare una matrice di 40 colori intermedi.

Sembra che dovrebbe funzionare, ma non lo fa. Il colore diventa verde in una volta.

self.labelCorrection.backgroundColor = [UIColor whiteColor];
[UIView animateWithDuration:2.0 animations:^{
    self.labelCorrection.backgroundColor = [UIColor greenColor];
}];



Recentemente mi sono imbattuto in questo problema e dopo alcune ricerche ho capito che sostanzialmente non è cambiato nulla (e probabilmente non lo sarà in futuro), quindi ho finito con l'utilizzo del framework POP di Facebook (non solo) per quello.

Puoi facilmente realizzare animazioni di proprietà di base su entrambe le viste e livelli, ma in aggiunta, fornisce una transizione graduale tra i colori (e praticamente qualunque cosa tu voglia, anche i tuoi tipi personalizzati, con qualche codifica aggiuntiva). Quindi per il colore di sfondo, dovresti fare qualcosa del genere:

   // Create spring animation (there are more types, if you want)
   let animation = POPSpringAnimation(propertyNamed: kPOPViewBackgroundColor)

   // Configure it properly
   animation.autoreverses = false
   animation.removedOnCompletion = true
   animation.fromValue = UIColor.yourBeginningColor()
   animation.toValue = UIColor.yourFinalColor()

   // Add new animation to your view - animation key can be whatever you like, serves as reference
   label.pop_addAnimation(animation, forKey: "YourAnimationKey")

Viola, ora puoi animare i colori di sfondo su tutto ciò che ha quella proprietà!




veloce

  1. ( importante ) Impostare il colore di sfondo di UILabel per cancellare (in IB o nel codice). Per esempio:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        myLabel.backgroundColor = UIColor.clear
    }
    
  2. Animare il colore di sfondo del livello.

    @IBAction func animateButtonTapped(sender: UIButton) {
    
        UIView.animate(withDuration: 1.0, animations: {
            self.myLabel.layer.backgroundColor = UIColor.red.cgColor
        })
    }
    

Si noti che CGColor viene aggiunto dopo UIColor .

Risultato




Ecco il riferimento:

animazioni Un oggetto blocco contenente le modifiche da impegnare alle viste. Qui è dove si modifica a livello di programmazione tutte le proprietà animabili delle viste nella gerarchia della vista. Questo blocco non accetta parametri e non ha alcun valore di ritorno. Questo parametro non deve essere NULL

Quello che capisco di questo è quando la tua vista chiama il blocco dell'animazione, quindi il tuo colore di sfondo dell'etichetta vista è commesso in verde da quel momento. Quindi, se non si cambia il colore dello sfondo dell'etichetta in qualcos'altro, allora sarà sempre verde. Questo è quello che immagino




Se non vuoi approfondire Quartz, per rispondere a una delle risposte prev, crea un UIView vuoto delle stesse dimensioni di UILabel e posizionalo nello stesso punto di UILabel (e in ordine Z, sotto di esso) e puoi animare il colore di sfondo di UIView (l'ho provato e funziona per me).




È possibile animarlo, ma ho dovuto prima impostarlo (programmaticamente) su clearColor per qualche motivo. Senza quello, l'animazione non funzionava o non era visibile.

Sto animando il colore di sfondo di un UILabel in una cella di tabella personalizzata. Ecco il codice nel metodo willDisplayCell. Non proverei a impostare l'animazione in cellForRow, dal momento che gran parte del layout viene aggiustata dal tavolo.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
        ((RouteListCell *)cell).name.backgroundColor = [UIColor clearColor];
        [((RouteListCell *)cell).name backgroundGlowAnimationFromColor:[UIColor whiteColor] toColor:[UIColor redColor] clearAnimationsFirst:YES];
}

Ecco la mia routine di animazione:

-(void) backgroundGlowAnimationFromColor:(UIColor *)startColor toColor:(UIColor *)destColor clearAnimationsFirst:(BOOL)reset;
{
    if (reset)
    {
        [self.layer removeAllAnimations];
    }

    CABasicAnimation *anAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    anAnimation.duration = 1.00;
    anAnimation.repeatCount = HUGE_VAL;
    anAnimation.autoreverses = YES;
    anAnimation.fromValue = (id) startColor.CGColor; // [NSNumber numberWithFloat:1.0];
    anAnimation.toValue = (id) destColor.CGColor; //[NSNumber numberWithFloat:0.10];
    [self.layer addAnimation:anAnimation forKey:@"backgroundColor"];
}



Per favore prova questo,

[UIView transitionWithView:yourView duration:0.2 options:UIViewAnimationOptionTransitionNone animations:^{

[yourView setBackgroundColor:[UIColor colorWithRed:0.8588 green:0.8588 blue:0.8588 alpha:1]];
    }completion:^(BOOL finished) {

 }];

Per me funziona.




Non riesco a trovarlo documentato da nessuna parte, ma sembra che la proprietà backgroundColor di UILabel non sia animabile, poiché il tuo codice funziona bene con un UIView vaniglia. Questo trucco sembra funzionare, tuttavia, purché non si imposti il ​​colore di sfondo della vista etichetta stessa:

#import <QuartzCore/QuartzCore.h>

...

theLabel.layer.backgroundColor = [UIColor whiteColor].CGColor;

[UIView animateWithDuration:2.0 animations:^{
    theLabel.layer.backgroundColor = [UIColor greenColor].CGColor;
} completion:NULL];



Swift 3

Per animare il colore dello sfondo dell'etichetta da bianco a verde, imposta l'etichetta in questo modo:

self.labelCorrection.backgroundColor = UIColor.clear
self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor

Animare in questo modo:

UIView.animate(withDuration: 2.0) { 
    self.labelCorrection.layer.backgroundColor = UIColor.green.cgColor
}

Per tornare allo stato originale, in modo da poter nuovamente animare, assicurati di rimuovere le animazioni:

self.labelCorrection.layer.backgroundColor = UIColor.white.cgColor
self.labelCorrection.layer.removeAllAnimations()



Dipende o che tipo di applicazione stai cercando di codificare. Skype è registrato come app VoIP (app a lunga durata) ed è per questo che può rimanere "in esecuzione" anche se è sullo sfondo.

Apple separa le app in tre:

  • Esecuzione di attività a lunghezza finita (è possibile eseguire attività per un tempo limitato)
  • Download di contenuti in background (puoi scaricare il contenuto per presentarlo all'utente quando l'app diventa di nuovo attiva)
  • Implementazione di attività a esecuzione prolungata (questa è la categoria di app in background più interessante, con alcune sottocategorie che lo sviluppatore dovrebbe definire per la tua app)

    • App che riproducono contenuti audio per l'utente mentre sono sullo sfondo, ad esempio un'app di un lettore musicale
    • App che registrano contenuti audio mentre sono in background
    • App che tengono gli utenti sempre aggiornati sulla loro posizione, come un'app di navigazione
    • App che supportano Voice over Internet Protocol (VoIP) (SKYPE è qui)
    • App che devono scaricare e elaborare regolarmente nuovi contenuti
    • App che ricevono aggiornamenti regolari da accessori esterni

Pertanto, è necessario valutare in quale categoria si trova l'app e in che modo viene eseguita l'operazione di servizio. Forse se stai inviando alcune piccole cose al servizio, l'approccio migliore è solo quello di richiedere un po 'di tempo extra in background per fare il lavoro.

Maggiori informazioni su tutto questo sono su questo link:

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html





ios iphone core-animation