2011-07-11 16 views
6

En this ejemplo.Animar un marco UIView, subvista UIScrollView no siempre anima

Estoy animando el marco de PhotoViewerViewController cuando animo el tabBarController (para el efecto de pantalla completa). El PhotoViewer utiliza un uiscrollview para generar el mismo tipo de efecto que la aplicación de fotos de Apple. Por alguna razón, a veces se anima junto con mi fotograma PhotoViewer, y a veces no lo hace.

Puede ver que en el primer ejemplo salta al aumentar el tamaño del cuadro, pero se anima mucho cuando se reduce el tamaño del cuadro (y se restaura la barra de pestañas).

Sin embargo, en el ejemplo this cuando la foto es vertical, salta en ambas direcciones.

En ambos casos, si amplío la foto en absoluto con la vista de desplazamiento, se anima correctamente en ambas direcciones.

Sé que la evidencia está ahí, pero no puedo decir lo que está sucediendo aquí.

Aquí es mi bloque de animación:

void (^updateProperties) (void) =^{ 
    self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
    self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; 
    if (self.tabBarController) { 

     int height = self.tabBarController.tabBar.bounds.size.height; 
     for(UIView *view in self.tabBarController.view.subviews) 
     { 
      int newHeight; 
      UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; 
      if (UIInterfaceOrientationIsPortrait(orientation)) { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.height - height; 
      } else { 
       newHeight = hidden ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.width - height; 
      } 


      if([view isKindOfClass:[UITabBar class]]) 
      { 
       [view setFrame:CGRectMake(view.frame.origin.x, newHeight, view.frame.size.width, view.frame.size.height)]; 
      } 
      else 
      { 
       CGRect newFrame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, newHeight); 
       [view setFrame:newFrame]; 

       // update our VC frame with animation 
       [self.view setFrame:newFrame]; 

      } 

     } 
    } 

}; 

Código adaptado de un mensaje el SO: UITabBar wont hide

fuente completo en github.

Respuesta

6

En general, si las animaciones a veces funcionan ya veces don' t, es porque en el último caso un rendimiento retrasado está causando que se cancelen efectivamente al establecer la propiedad en cuestión en su valor final.

En el caso particular de UIScrollView, a menudo ocurre que -layoutSubviews se llama sin animación un ciclo de ejecución después de que se hayan cerrado los bloques de animación. Por esta razón, generalmente trato de evitar hacer cualquier diseño en ese método donde tengo un UIScrollView en la jerarquía de vistas (porque particularmente antes de iOS 5, UIScrollView es realmente gatillo-feliz al configurarse para necesitar diseño).

Recomendaría quitar su llamada a -[EGOPhotoImageView layoutScrollViewAnimated:] de -layoutSubviews y agregarla a un -setFrame: reemplazado en su lugar.

Si puede apuntar a iOS4 y superior, eche un vistazo a UIViewAnimationOptionLayoutSubviews también. Usar una animación basada en bloques con esto como una opción podría funcionar sin cambiar nada más.

+0

Gracias. Este último no funcionó, pero voy a intentarlo. –

+0

Aunque aún no lo he resuelto, creo que me ha señalado en la dirección correcta. No estoy seguro de si esta transformación en particular se está activando en la propia PhotoImageView, o en el desplazamiento que la contiene. –

+0

Personalmente movería toda la lógica para centrar el contenido de la vista de desplazamiento a la subclase scrollview. Allí, puede anular -setContentOffset: para realizar el diseño en lugar de utilizar los métodos de delegado de zoom. – hatfinch

0

Probé tu código github en los simuladores iPad 4.2 y 4.3 y funciona bien ... ¡no hay cambio de imagen de imagen en absoluto! Puede haber algunos problemas de versión. Además, he intentado cambiar bloquean sus animaciones y la siguiente tiene el mismo propósito:

void (^updateProperties) (void) =^{ 
      self.navigationController.navigationBar.alpha = hidden ? 0.0f : 1.0f; 
      self.navigationController.toolbar.alpha = hidden ? 0.0f : 1.0f; } 

Avisadme si me falta algo :)

+0

Para probar lo que estaba demostrando en los videos, debe agregarlo a tabbarcontroller, y recomendaría un buen surtido de imágenes de flickr cuando lo construya. Puedo armar una muestra si es necesario. –

+0

seguro ... eso ayudaría. – tipycalFlow

Cuestiones relacionadas