2009-12-09 18 views
9

Tengo una vista UIView y UIController. Mi es una vista estándar de 320x460. En applicationDidFinishLaunching hago:iPhone UIViewController va por debajo de la barra de estado

[window addSubview:[controller view]]; 

Lo extraño es que el UIView pasa por debajo de la barra de estado (como si hubiera desaparecido de salida). Sin embargo, si giro iPhone hacia un lado y luego hacia atrás, aparece bien.

¿Es este un comportamiento esperado (apuesto a que puedo solucionarlo estableciendo el desplazamiento) o estoy haciendo algo mal?

+0

tratan elementos de la interfaz de simulación? –

+0

He habilitado la barra de estado simulada en la ventana, el controlador y la vista - sin suerte ... El diseño está dañado cuando la aplicación se inicia en el iPhone o el simulador en XCode. Sin embargo, funciona bien en Simulator desde InterfaceBuilder – Mantas

Respuesta

8

Creo que su problema es que cuando se agrega una vista de una ventana, es necesario tener en cuenta el estado de la barra de estado y de compensarlo:

if showing the status bar : 
    [controller view].frame = CGRectMake(0, **20**, 320, 460); 
else 
    [controller view].frame = CGRectMake(0, 0, 320, **480**); 

esta es la razón del IB que una muestra barra de estado ficticia.

+0

Gracias. Ya estaba usando esto para solucionar el problema. Simplemente no estaba seguro de si esa es la forma convencional de solucionarlo. – Mantas

+0

Gran solución, pero nota al margen, ** 20 ** debe ser el segundo parámetro para CGRectMake, no el primero :). – makdad

0

¿Está configurando manualmente la propiedad oculta de la barra de aplicaciones DESPUÉS de agregar la subvista? No me imagino que este es el caso, pero si se configura como none cuando primero carga la vista, se distribuirá como si no hubiera una, y si luego configura la barra de estado para que no esté oculta, aparecerá en la parte superior. de tu vista

Una posible solución es usar [[controller view] setNeedsLayout]; después de agregar la subvista, o posiblemente [window layoutSubviews];. Nunca he tenido mucho éxito al usarlos para solucionar problemas de diseño, pero dado que funciona después de una rotación, vale la pena intentarlo.

+0

No configuro la barra de aplicaciones oculta en ningún punto. Esas cosas de redistribución no ayudaron ... – Mantas

18

Me encontré con este problema al mostrar un UIViewController a través de presentModalViewController.

Puede llegar a su alrededor cambiando el tamaño manualmente vista del controlador después la vista ha aparecido:

- (void) viewDidAppear: (BOOL) animated { 
    //manually adjust the frame of the main view to prevent it from appearing under the status bar. 
    UIApplication *app = [UIApplication sharedApplication]; 
    if(!app.statusBarHidden) { 
     [self.view setFrame:CGRectMake(0.0,app.statusBarFrame.size.height, self.view.bounds.size.width, self.view.bounds.size.height - app.statusBarFrame.size.height)]; 
    } 
} 
+4

Seguimiento: la mejor solución que he visto para esto es abrir el archivo nib para su controlador de visualización, seleccionar la vista principal y en "Elementos de interfaz de usuario simulados" configurar la opción "Barra de estado" a cualquier cosa que no sea "No especificado". No puedo explicar qué valores internos se cambian, solo que esto resolvió el problema para mi aplicación. Si haces esto, no necesitarás el código en mi respuesta anterior. –

+0

