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:
- UIViewControllerContextTransitioning
- UIPercentDrivenInteractiveTransition
- UIViewControllerInteractiveTransitioning
- UIViewControllerAnimatedTransitioning
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 deUIViewControllerInteractiveTransitioning
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:
- ¿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
? - ¿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).