2009-12-15 4 views
1

Semblable à this previous question, je souhaite appliquer une teinte arbitrairement colorée à une image arbitraire (UIImageView). Cependant, je veux que la teinte disparaisse au bout de N secondes, pour avoir un effet "impulsion". Je déclencherai le pouls toutes les M secondes. Bien que je pense pouvoir truquer une solution naïve en utilisant un NSTimer pour changer la teinte, je pense que je peux probablement utiliser une partie du framework Core Animation pour avoir une solution beaucoup plus élégante (et efficace). Cependant, je ne suis pas très familier avec Core Animation.Animation d'une teinte UIImageView

Est-ce que créer une "impulsion" comme celle-ci est possible avec Core Animation? Si c'est le cas, comment?

Répondre

1

Si vous envisagez d'utiliser Core Animation, l'approche sera différente de ce qui a été démontré dans votre lien vers une question SO précédente. Au lieu de cela, créez un calque qui utilise la couleur que vous recherchez pour la teinte, puis animez l'opacité de ce calque. Quelque chose comme ceci:

CALayer *tintLayer = [CALayer layer]; 

// Center the layer on the view 
[tintLayer setBounds:[imageView bounds]]; 
[tintLayer setPosition:CGPointMake([imageView bounds].size.width/2.0, 
            [imageView bounds].size.height/2.0)]; 

// Fill the color 
[tintLayer setBackgroundColor: 
      [[UIColor colorWithRed:0.5 green:0.5 blue:0.0 alpha:1.0] CGColor]]; 
[tintLayer setOpacity:0.5]; 
[[imageView layer] addSublayer:tintLayer]; 

// Add the animation 
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
[animation setFromValue:[NSNumber numberWithFloat:0.5]]; 
[animation setToValue:[NSNumber numberWithFloat:0.0]]; 
// Animate back to the starting value automatically 
[animation setAutoreverses:YES]; 
// Animate over the course of 5 seconds. 
[animation setDuration:5.0]; 

[tintLayer addAnimation:animation forKey:@"opacity"]; 

La seule question que je ne suis pas sûr de savoir si cela fonctionnera même puisque nous ne spécifions pas un mode de fusion dans la couche de teinte. Je vais devoir regarder et voir ce qui se passe par défaut avec CA.

Cordialement. MISE À JOUR: Trouvé another SO post indiquant que la fusion dans CA dépend de la propriété 'opaque' de la couche.

+0

Est-ce que cela fonctionnera si l'image arbitraire mentionnée ci-dessus n'est pas rectangulaire (comme un cercle), ou a juste une bordure d'espace vide autour de lui (pixels avec 0 alpha)? Parce que si vous appelez setBackgroundColor :, vous allez définir une couleur pour les pixels qui ne sont pas censés être "allumés". –

+0

A droite, ça va teinter tout le rectangle. Je pense que cela serait également vrai avec l'autre approche Core Graphics, cependant. Je ne suis pas sûr de cela, cependant, comme je ne l'ai pas essayé. –

+0

Vous pouvez ajouter un masque à tintLayer. Je cherche à colorer un UIImageView - tintLayer.mask = imageView.layer pourrait faire l'affaire. Hope imageView.layer aime être utilisé à deux endroits. –

Questions connexes