ios ios5 uinavigationcontroller uinavigationbar uinavigationitem

ios - Cambio de tamaño automático UINavigationBar en rotación al paisaje



ios5 uinavigationcontroller (3)

El comportamiento típico de NavController es cambiar el tamaño cuando está en puerto / paisaje. Desde 44px altura hasta 32px creo (desde lo alto de mi cabeza).

Estoy usando un guión gráfico e incluí una barra de navegación en un VC, no en un controlador. Al girar entre vertical y horizontal, la barra de navegación no cambia de tamaño automáticamente.

He visto esta respuesta, pero esto no ayuda: cambiar el tamaño de UINavigationBar en la rotación

La barra de navegación es el controlador a través de la apariencia que se carga en el delegado de la aplicación:

UIImage *portraitImage = [UIImage imageNamed:@"mainNavBar"]; UIImage *landscapeImage = [UIImage imageNamed:@"mainNavBarLandscape"]; [[UINavigationBar appearance] setBackgroundImage:portraitImage forBarMetrics:UIBarMetricsDefault]; [[UINavigationBar appearance] setBackgroundImage:landscapeImage forBarMetrics:UIBarMetricsLandscapePhone]; [[UINavigationBar appearance] setBackgroundColor:[UIColor blackColor]]; [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor, [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor, [NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,nil]]; [[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin];

Lamentablemente, la última parte no hace ninguna diferencia y como la barra de navegación se incluirá en varios controladores, no quiero repetir el mismo código de pegamento en la respuesta anterior a todos mis VC para cambiar el tamaño de la rotación.


La respuesta aceptada funcionó para mí, pero quería pasar al diseño basado en restricciones completas.

Al establecer UIBarPosition en el delegado de UINavBar colocan los elementos necesarios. Recuerde adjuntar al delegado en IB (por supuesto).

// In my view controller #pragma mark - UIBarPositioningDelegate - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

Para restricciones en el UINavBar en IB:

  • Espacio superior a: Guía de diseño superior (0)
  • Leading Space para: Superview (0)
  • Espacio de entrenamiento para: Superview (0)
  • lo más importante ... ¡sin restricción de altura de ningún tipo! -

La altura estará determinada por el tamaño del contenido en tiempo de ejecución. Originalmente no pude hacer este trabajo correctamente porque tenía la prioridad de abrazar contenido vertical en 750, pero eso era incorrecto. Cuando lo cambié al valor predeterminado (250) funcionó bien.


Si está utilizando el diseño automático, el UINavigationBar intrinsicContentSize UINavigationBar actualiza correctamente en la rotación, pero su altura NSContentSizeLayoutConstraint no lo hace. Llamar a invalidateIntrinsicContentSize manualmente le dice a autolayout que actualice la restricción de altura para la barra de navegación.

// View controller public override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator); self.navigationBar?.invalidateIntrinsicContentSize(); }


[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin];

Pero no dijiste altura flexible. Sin embargo, la altura, según tengo entendido, es la característica que desea ser flexible.