2012-05-11 9 views
15

Conozco a un montón de personas que han hecho la misma pregunta, pero ninguna de las soluciones propuestas parece relevante, por lo que estoy pidiendo una vez más: tengo el siguiente bloque de código:animateWithDuration completa inmediatamente

UIImageView *moneyHolder = [[UIImageView alloc] initWithImage:moneyImage];  
if([paymentMethod.viewed intValue] == 0){ 
      //CGRect targetFrame = CGRectMake(0, cell.frame.size.height/2-3, cell.frame.size.width, targetHeight); 
      CGRect targetFrame = moneyHolder.frame; 
      targetFrame.origin.y = cell.frame.size.height/2-3; 
      NSLog(@"animating"); 
      [UIView animateWithDuration:2 
            delay:0 
           options: UIViewAnimationCurveEaseOut 
          animations:^{ 
           moneyHolder.frame = targetFrame; 
          } 
          completion:^(BOOL finished){ 
           NSLog(@"done"); 
          } 
      ]; 
     } 

Lo que PENSARÍA debería animar mi marco de MoneyHolder. Desafortunadamente, esto parece suceder inmediatamente en lugar de hacerlo con una duración de 2 segundos. Puedo verificar esto con marcas de tiempo de mi registro:

2012-05-11 03: 41: 50.102 AgilePoet [5824: 15203] animación
2012-05-11 03: 41: 50.116 AgilePoet [5824: 15203] Hecho

¿Alguien tiene alguna idea sobre por qué esto podría estar pasando? Todas las demás preguntas sobre el tema se centraron en que la propiedad no es animable, pero sé que un marco de vista de imagen es animado. Lo único que puedo pensar es que este código está escrito en mi

-tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath method. 

¡Gracias de antemano!

+0

Es bueno ver que tiene una teoría sobre lo que podría estar causando el problema. ¿Puedes probarlo copiando temporalmente el código de la animación en otro lugar y ver si se comporta como esperas allí? –

+0

Bueno, moví el código fuera del método willDisplayCell y funcionó ... ¿Alguien sabe por qué no funcionaría desde dentro willDisplayCell? – akhalsa

+0

Supongo que el código de dibujo de willDisplayCell llama a removeAllAnimations en la capa de la celda, lo que termina su animación prematuramente. –

Respuesta

17

Para citar los documentos:

El rectángulo marco de cuadro, que describe la ubicación del punto de vista y tamaño en el sistema de coordenadas de su supervista.

Los cambios en esta propiedad se pueden animar. Sin embargo, si la propiedad de transformación contiene una transformación que no es de identidad, el valor de la propiedad de marco no está definido y no debe modificarse. En ese caso, usted puede cambiar la posición de la vista usando la propiedad del centro y ajustar el tamaño usando la propiedad de límites en su lugar.

Si usted, o algún otro código, ha cambiado la matriz de transformación para la vista, los cambios en la propiedad del marco no funcionan como se esperaba.

En su lugar, debe cambiar la propiedad del centro (para mover la vista) y la propiedad de los límites (para cambiar su tamaño). Esas propiedades se comportan como se esperaba.

+0

bien cotizado! ;) – Daniel

+0

Siempre me gusta animar/cambiar la propiedad del centro en lugar de frame.origin. No solo por los problemas mencionados sino también porque es mucho más intuitivo. (Además, las posiciones de frame.origin son diferentes para iOS/Mac OS) –

+1

Lo que debe tener cuidado al usar 'center' como su propiedad de posicionamiento es si su cuadro tiene un ancho o alto de píxel impar.Establecer el centro en coordenadas integrales en este caso hará que su vista se vuelva borrosa ya que no estará alineada con píxeles. –

0

Otra cosa que hace que la animación se complete de inmediato, es si el objeto que se está animando (UIImageView en mi caso) es nulo.

4

en mi caso la animación se llamó en el método viewdidload. No hagas esto Pruebe en viewWillAppear

Cuestiones relacionadas