ios - superponer - se me superponen los div
¿Cómo evitar que la barra de estado superponga contenido con hidesBarsOnSwipe establecido en UINavigationController? (9)
¡La respuesta de @iOSergey funciona perfecto!
Aquí está la solución en Swift 1.2. Agregue el siguiente código al archivo de vistas .swift:
override func prefersStatusBarHidden() -> Bool {
return self.navigationController!.navigationBarHidden as Bool
}
Estoy tratando de usar la nueva función agregada en iOS 8, ocultando la barra de navegación mientras el usuario está desplazando la vista de tabla (similar a lo que hace Safari móvil). Estoy estableciendo la propiedad hidesBarsOnSwipe
de UINavigationController
en YES
en el método UITableViewController
de UITableViewController
:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if([self.navigationController respondsToSelector:@selector(hidesBarsOnSwipe)]) {
self.navigationController.hidesBarsOnSwipe = YES;
}
}
La barra de navegación se oculta cuando se está desplazando la vista. Hasta aquí todo bien. Pero la barra de estado sigue siendo visible y los contenidos de mi vista de tabla se muestran a través de ella, lo que se ve feo:
Intenté establecer edgesForExtendedLayout
en UIEdgeRectNone
o ajustar el contentInset
de la vista de tabla, pero no me ayudó. ¿Hay alguna otra solución para ocultar la barra de estado junto con la barra de navegación, o hacerla opaca?
Bien, pasé todo el día haciendo esto, espero que esto ayude a algunas personas. Hay un barHideOnSwipeGestureRecognizer
. Por lo tanto, puede hacer un oyente para el UIPanGesture
correspondiente, y señala que si la barra de navegación está oculta, entonces su origen y es -44.0; de lo contrario, es 0 (¡no 20 porque escondimos la barra de estado!).
En su controlador de vista (swift 2):
// Declare at beginning
var curFramePosition: Double!
var showStatusBar: Bool = true
self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:")
...
override func viewDidLoad(){
self.navigationController?.hidesBarsOnSwipe = true
curFramePosition = 0.0 // Not hidden
self.navigationController?.barHideOnSwipeGestureRecognizer.addTarget(self, action: "didSwipe:")
...
}
func didSwipe(swipe: UIPanGestureRecognizer){
// Visible to hidden
if curFramePosition == 0 && self.navigationController?.navigationBar.frame.origin.y == -44 {
curFramePosition = -44
showStatusBar = false
prefersStatusBarHidden()
setNeedsStatusBarAppearanceUpdate()
}
// Hidden to visible
else if curFramePosition == -44 && self.navigationController?.navigationBar.frame.origin.y == 0 {
curFramePosition = 0
showStatusBar = true
prefersStatusBarHidden()
setNeedsStatusBarAppearanceUpdate()
}
}
override func prefersStatusBarHidden() -> Bool {
if showStatusBar{
return false
}
return true
}
Debe conectar la propiedad de navegación isNavigationBarHidden con la barra de estado.
return self.navigationController.isNavigationBarHidden;
Después de mucha lucha, finalmente pude resolver esto.
- Cambie TableViewController a UIViewController
- Arrastre un TableView al UIViewController y alinéelo justo debajo de la barra de navegación en la tabla principal.
- Agrega las restricciones faltantes
- haga clic en la vista de tabla e inspeccione las restricciones
- establecer el espacio inferior para: superview a 0
- establecer el espacio final para supervisar a 0
- establecer espacio líder para superview a 0
- establecer "Alinear arriba a: Guía de diseño superior.Top a 0 (Muy importante)
Agregue el siguiente código a la función viewDidLoad de UIViewController:
// Crea un fondo de color sólido para la barra de estado (en Swift Code)
let statusFrame = CGRectMake (0.0, 0, self.view.bounds.size.width,
UIApplication.sharedApplication (). StatusBarFrame.size.height)var statusBar = UIView (frame: statusFrame)
statusBar.backgroundColor = UIColor.whiteColor ()
self.view.addSubview (statusBar)
Lo que está haciendo es crear una barra sólida justo debajo de la barra de navegación. A medida que la barra de navegación se mueve hacia arriba, la barra sólida también se mueve hacia arriba y justo detrás de la barra de estado.
El único problema es que cuando gira la pantalla hacia los lados, la barra blanca permanece allí aunque la barra de estado desaparece.
En realidad, es bastante fácil de hacer. Solo necesita conectar la propiedad de navegación isNavigationBarHidden con la barra de estado.
C objetivo
- (BOOL)prefersStatusBarHidden {
return self.navigationController.isNavigationBarHidden;
}
Swift <= 2.3
override func prefersStatusBarHidden() -> Bool {
return navigationController?.navigationBarHidden ?? false
}
Swift 3.0
override var prefersStatusBarHidden: Bool {
return navigationController?.isNavigationBarHidden ?? false
}
Y asegúrese de tener "Ver apariencia de la barra de estado basada en el controlador" = "SÍ" en su archivo .plist de la aplicación.
Esa nueva propiedad viene con su barHideOnSwipeGestureRecognizer
.
De la referencia de la clase UINavigationController :
Puede realizar cambios en el reconocedor de gestos según sea necesario, pero no debe cambiar su delegado y no debe eliminar el objeto objetivo predeterminado y la acción que vienen configurados con él. No intente reemplazar este reconocedor de gestos anulando la propiedad.
Pero puedes agregar un objetivo:
[self.navigationController setHidesBarsOnSwipe:YES];
[self.navigationController.barHideOnSwipeGestureRecognizer addTarget:self action:@selector(swipeGesture:)];
... y haz lo que quieras en la devolución de llamada:
- (void)swipeGesture:(UIPanGestureRecognizer*)gesture
{
// Tweak the status bar
}
Puede que tenga que activar manualmente los estados de los gestos, averiguar cuándo ocultar / mostrar la barra de estado, etc. ¡Espero que ayude!
Otra forma de hacerlo es simplemente agregar otra vista (arriba de la vista de tabla o colección o webview o scrollview o lo que sea) y establecer la restricción superior de la vista en "Superview.Top" y su restricción inferior en "Top Layout Guide.Bottom", configurar el Ver el color de fondo y eso es todo, incluso puedes hacerlo todo en Interface Builder sin ningún código. Y si desea responder a ese evento, puede agregar un observador keypath al cambio de límites de la vista, o subclasificar la vista y anular su configurador de límites ...
Partiendo de la respuesta de anas, tengo una solución de trabajo (supongo que tableViewController
es tu instancia UITableViewController
):
En una subclase UINavigationController
(o también potencialmente desde tableViewController
):
- (void)viewDidLoad {
if ([self respondsToSelector:@selector(barHideOnSwipeGestureRecognizer)]) {
// iOS 8+
self.hidesBarsOnSwipe = YES;
[self.barHideOnSwipeGestureRecognizer addTarget:self action:@selector(swipe:)];
}
}
- (void)swipe:(UISwipeGestureRecognizer *)recognizer {
BOOL shouldHideStatusBar = self.navigationController.navigationBar.frame.origin.y < 0;
tableViewController.hideStatusBar = shouldHideStatusBar;
[UIView animateWithDuration:0.2 animations:^{
[tableViewController setNeedsStatusBarAppearanceUpdate];
}];
}
En su tableViewController
:
@property(nonatomic, getter = shouldHideStatusBar) BOOL hideStatusBar;
- (BOOL)prefersStatusBarHidden {
return [self shouldHideStatusBar];
}
Avíseme si esto no funciona para usted. Algunas cosas no obvias:
-
self.navigationController.navigationBar.frame.origin.y
fue -44 (la altura negativa de la barra de navegación) cuando está oculta, y 20 (la altura de la barra de estado) cuando está visible. No hubo intermedios, incluso durante las animaciones, por lo que un valor negativo == oculto y un valor no negativo == visible. - El controlador de vista hijo es el que se pregunta si la barra de estado debe ocultarse o no. En mi caso, tengo un
UIViewController
dentro de unUINavigationController
dentro de unUITabBarController
, y no funcionó hasta queprefersStatusBarHidden
en elUIViewController
. - Como una barra de estado oculta no tiene marco, el contenido puede subir 20 puntos hacia arriba a menos que
setNeedsStatusBarAppearanceUpdate
la llamada asetNeedsStatusBarAppearanceUpdate
en un bloque de animación. - Esperemos que la sintaxis sea correcta; Copilicé esto desde mi código Swift.
Si desea ocultar la barra de estado con animación:
override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
return .Slide
}
override func prefersStatusBarHidden() -> Bool {
return navigationController?.navigationBarHidden ?? false
}