2013-08-22 18 views
6

posso creare una maschera simile a questo:Animare la maschera per un UIView

CALayer *mask = [CALayer layer]; 
    mask.contents = (id)[[UIImage imageNamed:@"mask.png"] CGImage]; 
    mask.frame = CGRectMake(0, 0, 10, 10); 
    self.content.layer.mask = mask; 

E questo sarà correttamente rivelare l'alto a sinistra di 10 pixel di mio contenuto (perché mask.png è solo un'immagine nera). Tuttavia voglio animare la maschera per rivelare il resto del contenuto:

[UIView animateWithDuration:3.0 
        animations:^{ 
         mask.frame = self.content.bounds; 
        } 
        completion:^(BOOL finished){ 

        }]; 

Il problema è che non c'è nessuna animazione. L'intero contenuto viene visualizzato immediatamente. Perché ciò accade e come posso animare la maschera in modo che il contenuto venga rivelato in alto a sinistra?

risposta

14

Il frame è una proprietà derivata di varie altre proprietà, ad esempio la posizione, i limiti, il punto di ancoraggio e qualsiasi trasformazione a esso applicata. Non è consigliabile animare direttamente questa proprietà, specialmente quando si ha a che fare con livelli di CoreAnimation di livello inferiore.

In questo caso, suppongo che vogliate animare i limiti. È possibile utilizzare il metodo di animazione UIView sopra, ma quando si ha a che fare con i CALayer direttamente preferisco utilizzare i metodi dell'animazione CoreAnimation.

CGRect oldBounds = mask.bounds; 
CGRect newBounds = self.content.bounds; 

CABasicAnimation* revealAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
revealAnimation.fromValue = [NSValue valueWithCGRect:oldBounds]; 
revealAnimation.toValue = [NSValue valueWithCGRect:newBounds]; 
revealAnimation.duration = 3.0; 

// Update the bounds so the layer doesn't snap back when the animation completes. 
mask.bounds = newBounds; 

[mask addAnimation:revealAnimation forKey:@"revealAnimation"]; 
+0

Questo funziona, parzialmente. Posso vedere l'animazione ora. Tuttavia si ferma a metà strada, invece di rivelare l'intera vista del contenuto. Sai perché potrebbe essere? – soleil

+0

Non sono sicuro di essere onesto; controlla che il valore all'interno dei limiti del contenuto sia corretto. Ti darò una risposta anche per essere un po 'più robusto. – WDUK

+0

In realtà era a causa del punto di ancoraggio (predefinito per 0,5, 0,5 per qualche motivo). Questo lo risolve: mask.anchorPoint = CGPointMake (0, 0); – soleil