guidelines color bar ios uinavigationcontroller uinavigationbar

ios - color - navigation bar swift 4



¿Cómo obtengo un UINavigationController para NO cambiar el tamaño de la vista al configurar la propiedad translúcida? (4)

No es necesariamente una buena respuesta, pero podrías equilibrar tu vista tan alto si no eres translúcido.

//This won''t take into account orientation and probably other details if(!self.navigationController.navigationBar.isTranslucent) { self.view.frame = CGRectMake(0,0,-44,self.view.bounds.size.height); }

Podrías poner eso en viewDidLoad o viewWillAppear y si tienes un montón de controladores de vista puedes simplemente subclasificarlos todos y poner tu lógica en la subclase.

Tengo una aplicación donde hasta ahora he estado usando un UINavigationController con un UINavigationBar que tiene su propiedad translúcida = SÍ. Esto significa que la vista de contenido de UINavigationController (es decir, las vistas de los controladores de vista que insertas) es de pantalla completa (barra de estado menos).

Sin embargo, si configura el navigationBar.translucent = NO, esta vista del contenedor se hace 44pt más corta, ya que supongo que Apple ha supuesto que no necesita ningún contenido bajo una barra de navegación opaca.

... excepto si estás haciendo lo que estamos haciendo y estás empleando una barra de navegación que se desplaza (ver este artículo sobre cómo hacerlo ). Me gustaría saber si esto es posible.

Quiero tener translúcido = NO, pero todo se ha comportado como si todavía estuviera configurado en SÍ. Me gusta la funcionalidad del translúcido = SÍ, pero en realidad no quiero que el UIKit transforme la barra en translúcida.


Encontré una solución que funciona, aunque de hecho es un truco.

La idea es dar a la barra de navegación translúcida un respaldo opaco. Lamentablemente, no estoy contento con la solución porque está sucia y no encapsulada y presenta algunos problemas potenciales, pero ESTOY feliz porque hizo el trabajo.

En la clase controladora de la vista base de mi Aplicación (es decir, MyViewController: UIViewController), en el método viewDidLoad, instancia un nuevo Uivar ivar UIView * _navigationBarBG y le doy el mismo marco que self.navigationController.navigationBar. Luego configuré la propiedad backgroundColor en [UIColor whiteColor] aunque así es como logras más tinte, supongo. [EDIT: si quieres ser un purista (los valores de color permanecen exactamente como vienen del .psd), puedes hacer que _navigationBarBG sea un UIImageView y usar tu fondo personalizado allí, y el fondo de la UINavigationBar real que estableces para dibujar claro (o estire una imagen transparente de 1px si desea utilizar una receta típica de "cambie su barra de navegación con una imagen" que está en algún lugar de Internet)]

if(self.navigationController) { _navigationBarBG = [[UIView alloc] initWithFrame: self.navigationController.navigationBar.frame]; _navigationBarBG.backgroundColor = [UIColor whiteColor]; [self.view addSubview:_navigationBarBG]; }

ENTONCES, (y esta es la parte mala, pero no veo otra forma), agrego esta vista como una subvista. PERO, cada vez que normalmente hace una llamada a [self.view addSubview: anyView], debe asegurarse de llamar a [self.view insertSubview: anyView belowSubview: _navigationBarBG];

if (_navigationBarBG) [self.view insertSubview: anyView belowSubview:_navigationBarBG]; else [self.view addSubview: anyView];

Si olvida eso, estas vistas adicionales se deslizarán debajo de su fondo de la barra de navegación y se verán raras. Entonces necesita saber que esto es una fuente de error.

¿POR QUÉ ESTOY HACIENDO ESTO? De nuevo, puede preguntar ... Quiero ser capaz de tener una barra de navegación desplazable que se desplaza cuando se desplaza hacia abajo en la vista de tabla, lo que le da al usuario más espacio en la pantalla. Esto se hace mediante el uso del delegado scrollView (scrollViewDidScroll :) y también viewWillAppear:

// FIRST DEAL WITH SCROLLING NAVIGATION BAR CALayer *layer = self.navigationController.navigationBar.layer; CGFloat contentOffsetY = scrollView.contentOffset.y; CGPoint newPosition; if (contentOffsetY > _scrollViewContentOffsetYThreshold && self.scrollingNavigationBarEnabled) { newPosition = CGPointMake(layer.position.x, 22 - MIN((contentOffsetY - _scrollViewContentOffsetYThreshold), 48.0)); // my nav bar BG image is 48.0 tall layer.position = newPosition; [_navigationBarBG setCenter: newPosition]; // if it''s nil, nothing happens } else { newPosition = kNavBarDefaultPosition; // i.e. CGPointMake(160, 22) -- portrait only layer.position = newPosition; [_navigationBarBG setCenter: newPosition]; // if it''s nil, nothing happens }


Estaba buscando una respuesta a esto, ya que quería que mis subvistas estuvieran en (0,0) y no (0,44) (en referencia a los límites de la pantalla), pero no pude encontrar una respuesta sobre cómo configurar esto en el NavigationController, que pensé que sería una propiedad incluida.

Lo que terminé haciendo fue muy simple: agregar una subvista al controlador de navegación que tenía el ancho y alto de la barra de navegación, pero luego insertar la subvista debajo de la barra de navegación.

Ahora la configuración es Translúcida = SÍ, pero sigue apareciendo sólida y las subvistas se comportan como yo quiero.

EDITAR: Después de volver a leer su publicación original, supongo que si va a rodar la barra de navegación, tendrá que tener en cuenta ocultar y mostrar la nueva subvista mientras hace lo mismo con la barra de navegación


Lo que funcionó para mí fue agregar extendedLayoutIncludesOpaqueBars = true en viewDidLoad

algo como esto

override func viewDidLoad() { super.viewDidLoad() extendedLayoutIncludesOpaqueBars = true }

Espero que funcione también para ti