bar ios objective-c uinavigationcontroller uinavigationbar ios7

ios - bar - navigation controller programmatically swift



Barra de estado de iOS 7 se bloquea con NavigationBar (17)

Usando Swift :

Como dijo @Scott Berrevoets en su respuesta, debe implementar el método positionForBar en el protocolo UIBarPositioningDelegate , pero como el protocolo UINavigationBarDelegate implementa este protocolo:

public protocol UINavigationBarDelegate : UIBarPositioningDelegate { ... }

Solo necesita configurar el delegate de UINavigationBar que configuró utilizando Storyboard e implementar el método, y está hecho, como en este caso:

class ViewController: UIViewController, UINavigationBarDelegate { @IBOutlet weak var navigationBar: UINavigationBar! override func viewDidLoad() { super.viewDidLoad() self.navigationBar.delegate = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func positionForBar(bar: UIBarPositioning) -> UIBarPosition { return UIBarPosition.TopAttached } }

NOTA: Vale la pena mencionar si establece la posición del eje y de la barra de navegación, digamos a 40 desde la parte superior, luego se extenderá debajo de esta posición desde arriba, para simular el comportamiento del UINavigationController que necesita establecer a 20 desde la parte superior.

Espero que te ayude.

Tengo un controlador de vista en mi aplicación que tiene una barra de navegación arrastrada en el guión gráfico. Funcionó bien en iOS 6 pero en iOS 7 se ve así:

La barra de estado y la barra de navegación no deberían colisionar entre sí. He visto muchas de esas preguntas en el desbordamiento de la pila, pero no me sirvieron de mucho.

Algunas preguntas dicen que debería usar este "self.edgesForExtendedLayout = UIRectEdgeNone;" pero no funcionó. Algunos dicen que debería quitar la barra de navegación e incrustarla dentro del controlador de navegación que no puedo debido a la forma en que se implementa mi programa. Algunas soluciones sugieren usar los límites de vista y todo, pero tampoco funcionó para mí.

¿Cuál es la única cosa que puede ayudarme a resolver este problema? ¡Gracias por adelantado!

ACTUALIZACIÓN: he integrado el controlador de visualización dentro de un controlador de uinavigation. Se eliminó la barra de navegación que anteriormente se agregó manualmente. Ahora se ve bien en el guión gráfico, pero cuando lo ejecuto, muestra lo siguiente:

Muestra el texto de otro controlador de vista que está detrás de él, que es su controlador de vista principal. Significa que es transparente ahora. ¿Alguien puede señalar lo que estoy haciendo mal?


En caso de que todavía ayude a alguien, esto es lo que funcionó para mí al mover la Barra de navegación un poco hacia abajo en iOS 7 y superior:

-(void)viewWillLayoutSubviews { float iosVersion = 7.0; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) { // iOS 7+ CGRect viewFrame = self.view.frame; viewFrame.origin.y += 10; self.view.frame = viewFrame; } }

En un dispositivo con iOS 6.1 y debajo, la barra de navegación no cambiará, como estaba antes.

Y esto es lo que solía hacer el contenido de la barra de estado más ligero:

-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }



Esta es una nueva característica con IOS7. En lugar de mirar a la barra de navegación de 20 px en IOS7 mirando a 0 px. Como solución, cambie toda la vista hacia abajo a 20 px o puede usar la imagen para la barra de navegación con una altura de 64px.


Estaba enfrentando un problema cuando se abría ModalViewController pantalla completa desde mi MainViewController , la posición de NavigationBar se cambiaba cuando el usuario volvía a MainViewController desde ModalViewController .

Problema que noté es que la altura de la barra de estado no se incluía cuando el usuario regresó a MainViewController . Por favor, depure y verifique el origen de su NavigationBar antes y después de volver a su ViewController .

// This method will adjust navigation bar and view content. private func adjustNavigationControllerIfNeeded() { var frame = self.view.frame let navigationBarHeight = self.navigationController!.navigationBar.frame.size.height if(frame.origin.y == navigationBarHeight && !UIApplication.shared.isStatusBarHidden) { // If status bar height is not included but it is showing then we have to adjust our Navigation controller properly print("Adjusting navigation controller") let statusBarHeight = UIApplication.shared.statusBarFrame.height frame.origin.y += statusBarHeight // Start view below navigation bar frame.size.height -= statusBarHeight self.view.frame = frame self.navigationController!.navigationBar.frame.origin.y = statusBarHeight // Move navigation bar } }

Y llamarlo desde el método viewWillAppear -

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.adjustNavigationControllerIfNeeded() }


