Tengo una subclase CALayer, MyLayer, que tiene una propiedad NSInteger llamada myInt. Realmente me gustaría animar esta propiedad a través de CABasicAnimation, pero parece que CABasicAnimation solo funciona en las propiedades llamadas "animables" (límites, posición, etc.). ¿Hay algo que pueda anular para hacer que mi propiedad myInt personalizada sea animable?Animar una propiedad personalizada de la subclase CALayer
Respuesta
Sí, es posible (solo en las últimas versiones de Core Animation, creo, es decir, iPhone 3.0+ y OS X 10.6+).
Haga su propiedad dinámica para que CA implementa los descriptores de acceso para usted:
@dynamic myInt;
Envía la capa que los cambios de la propiedad requieren volver a dibujar:
+ (BOOL)needsDisplayForKey:(NSString*)key { if ([key isEqualToString:@"myInt"]) { return YES; } else { return [super needsDisplayForKey:key]; } }
Usar el valor de
myInt
en su métododrawInContext:
. Ahora, cuando animemyInt
, Core Animation interpolará los valores para cada paso de la animación y repetidamente le pedirá a la capa que dibuje.Si también desea habilitar las animaciones implícitas para esta propiedad, también anule
actionForKey:
.
¡Gracias! ¡Esto me tiene tan cerca de una solución que puedo probarla! -drawInContext: se llama varias veces con myInt interpolado correctamente. Desafortunadamente, CGContextDrawImage() ya no funciona mientras la animación se está ejecutando. Los rectos que llené o los trazos que acaricio se dibujaron correctamente, pero la imagen que normalmente dibuja CGContextDrawImage() simplemente desaparece hasta que la animación termina como si nunca se llamara a CGContextDrawImage(). Estoy desconcertado. ¿Alguna idea? – jemmons
No tengo idea, lo siento. Espero que encuentres una solución. –
Eso está bien. Tu respuesta sigue siendo una de las mejores respuestas escritas que he visto en Stack Overflow :) – jemmons
Hay es una manera de conservar los Ivars de sus subclases CALayer personalizados. Sobreescribe initWithLayer :, el método que se llama para crear una copia de capas personalizadas. Por ejemplo, si tiene una capa en la que desea crear una propiedad personalizada denominada 'ángulo', podría utilizar el siguiente código:
@implementation AngledLayer
@synthesize angle = _angle
// Tell Core Animation that this key should be animated
+ (BOOL) needsDisplayForKey:(NSString *)key
{
if ([key isEqualToString:@"angle"]) return YES;
return [super needsDisplayForKey:key];
}
// Make sure that, when the layer is copied, so is the custom ivar
- (id) initWithLayer:(id)layer
{
self = [super initWithLayer:layer];
if (self) {
AngledLayer *angledVersion = (AngledLayer *)layer;
self.angle = angledVersion.angle;
}
return self;
}
Y de tu tío Bob! Tenga en cuenta que no puede usar este objeto con animación implícita, para lo cual también debería reemplazar el método actionForKey :.
Esto no funciona para mí. Dentro de 'initWithLayer', la capa siempre tiene el valor inicial de la propiedad, incluso mientras se anima. El colocador es llamado a otro lugar. – zakdances
Estoy viendo lo mismo que yourfriendzak. Si bien la combinación de initWithLayer y needsDisplayForkey permite que la animación suceda, tan pronto como finaliza, la capa vuelve a su valor inicial. Todavía estoy buscando una solución. –
De acuerdo, parece que no me di cuenta de que @dynamic causa que el colocador se anime automáticamente. Pero si por alguna razón necesitas hacer más, probablemente necesites crear tu propio setter que tenga su propio bloque de animación para que puedas cambiar la propiedad de la capa antes de que la animación tenga lugar. Ver [enlace] (http://stackoverflow.com/questions/11515647/objective-c-cabasicanimation-applying-changes-after-animation) –
- 1. ¿Cómo exactamente subclase CALayer y utiliza una propiedad personalizada?
- 2. Redibujar la subclase de CALayer personalizada en el cambio de propiedad personalizada
- 3. Animar los límites de un CALayer con redibujados
- 4. Animar propiedades personalizadas de CALayer dentro de una CATransacción
- 5. Animar un camino de sombra CALayer
- 6. Animar un cambio de tamaño de máscara de CALayer
- 7. Animación de la propiedad shadowPath de CALayer
- 8. Creando una subclase personalizada de ColorFilter?
- 9. Inicial personalizada para una subclase NSManagedObject
- 10. ¿Cómo se genera la capa de presentación de un CALayer?
- 11. Clasificación personalizada con NSFetchedResultController (subclase de NSSortDescriptor)
- 12. ¿Cómo se crea una subclase personalizada de IO en Ruby?
- 13. Usando NSCoding en una subclase de clase personalizada
- 14. ¿Cómo hacer que NSTextField use la subclase personalizada de NSTextFieldCell?
- 15. Acceso a la propiedad de etiqueta personalizada en didSelectRowAtIndexPath
- 16. Cómo animar la propiedad textColor de un UILabel?
- 17. Animar la propiedad 'Estilo' de Control utilizando ObjectAnimationUsingKeyFrames en WPF
- 18. Agregar una propiedad personalizada a Entity Framework?
- 19. Cómo puedo animar una propiedad UIButton Alpha con MonoTouch
- 20. ¿cómo puedo animar los límites de un CAlayer para revelar progresivamente una imagen?
- 21. ¿Animar el elemento WPF en XAML usando la propiedad adjunta?
- 22. Usando la subclase personalizada de NSURLConnection, ¿cómo "encuentra" los datos adicionales en la clase más adelante?
- 23. Animación de opacidad CALayer
- 24. Enmascaramiento de un CALayer con otro CALayer
- 25. Problemas de dibujo con CALayer
- 26. Animar
- 27. Cómo animar la traducción de una vista
- 28. ¿Obtiene el valor de una propiedad personalizada con atributo decorado?
- 29. Propiedad de log4net personalizada PatternLayoutConverter (con índice)
- 30. Cómo animar una ventana?
¿Intentas hacer que la propiedad sea un "flotador"? – kennytm