ios objective-c uiviewcontroller ios7

ios - La forma correcta de implementar una transición interactiva UIViewController personalizada utilizando UIViewControllerInteractiveTransitioning Delegate Protocol



objective-c ios7 (2)

Apple sí proporciona un ejemplo de proyecto ahora sobre cómo puede lograr esto. Habiendo dicho eso, no creo que sea el mejor y más claro ejemplo, pero debería llevarte por el camino correcto.

También tienen un video WWDC que te lleva a través de este mismo proyecto.

Tenga en cuenta que es un ejemplo bastante complejo, pero si logra dividirlo y comprender las diversas piezas, debe estar equipado para hacer frente a más o menos cualquier cosa en el frente de transición.

Básicamente, el proyecto divide el problema en dos clases auxiliares, 1) un AssetTransitionController que se inicializa con, y existe durante la vida del controlador de vista, y 2) un objeto AssetTransitionDriver que se crea al principio de, y existe para el duración de, una transición.

El AssetTransitionController es bastante simple, se ajusta a UIViewControllerAnimatedTransitioning y UIViewControllerInteractiveTransitioning administrando el ciclo de vida del AssetTransitionDriver .

El AssetTransitionDriver es una NSObject simple, pero en realidad termina siendo mucho más complejo. Gestiona el UIViewPropertyAnimator principal, crea la jerarquía de vistas para la transición y responde al controlador de interacción (un reconocedor de gestos pan). También vende su animador al AssetTransitionController cuando se solicita.

No utiliza UIPercentDrivenInteractiveTransition en absoluto.

Me interesa un ejemplo conciso de cómo crear una subclase NSObject que implemente el protocolo UIViewControllerInteractiveTransitioning para administrar una transición interactiva personalizada entre dos UIViewController . Idealmente en respuesta a un gesto de deslizamiento. Algo similar al deslizamiento interactivo predeterminado iOS7 que ahora viene con UINavigationController , pero un ejemplo de implementación personalizada / manual de esto.

He leído los documentos:

Y miramos algunos ejemplos en otros lugares:

  • one
  • two
  • three
  • four (configuré esto pero se trata más de la containment UIViewController y la implementación manual de estas transiciones en lugar de UIViewControllerInteractiveTransitioning

Los documentos son bastante claros pero no hacen referencia al código de muestra. Y los ejemplos dejan un poco que desear (preguntas sin respuesta sobre cómo las diversas piezas están unidas).

Entonces mis preguntas son:

  1. ¿Puede alguien ayudar a completar los espacios en blanco sobre cómo vincular un gesto (por ejemplo, deslizar) al objeto que implementa el protocolo UIViewControllerInteractiveTransitioning ?
  2. ¿Cuál es la relación entre el objeto que implementa el protocolo UIViewControllerInteractiveTransitioning y el que implementa el protocolo UIViewControllerAnimatedTransitioning? Parece que debes tener ambos para activar transiciones interactivas ...

Gracias por adelantado...


1) La forma más fácil de vincular un gesto al objeto UIViewControllerInteractiveTransitioning es convertirlo en la subclase de UIPercentDrivenInteractiveTransition . Luego, cuando implemente el manejador de gestos, llame a updateInteractiveTransition: aquí un ejemplo con código:

-(void)handlePinch:(UIPinchGestureRecognizer *)pinch { CGFloat scale = pinch.scale; switch (pinch.state) { case UIGestureRecognizerStateBegan: { _startScale = scale; self.interactive = YES; [self.navigationController popViewControllerAnimated:YES]; break; } case UIGestureRecognizerStateChanged: { CGFloat percent = (1.0 - scale/_startScale); [self updateInteractiveTransition:(percent < 0.0) ? 0.0 : percent]; break; } case UIGestureRecognizerStateEnded: { CGFloat percent = (1.0 - scale/_startScale); BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3); if (cancelled) [self cancelInteractiveTransition]; else [self finishInteractiveTransition]; break; } case UIGestureRecognizerStateCancelled: { CGFloat percent = (1.0 - scale/_startScale); BOOL cancelled = ([pinch velocity] < 5.0 && percent <= 0.3); if (cancelled) [self cancelInteractiveTransition]; else [self finishInteractiveTransition]; break; } } }

Este código es de https://www.captechconsulting.com/blogs/ios-7-tutorial-series-custom-navigation-transitions--more

2) La función animateTransition de UIViewControllerAnimatedTransitioning se usa para realizar la transición interactiva. Se divide automáticamente en "fotogramas clave" gracias a su llamada anterior para updateInteractiveTransition . Pero supongo que si implementa su método startInteractiveTransition: UIViewControllerInteractiveTransitioning (así que sin usar la subclase UIPercentDrivenInteractiveTransition ), entonces usted es responsable de gestionar la transición completa (no estoy seguro de eso ... lo siento, pero la documentación en mi opinión no está clara).