UIViews termina debajo de la barra de tabs

En mi aplicación, alineé una label con la cantidad estándar desde la parte inferior de la guía de salida utilizando la reproducción automática. Cuando la aplicación comienza por primera vez, todo está configurado como quería, pero cuando cambio las tabs y vuelvo, la label ha desaparecido debajo del controller de la barra de tabs.

Si giro el dispositivo, la vista horizontal aparecerá correctamente y cuando vuelva a girarla, la vista vuelve a la normalidad. No puedo entender qué está causando este comportamiento. ¡Gracias por tu ayuda!

Esto sucede debido a un error en iOS7, donde la guía de layout inferior está configurada incorrectamente en altura 0 en lugar de la altura de la barra de tabs. Cuando gira el dispositivo, la guía de layout inferior se configura correctamente.

Actualmente, su mejor opción es deshabilitar el layout extendido inferior:

- (UIRectEdge)edgesForExtendedLayout { return [super edgesForExtendedLayout] ^ UIRectEdgeBottom; } 

Haga esto para cada controller de vista que se muestra desde el controller de la barra de tabs. Recuerde configurar el color de background del controller de vista de la barra de tabs en el que mejor se adapte a su aplicación.

Asegúrese de abrir un informe de errores en https://bugreport.apple.com

Para elaborar un poco más, parece que viewDidLayoutSubviews se llama dos veces al cambiar los controlleres de vista. La primera vez, todo está configurado correctamente, pero la segunda vez que la altura de la guía de layout inferior es 0. Puede ver en la traza de la stack que la primera viene del layout de la barra de tabs, mientras que la segunda es de un layout CALayer progtwigdo, que es incorrecto .

Mientras que la respuesta de Leo muestra cómo hacerlo mediante progtwigción, si desea hacerlo desde el creador de la interfaz, select su Controlador de vista y desactive la casilla "Debajo de las barras inferiores" de la sección Extender bordes:

imagen

Llamar a setNeedsLayout es todo lo que hay que hacer. Esto esencialmente resuelve el error del marco. Debe llamarse en la vista del UITabBarController cuando se selecciona una nueva vista. Cree un delegado para el controller de barra de tabs de la aplicación. y coloque esto en el object de delegado:

 @interface MyPatch : NSObject <UITabBarControllerDelegate> @end @implementation MyPatch -(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { [tabBarController.view setNeedsLayout]; } @end 

E inicialízalo donde quieras … algo como esto:

 @interface AppDelegate : UIResponder <UIApplicationDelegate> { MyPatch *patch; } @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { patch=[MyPatch new]; myTabBarController.delegate=patch; } @end 

Leo tiene razón, el bottomLayoutGuide se devuelve incorrectamente. Pero descomponer los bordes extendidos debajo de las barras inferiores (o sobrescribir edgesForExtendedLayout ) tenía demasiados efectos no deseados en otras subtestings para mí.

Si desea cambiar solo la restricción para una vista de acuerdo con la guía de layout inferior, implementar viewWillLayoutSubviews y verificar el valor de la propiedad bottomLayoutGuide y adaptar esa restricción si es necesario, así:

 - (void)viewWillLayoutSubviews { [self adaptBottomLayoutGuides]; } /// Workaround for iOS7 bug returning wrong bottomLayoutGuide length if this is 1st tab in TabViewController - (void)adaptBottomLayoutGuides { NSLog(@"%f", self.bottomLayoutGuide.length); CGFloat expectedHeight = 123; CGFloat adaptedSpacing = expectedHeight - self.bottomLayoutGuide.length; self.viewBottomLayoutSpacingConstrain.constant = adaptedSpacing; }