Pregunta

Tengo un botón personalizado en un controlador de vista en la jerarquía del controlador de navegación, que cuando se presiona, aparece el controlador de vista visible.

Quiero usar UIView transform propiedad para animar el cierre del controlador de vista.Funciona, pero si uso `popViewControllerAnimated:YES', la diapositiva izquierda predeterminada de la animación sigue ahí, aunque mi transformación personalizada también funciona.

si lo configuro popViewControllerAnimated:NO no anima nada en absoluto.

También busqué usar CATransition que funciona cuando tengo popViewControllerAnimated ajustado a NO, pero no hay un efecto de "zoom" que sea parte de la API pública y no quiero utilizar el efecto privado.Los filtros personalizados tampoco están disponibles para iPhone, solo para OS X.

Entonces supongo que mis preguntas son:

1) ¿Hay alguna manera de eliminar la diapositiva izquierda en la transición predeterminada y aún tener una animación personalizada usando transform?

2) Alguna forma de utilizar un filtro personalizado para CATransition?

3) Si uso una API privada para el efecto de zoom, ¿qué probabilidades hay de que Apple arroje mi aplicación a la papelera de rechazo?

¿Alguien tiene una solución que estoy pasando por alto?

¿Fue útil?

Solución

He hecho algo similar a lo que usted describe, es decir.cambie la animación predeterminada para pop y push de vista en UINavigationController.

La idea es deshabilitar la animación predeterminada del objeto y reemplazarla con tu propia animación.Creé una nueva categoría para UINavigationController y usé una función similar a la siguiente.

 - (void) altAnimatePopViewControllerAnimated:(BOOL)animated
 {
[CATransaction begin];

CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionPush;          // Use any animation type and subtype you like
transition.subtype = kCATransitionFromTop;
transition.duration = 0.3;

CATransition *fadeTrans = [CATransition animation];
fadeTrans.type = kCATransitionFade;
fadeTrans.duration = 0.3;


[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];

[[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
[[[[self.view subviews] objectAtIndex:1] layer] addAnimation:fadeTrans forKey:nil];



[self  popViewControllerAnimated:YES];
[CATransaction commit];
   }

para usar solo usa el código

   [self.navigationController altAnimatePopViewControllerAnimated:YES];

Para hacer un push simplemente crea otra función similar e invierte la animación.

No es perfecto pero funciona.Cuando elijas diferentes tipos de animación, juega con las diferentes subvistas que componen la barra de navegación/controlador para que quede perfecto.

Me tomó bastante tiempo crear esto, así que úsalo sabiamente :)

******* EDITAR

Intente reemplazar la transición push con esto (no lo intenté yo mismo):

  CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
  scale.duration = duration;
  scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
              [NSNumber numberWithFloat:1.2f],
              [NSNumber numberWithFloat:.85f],
              [NSNumber numberWithFloat:1.f],
              nil];

Esto hará una aparición emergente, es decir.la vista será más grande antes de que alcance el tamaño correcto.Juega con los valores de la matriz para controlar la curva de la animación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top