2009-08-31 11 views
15

Tengo una vista que se carga en MainWindow.xib. Es solo una vista con una vista de uiimage que muestra una imagen en toda la pantalla (320 X 480). Cuando se carga la aplicación Me muestran este punto de vista y luego hacer una ficha Controller BarIPhone - UIView addSubview Gap en la parte superior

[self.view addSubview:tabbarController.view]; 

es sólo un UITabBarController con 2 Ver los controladores añadidos a la misma. Cuando agrega la vista de tabbarController a la subvista, deja un espacio en la parte superior de aproximadamente 20 px. Mi aplicación tiene una barra de estado, pero básicamente es espacio para otra. Esto sucede a menos que agregue esto a mi controlador de vista:

self.view.frame = CGRectMake(0, 0, 320, 480); 

¿Alguien puede explicar esto. Estaba haciendo

self.view = tabbarController.view; 

pero me dijeron que no debía hacer eso. Así que ahora estoy agregando una subvista, pero no entiendo por qué tengo que ajustar el CGRect de mi vista para no mostrar el 20px.

Respuesta

17

UITabBarController espera tener su vista agregada como una subvista de UIWindow, no como una subvista de algún otro UIView. La propiedad de marco define el desplazamiento de la vista dentro de su supervista, por lo que la implementación de UITabBarController compensa el marco de su vista en 20 píxeles de forma predeterminada para dejar espacio para la barra de estado. Está utilizando UITabBarController de una forma no estándar al agregarlo a una vista que ya ha sido compensada por 20 píxeles para la barra de estado. UITabBarController compensa su vista en 20 píxeles adicionales en relación con su supervista, lo que causa el espacio que ve.

Una forma limpia para solucionar este problema es añadir la opinión de la UITabBarController como una vista secundaria de la ventana en vez de una vista:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view]; 

(Nota: El método keyWindow sólo devolverá la ventana si ha llamado ya makeKeyAndVisible. De lo contrario, es posible que desee establecer una propiedad de ventana en su UIViewController.)

+0

Gracias por una explicación clara. Tal vez debería volver atrás y reestructurar parte de mi aplicación. Quiero hacer las cosas de la manera correcta, pero pensé que sería mejor separar la lógica del controlador de vista del delegado de la aplicación, por lo que mi controlador de vista raíz hace todo lo que necesita. Eso explicaría por qué en mi controlador de vista raíz si hiciera self.view = tabbarController.view en lugar de agregar como una subvista, no obtendría el espacio. Gran respuesta. Yo votaría más si pudiera. – Brian

+0

Parece que tu instinto fue bueno aquí. Esta es solo una de esas limitaciones de diseño en Cocoa Touch que tenemos que solucionar por el momento. Tenga en cuenta que no es necesario que agregue tabbarController.view a su ventana del delegado de la aplicación. Puede agregarlo en su controlador de vista si cree que tiene más sentido. Solo necesita tener acceso al objeto ventana, ya sea a través del método keyWindow, o configurándolo como una propiedad en su controlador en la aplicaciónDidFinishLaunching :. – cduhn

+0

, pero ¿no significa esto que tabbarcontroller.view ahora es una subvista de window.view? Pero no es correcto en mi caso tengo una vista de anuncio, y luego una segunda vista de contenido. Y agrego tabbarcontroller.view a la vista de contenido. De esta forma, viewcontroller manejará el contenido/vista previa dependiendo de los anuncios. si agrego el tabbarcontroller.view a la ventana, no creo que pueda manejar las vistas con mi viewcontroller. ¿Qué piensas? – LolaRun

Cuestiones relacionadas