titles prefer large bar ipad ios animation uinavigationcontroller uinavigationbar

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; } } }