ipad - prefer - swift navigation bar large title
UINavigationController: Title Jumps en Resize Animation (4)
Tengo una aplicación ipad donde me gustaría ocultar y mostrar una lista de categorías (algo así como la vista pequeña en un controlador de vista dividida) y la vista principal que contiene una pila UiNavigationController.
Me gustaría cambiar el tamaño de la vista UINavigationController para llenar toda la pantalla cuando la lista de categorías está oculta, y reducir cuando muestro la lista.
Lo tengo funcionando, excepto que el título de la barra de navegación salta inmediatamente a su nuevo desplazamiento cuando se establece el marco dentro de un bloque de inicio / confirmación de la animación.
¿Alguna idea de cómo detener el salto del título?
Lo usé para arreglar esos saltos en UINavigationBar para el título y el botón derecho.
#import "UINavigationBar+My.h"
@implementation UINavigationBar (My)
- (void)layoutSubviews {
for (id obj in [self subviews]) {
if ([NSStringFromClass([obj class]) isEqualToString:@"UINavigationItemView"])
[(UIView *)obj setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin];
else if ([NSStringFromClass([obj class]) isEqualToString:@"UIButton"]) {
if ([(UIButton *)obj center].x < ([self center].x / 2))
[(UIButton *)obj setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
else
[(UIButton *)obj setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
}
}
@end
Espero que te ayude ;-)
Me encontré con un problema similar recientemente; Tenía una subvista de la vista de animación que saltaba de inmediato a su nueva posición. Esto estaba sucediendo porque se estaba llamando a -layoutSubviews
en esa vista como resultado de modificarla programáticamente antes de que terminara la animación. ¿Estás haciendo algo así como cambiar el texto del título o modificarlo de alguna manera que podría provocar que se -layoutSubviews
a -layoutSubviews
?
Me funcionó bien cuando [self.navigationController.navigationBar layoutSubviews]
en el bloque de animación en sí. Aquí está el ejemplo del código:
[UIView animateWithDuration:0.5
animations:^{
[self.navigationController.navigationBar setFrame:newFrame];
[self.navigationController.navigationBar layoutSubviews];
}];
Espero que esto sea de alguna manera útil.
Mi solución, parece hacer frente a todos los escenarios que golpeé en mi aplicación. Obviamente todavía es un hack, así que no hay garantías de que siempre funcione.
@implementation UINavigationBar (Nick)
- (void)layoutSubviews {
[super layoutSubviews];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
UIView* titleView = nil;
CGFloat buttonWidths = 0;
for (UIView* subview in [self subviews]) {
if ([subview class] == NSClassFromString(@"UINavigationItemView")) {
if (titleView) {
// Exit here - if there is more than one title, probably doing a pop
return;
}
titleView = subview;
}
else if ([subview class] == [UIView class] || // bar button with custom view
[subview class] == NSClassFromString(@"UINavigationButton")) { // or ordinary bar button
buttonWidths += subview.frame.size.width;
// is it RHS?
if (subview.frame.origin.x > subview.frame.size.width) {
[subview setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
}
else {
[subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
}
}
else if ([subview class] == NSClassFromString(@"UINavigationItemButtonView")) {
// pretty sure this is always the back button
buttonWidths += subview.frame.size.width;
[subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
}
}
if (titleView) {
buttonWidths += 20; // seems to be apple indentation
CGRect rect = titleView.frame;
if (rect.size.width > self.frame.size.width - buttonWidths) {
rect.size.width = self.frame.size.width - buttonWidths;
titleView.frame = rect;
}
titleView.center = self.center;
}
}
}