app.statusBarFrame.size.height devuelve 0. :( – Gik

+0

Corrección (en mi comentario): [[UIApplication sharedApplication] statusBarFrame] .size.height devuelve 0 si se ejecuta antes algo así como: [[UIApplication sharedApplication] setStatusBarHidden: NO withAnimation: NO]; Pero después de eso, devuelve 20. statusbarHeight = [[UIApplication sharedApplication] statusBarFrame] .size.height; // statusbarHeight == 20 – Gik

1

Si está utilizando de Interface Builder "simulado Interfaz de usuario Elementos", entonces también hay que asegurarse que ha establecido el indicador para "Cambiar el tamaño de la vista de NIB" en su plumilla MainWindow.

3

Finalmente, llegué a esta solución. Funciona bien tanto para iPhone & iPad:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

    // Allocate view controller and load nib file 
    if (isIPhone) { 
     self.mainViewController = [[[tfdMainViewController_iPhone alloc] initWithNibName:@"tfdMainViewController_iPhone" bundle:nil] autorelease]; 
    } else { 
     self.mainViewController = [[[tfdMainViewController_iPad alloc] initWithNibName:@"tfdMainViewController_iPad" bundle:nil] autorelease]; 
    } 

    // Offset correction (iPhone bug?) 
    CGRect r = self.mainViewController.view.frame; 
    r = CGRectOffset(r, 0, [UIApplication sharedApplication].statusBarFrame.size.height); 
    [self.mainViewController.view setFrame:r]; 

    [window addSubview: self.mainViewController.view]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

P. S. Por alguna razón, la vista tiene la altura correcta: 480 (altura de pantalla en modo retrato de iPhone) - 20 (barra de estado) = 460, pero no se pudo establecer el desplazamiento vertical. Es un comportamiento bastante extraño, parece un error.

3

Las correcciones a la ventana no me funcionaron porque tenía una vista modal. Una vista modal UIModalPresentationCurrentContext. OK, esto es lo que funcionó para mí. He estado buscando en la web arriba y abajo antes de hacer que esto funcione. No puedo mover view.frame del padre. Sin embargo en el viewWillAppear soy capaz de moverlo hacia abajo:

- (void)viewWillAppear:(BOOL)animated 
{ 
    // Move down to compensate for statusbar 
    CGRect frame = parentView.navCon.view.frame; 
    frame.origin.y = [UIApplication sharedApplication].statusBarFrame.size.height; 
    parentView.navCon.view.frame = frame; 
} 
+1

Eso es "hacer trampa"! ;-) Deberías "encontrar" la altura del statusBar y no "hardcode" a 20. ¿Qué pasa si Apple decide cambiarlo para decir 25? ¡Entonces te bajarás 5px! – Gik

+1

OK, actualicé mi respuesta. –

5

agrego este tema en la actualidad. Resultó que había marcado "Quiere pantalla completa" en el inspector de atributos de ViewController.

Desactivar "Quiere pantalla completa" resolvió el problema.

0

Incluso yo también tiene el mismo problema. Cuando estamos usando alguna codificación para la orientación del dispositivo, hemos escrito alguna codificación en el delegado de la aplicación o en nuestro controlador de vista. Ahí tenemos que cambiar la condición para usar la orientación return YES o NO. Eso resolvió nuestro problema.

0

Prefiero usar UINavigationController para envolver el UIViewController, luego de eso, configure el NavigationBarHidden al UINavigationController. Es la solución perfecta porque UINavigationController maneja la altura de la barra de estado en iOS 7.

Aquí está mi código y mi captura de pantalla.

UINavigationController *wrapNavController = [[UINavigationController alloc] initWithRootViewController:yourViewController] ; 

[wrapNavController setNavigationBarHidden:YES] ; 
0

El Xcode 6, solución iOS7/8 es en desmarcar la "Bajo Top Bars" marca de verificación en la sección "Extender bordes" de la sección Vista Controlador del Inspector Atributos.

0

Para Xamarin.iOS sería:

if (UIApplication.SharedApplication.StatusBarHidden == false) 
{ 
    var statusBarHeight = UIApplication.SharedApplication.StatusBarFrame.Height; 
    View.Frame = new CoreGraphics.CGRect(0, statusBarHeight, View.Frame.Width, View.Frame.Height - statusBarHeight); 
} 
Cuestiones relacionadas