iOS7 Custom ViewController transición y guía de diseño superior
iphone objective-c (4)
Encontre un camino. Primero desmarque la propiedad "Extender bordes" del controlador después de que la barra de navegación aparezca en color oscuro. Agregue una vista al controlador y establezca LayoutConstraint -100 superior e inferior . Luego haga la propiedad clipsubview de la vista no (para el efecto transculeto de la barra de navegación). Mi inglés es malo lo siento por eso. :)
Implementé una transición UIViewController personalizada en mi aplicación, que reemplaza los controladores de navegación integrados en la animación de inserción.
Todo funciona hasta ahora, excepto que el toplayoutguide en el controlador de vista recientemente introducido es 0, aunque el nuevo controlador de vista heredó la barra de navegación del controlador de vista anterior. Debe ser 64.0 (altura de la barra de estado + altura de la barra de navegación), donde ahora es 0.0. Por lo tanto, todos los objetos, que se adjuntan a la guía de diseño superior en el guión gráfico, aparecen 64 puntos demasiado altos (debajo de la barra translúcida).
Cuando deshabilito la transición de visualización personalizada, la guía de diseño superior tendrá el valor esperado. Intenté llamar layoutSubviews y updateConstraints "por todo el lugar". En el controlador de vista, así como en el controlador de navegación.
Según tengo entendido, el controlador de navegación (parentviewcontroller) debe actualizar la guía de reproducción superior del nuevo controlador de vista, pero aparentemente me falta algo en mi código de transición personalizado, que activa la actualización al valor correcto para la guía de reproducción superior.
Aquí está mi código de transición personalizado que es un objeto establecido como delegado del controlador de navegación:
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
return 0.7;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
UIView *animationContainerView = [transitionContext containerView];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *toView = [toVC view];
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIView *fromView = [fromVC view];
CGRect endFrame = [transitionContext finalFrameForViewController:toVC];
CGRect startFrame;
startFrame = CGRectOffset(endFrame, 0, endFrame.size.height);
if (self.operation == UINavigationControllerOperationPop) {
[animationContainerView insertSubview:toView belowSubview:fromView];
[toView setFrame:endFrame];
}
else{
[toView setFrame:startFrame];
[animationContainerView insertSubview:toView aboveSubview:fromView];
}
[UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:0.8 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
if (self.operation == UINavigationControllerOperationPop) {
[fromView setFrame:startFrame];
[fromView layoutIfNeeded];
}
else{
[toView setFrame:endFrame];
[toView layoutIfNeeded];
}
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
Nada realmente lujoso sucede allí. Solo la vista se desliza de abajo hacia arriba con algunas dinámicas integradas.
El problema es que los objetos adjuntos a la guía de diseño superior ahora están debajo de la barra de navegación, como la longitud de la guía de diseño superior == 0.
No puedo averiguar qué debo hacer, de modo que la guía de reproducción superior del controlador de vista esté configurada en el valor correcto.
La navegación de empuje se realiza de forma sencilla con un guión gráfico. Todo lo que hago, antes de llamar a performSegueWithIdentifier es configurar el delegado de controles de navegación.
Aquí está el código:
self.navigationController.delegate = [[My_CustomNavigationTransitionDelegate alloc] init];
[self performSegueWithIdentifier:@"infosSegue" sender:nil];
¿Qué me pierdo?
Estaba teniendo un problema en el que la propiedad bottomLayoutGuide
se configuraba a sí misma en longitud cero y luego hacía que mis botones encima de la barra de pestañas cayeran hacia abajo a la barra de pestañas con la opción de autolayout.
Has mirado a hacer esto
[self.navigationController.view setNeedsLayout]
Lo puse en mi viewwillappear
y dejé de obtener una longitud de cero en la propiedad bottomLayoutGuide
. Tal vez eso también te ayude con tu propiedad topLayoutGuide
.
Me encontré con el mismo problema exacto. La vista de contenedor de mi controlador de navegación personalizado no tenía restricciones. En el momento en que agregué restricciones de espaciado vertical desde la vista del contenedor a las guías de diseño de su vista de supervisión (aunque los dos eran idénticos en tamaño), y configuré el aspecto de la barra superior / inferior / estado en la vista del contenedor, todo estaba bien y las guías de diseño del empujado Los controladores estaban en la posición correcta. Espero que ayude.
Actualización: De la documentación oficial en topLayoutGuide
Un controlador de vista dentro de un controlador de vista de contenedor no establece el valor de esta propiedad. En su lugar, el controlador de vista de contenedor restringe el valor para indicar: La parte inferior de la barra de navegación, si hay una barra de navegación visible. La parte inferior de la barra de estado, si solo se ve una barra de estado. El borde superior de la vista del controlador de vista, si no hay ninguno. una barra de estado o la barra de navegación es visible
Por lo tanto, la vista del contenedor debe implementar restricciones correctas y ocultar / mostrar barras y demás para que los efectos funcionen. AFAIK no hay API para hacer esto en los controladores de vista de contenedor personalizados.
Pude solucionar esto, con la siguiente jerarquía de vistas:
UIView
UIScrollView
<content, constrained to UIScrollView>
Restrinja el UIScrollView
para que coincida con los UIView''s
superior, anterior, posterior e inferior del UIView''s
. Interface Builder puede querer que uses topLayoutGuide y bottomLayoutGuide para UIScrollView
, o puede que no. Tal vez depende de la versión de Xcode, pero algunos de nuestros controladores de vista usaron la vista de supervisión, otros usaron las guías de diseño.
Para las vistas en las que Interface Builder no quería restringir la vista de desplazamiento en relación con su vista de supervisión, abrí el guión gráfico en un editor de texto y ajusté las restricciones en la vista de desplazamiento a mano.
Finalmente, en el Controlador de vista, asegúrese de que los bordes extendidos debajo de la barra superior sean SÍ, y también lo es Ajustar inserciones de vista de desplazamiento.
Básicamente, evito usar topLayoutGuide y, en cambio, confío en las inserciones de la vista de desplazamiento, lo que sí funciona.
Donde no tenía un UIScrollView en la jerarquía, como usted, NO extendí los bordes debajo de la barra superior que funcionaba para mí.