2012-02-23 10 views
15

Perdón por una gran pregunta, la pregunta real es negrita en la parte inferior, ahora algunas explicaciones.Desplazamiento animado de UIScrollView con CoreAnimation

Uso CoreAnimation en mi proyecto para animar algunos objetos que se mueven así.

CABasicAnimation *moveAnimation;   
moveAnimation=[CABasicAnimation animationWithKeyPath:@"position"];  
moveAnimation.duration = 2.0;  
moveAnimation.repeatCount=1;   
moveAnimation.autoreverses=NO; 
moveAnimation.delegate = self; 
moveAnimation.fromValue = [NSValue valueWithCGPoint:[crawler.layer position]]; 
moveAnimation.fillMode = kCAFillModeForwards; 
moveAnimation.removedOnCompletion = NO; 
CGPoint p; 
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)]; 
[crawler.layer addAnimation:moveAnimation forKey:@"moveAnimation"]; 

Y ahora tengo que animar el desplazamiento de algunos UIScrollView. No puedo usar el método setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated, porque no puede personalizar la duración de la animación.

que puede hacer que sea como esto

CGContextRef context = UIGraphicsGetCurrentContext(); 
[UIView beginAnimations:nil context:context]; 
[UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
[UIView setAnimationDuration:2]; 
[UIView setAnimationDelegate:self]; 
scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x + 200, scrollView.contentOffset.y); 
[UIView commitAnimations]; 

pero no es CoreAnimation, y el uso de 2 tipos diferentes de técnicas de animación en una aplicación no es una buena práctica, creo.

¿Hay alguna manera de utilizar una animación de base para animar el desplazamiento del contenido de UIScrollView a un punto personalizado con duración de animación personalizada? P.S. Lo siento por el mal inglés.

Respuesta

5

Debe leer acerca de las propiedades animables, Programming iOS 5

De hecho, cuando intenta animar capas, Apple da un conjunto de propiedades animables, pero eres no limitado a este conjunto. Puedes animar lo que quieras.

En todos los casos, no debe usar kCAFillModeForwards porque le pedirá al dispositivo que vuelva a dibujar para siempre la última capa de presentación que se utilizó para la animación, en lugar de utilizar una representación en caché de la capa.

Así que la manera en que podría lograr tal cosa sería definiendo una capa específica suya donde la propiedad contentOffset se define como animable. Y para poder trabajar, debe comenzar por verificar qué tipo de clase de capa superior utiliza una vista de desplazamiento, de modo que, al subclasificarla y establecer la propiedad deseada (contentOffset) animable, y al subclasificar la vista de desplazamiento estableciendo esta capa como la parte superior capa de la vista de desplazamiento, posiblemente podría lograr lo que está tratando de hacer.

¡Esto es teoría!

Pero esto es lo que probaría. Busque este método y su comportamiento y las intenciones

+ (BOOL)needsDisplayForKey:(NSString *)key 

Otra cosa es que se podía leer esta A start example. ¡Pero esto también significa que debe volver a dibujar su uiscrollview usted mismo!

+0

Muchas gracias. Esto es lo que necesito ahora. – Padavan

4

No creo que pueda animar el punto con CoreAnimation.

Pero puedes probar setContentOffset:animated: ¿ese es el método que estás buscando?

Puede transformar sólo después de propiedades de UIView

  • marco
  • grada
  • centro
  • transformar
  • alfa
  • backgroundColor
  • contentStretch

más información acerca de la CoreAnimation la caja de animación del Apple Documentation

+0

Gracias por la respuesta, pero setContentOffset: animado: método no localizable en mi situación, porque necesito establecer la duración de la animación. Y su enlace no es para CoreAnimation) https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html Esta es la documentación al respecto. – Padavan

26

que puede usar:

[UIView animateWithDuration:duration animations:^ { 
    [scrollView setContentOffset:destination animated:NO]; 
}]; 

Es posible ajustar la duración de la animación de esta manera.

+0

Sí, puedo, pero esto es animación en bloque, no CoreAnimation, ¿no? Necesito una forma de utilizar CoreAnimation para esto porque ya lo uso en el proyecto y no quiero usar 2 técnicas diferentes. – Padavan

+0

Respuesta maravillosamente simple a la parte de la duración de la pregunta. – PKCLsoft

+3

"animación en bloque" es solo una envoltura alrededor de Core Animation, no una tecnología diferente. puedes mezclarlos libremente – skozin

7
[UIScrollViewNameHere setContentOffset:CGPointMake(x value of where you want to move to, y value of where you want to move to) animated:YES]; 

por ejemplo:

UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(4, 2, 2341, 412)]; 
[scroll setContentOffset:CGPointMake(320, 0) animated:YES]; 
+0

No puedo usar setContentOffset: (CGPoint) contentOffset animado: (BOOL) método animado, porque no puede personalizar la duración de la animación. Lo escribo en cuestión, léelo de cerca. – Padavan

Cuestiones relacionadas