Esto funciona para mí, espero que también tengas la misma suerte :).
Agregue el código siguiente en su vista.

-(void) viewDidLayoutSubviews { CGRect tmpFram = self.navigationController.navigationBar.frame; tmpFram.origin.y += 20; self.navigationController.navigationBar.frame = tmpFram; }

Básicamente cambia la ubicación de la barra de navegación.


La última versión del iOS ha traído muchos cambios visuales y, desde el punto de vista del desarrollador, la navegación y la barra de estado son dos cambios notables.

La barra de estado ahora es transparente y la barra de navegación detrás de ella se muestra. La imagen de la barra de navegación puede incluso extenderse detrás de la barra de estado.

En primer lugar, si eres un principiante y acabas de iniciar el desarrollo de iOS y estás confundido por la forma en que funcionan la barra de estado y la barra de navegación, simplemente puedes acceder a una publicación de blog HERE que me pareció muy útil. Tiene toda la información relacionada con la navegación y la barra de estado en iOS 7.

Ahora viene la respuesta a tu pregunta. Antes que nada puedo ver dos problemas diferentes. Una es que la barra de estado y la barra de navegación colisionan entre sí, tal como lo muestra en la pregunta con una imagen.

PROBLEMA: Bueno, el problema es que antes has arrastrado una barra de navegación en tu controlador de vista que funcionaba correctamente en iOS 6 pero con la llegada del SDK de iOS 7, este enfoque hace que la barra de estado y la barra de navegación se superpongan entre sí.

SOLUCIÓN al primer problema: puede usar UIBarPositionTopAttached o puede usar ver límites y marcos, también puedo sugerir y vincularlo con la documentación de Apple y bla bla bla, pero eso le tomará un tiempo para resolver el problema.

La mejor y más fácil manera de resolver este problema es simplemente incrustar su controlador de vista dentro de un controlador de navegación y eso es todo. Puede hacerlo simplemente seleccionando el controlador de vista y yendo a Editor> Incorporar en> Controlador de navegación . (Si hay contenido en la barra de navegación anterior, primero puede arrastrarlo hacia abajo, insertar el controlador de visualización en el controlador de navegación y luego mover los botones de la barra de navegación nueva y luego eliminar la barra de navegación anterior)

SOLUCIÓN al segundo problema: esta solución es para su pregunta específica que ha mencionado en la actualización y no es para el público en general leer esto. Como puede ver, la barra de navegación y estado no está visible y un área transparente muestra el controlador de vista principal. Realmente no me explico por qué enfrentas este problema, pero muy probablemente debido a una biblioteca de terceros como ECSlidingView o cualquier otra persona involucrada. Puede seleccionar este controlador de vista en su guión gráfico y establecer el color de fondo de la vista para que sea el mismo que su barra de navegación. Esto dejará de mostrar el controlador de vista principal atrás y la barra de navegación y la barra de estado comenzarán a mostrarse. Ahora puede cubrir el resto de su controlador de vista con vista de texto o lo que esté usando en él.

¡Espero que esto ayude!


La barra de navegación está demasiado cerca de la barra de estado porque, a partir de iOS 7, la barra de estado es más una superposición sobre la vista del controlador de toda la vista. Como su barra de navegación está en (0, 0), la barra de estado se mostrará en la parte superior de la barra de navegación. Para solucionar esto, simplemente mueva la barra de navegación hacia abajo (o, como han dicho otros), cree una restricción entre la barra de navegación y topLayoutGuide.

Cuando hagas eso, verás que ahora hay un espacio de 20 puntos entre la barra de navegación y la parte superior de la pantalla. Eso es porque acaba de mover la barra de navegación 20 puntos hacia abajo. "¡Pero UINavigationController puede hacerlo bien!" Absolutamente, y lo hace implementando UIBarPositioningDelegate en su controlador de vista. Este es un protocolo de un solo método que debe implementarse así:

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

Después de agregar su controlador de vista como el delegado para la barra de navegación, notará que la barra de navegación todavía se desplaza 20 puntos hacia abajo, pero su fondo se extenderá debajo de la barra de estado, al igual que en UINavigationController .

Otra cosa que está viendo es que la barra de navegación es translúcida, lo que significa que cualquier elemento debajo de la barra de navegación será visible hasta cierto punto. La propiedad translucent en UINavigationBar se establece en YES de forma predeterminada en iOS 7. Antes de iOS 7, el valor predeterminado era NO .


Para los que están teniendo problemas para implementar la solución de @Masterfego (que también es el oficial, pero he tenido problemas con Xcode 6.3 y restricciones automáticas), esto es lo que hice:

Tengo un UIViewController con una barra de navegación añadida. Seleccioné la barra NAvigation y agregué una restricción de altura de 64px. Más tarde vemos una advertencia de que la barra de navegación será más alta (pero esto es lo que hacemos). Finalmente, puede ver que la barra de estado se ve bien y tiene el mismo color que la barra de navegación. :)

PD: no puedo publicar imágenes todavía.


Primero, configure UIViewControllerBasedStatusBarAppearance en NO en Info.plist. Luego, en la application:didFinishLaunchingWithOptions: AppDelegate application:didFinishLaunchingWithOptions: method add:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.clipsToBounds = YES; self.window.frame = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height-20); self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height); } return YES;



Si su UIViewController NO se encuentra en un UINavigationController y está utilizando UIStoryBoard , puede configurar los "iOS 6/7 Deltas" en 20 para el delta Y, para cada subvista que necesite ser desplazada desde UIStatusBar .


Si usa Xcode 6 y Swift, puede hacerlo:

  1. Abra en el archivo info.plist de su aplicación.
  2. Agregue una clave booleana ViewControllerBasedStatusBarAppearance si no existe y asigne el valor "NO".
  3. Agregue la tecla "Estilo de barra de estado" si no existe y seleccione el valor "Estilo negro opaco".


en la ventana de iOS anterior se inicia después de la barra de estado y en iOS 7 la ventana comienza desde 0px en versiones anteriores, la altura de visualización es 460 (iPhone 4s y anteriores) y 548 (iPhone 5) pero en iOS 7 la altura es 480 (iPhone 4s y anterior) y 568 (iPhone 5 y versiones posteriores) por lo que debes comenzar a ver la distribución después de 2o px o tienes que iniciar la vista desde 20px.

puede escribir el código siguiente en rootviewcontroller o en todo viewcontroller para establecer la vista desde 20px

#define IOS7_HEIGHT 64 - (void)viewDidLayoutSubviews { NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) { CGRect frame=[self.view frame]; if (frame.origin.y!=IOS7_HEIGHT) { frame.origin.y = IOS7_HEIGHT; frame.size.height -= IOS7_HEIGHT; [self.view setFrame:frame]; [self.view layoutSubviews]; } } }

aquí la altura es 64 porque 20 para la barra de estado y 44 para la barra de navegación. prueba el siguiente código, te ayudará. y tu problema será resuelto


es la mejor respuesta. Pero quería saber cómo usar un Storyboard y arrastré UINavigationBar sobre él. Cuando implementé el método de delegado y establecí el resultado de devolución en UIBarPositionTopAttached , no funcionó.

- (void)viewDidLoad{ self.navigationbar.delegate = self; } - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar{ NSLog(@"Got it"); // // CGRect frame = self.navigaitonBar.frame; // // frame = CGRectMake(0, 20, CGRectGetWidth(frame), CGRectGetHeight(frame)); // self.navigaitonBar.frame = frame; // // NSLog(@"frame %f",frame.origin.y); return UIBarPositionTopAttached; }


simplemente puedes hacer esto:

1) agregue una restricción entre la barra de navegación y la guía de diseño superior (seleccione la barra de navegación, mantenga presionada la tecla ctrl y vaya a la guía de diseño inferior, desmarque la tecla Ctrl)

2) seleccionar espaciado vertical :

3) establecer constante a 0 :

Resultado:

ACTUALIZAR

En su archivo AppDelegate puede agregar esto:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Prevent Navigationbar to cover the view UINavigationBar.appearance().translucent = false }