2011-08-03 6 views
7

Tengo un UITableView configuración que se puede poner en marcha un selector de color a través de un enfoque UINavigationController:¿Por qué self.bounds.size.height no tiene en cuenta la barra de navegación UINavigationView en este código?

[self.navigationController pushViewController:colorPickerViewController animated:YES]; 
[colorPickerViewController release]; 

El efecto de esto significa que el ColourPicker tendrá una barra de navegación en la parte superior (y botón de retroceso)

El estructura de la ColourPickerViewControll y ver ColourPickerView es el siguiente:

- ColourPickerViewController - in it's XIB file at the top level view it has: 
    - ColorPickerView : UIView (i.e. custom UI view) - in it's methods it has: 
    - (id)initWithCoder:(NSCoder*)coder { 
     if ((self = [super initWithCoder:coder])) { 
     CGFloat currVertBounds = self.bounds.size.height; 

el tema aquí es el valor de currVertBounds está llegando a la 480, por lo que no está teniendo en cuenta o f la barra de navegación

PREGUNTA: ¿Cómo obtengo la altura verdadera mostrada de la instancia de ColorPickerView?

¿Tiene algo que ver con tratar de obtener el diseño calculado en la UIView personalizada, y quizás la vista personalizada no se represente en el control/navigationController general en esa etapa?

+0

Desea cambiar la altura de la barra de navegación o nt. – ram

Respuesta

7

Estás leyendo bounds demasiado pronto. Ninguna de las magias de diseño/subvista que ocurre en UIKit tendrá lugar durante el [super initWithCoder:]. Usted debe estar leyendo bounds y la disposición de su punto de vista, ya sea:

  1. En viewDidLoad/viewWillAppear, y establecer los parámetros autosizing para todos los elementos de interfaz de usuario creadas manualmente para que se hagan movido un poco con respecto a las diferentes orientaciones de interfaz. En estas funciones, no confiaría en que bounds sea exactamente correcto, pero diría que tiene al menos la relación altura/anchura correcta. Sin embargo, posiblemente podría estar en la orientación incorrecta.
  2. En viewDidAppear, si desea colocar elementos manualmente. Cuando llega al viewDidAppear, todo el cambio de tamaño ha tenido lugar, y lo único que le queda por preocuparse son las rotaciones futuras, en las que debe ajustar su vista en willAnimateRotationToInterfaceOrientation:duration:.

Docs en willAnimateRotationToInterfaceOrientation:duration: estado:

Por el momento este método se llama, la propiedad interfaceOrientation ya está establecido en la nueva orientación. Por lo tanto, puede realizar cualquier diseño adicional requerido por sus vistas en este método.

iOS 5.0 docs añadir la cláusula:

... ajustado a la nueva orientación , y los límites de la vista han cambiado. Por lo tanto ...

Creo que este sigue siendo el caso para las versiones anteriores de iOS.

0

Sí, esto es correcto porque la instancia de UINavigationController se declara en su (delegate.h) & que navigationbar se añade a ventana no en su self.view

Al revisar los límites de su vista actual, definitivamente debe devolver 320 * 480. No debe incluir la altura de la barra de navegación en su vista, ya que no está en esa vista. Está en la ventana.

1

Las vistas para iPhone tendrán, por definición, una altura de 480 píxeles cuando se creen en el Creador de interfaz, de modo que eso es lo que está viendo al inicializar la vista. Una vez que la vista se haya inicializado y agregado correctamente a la pila de vistas, se redimensionará para que coincida con el espacio real disponible.

Simplemente está preguntando la vista de su altura antes de que se haya ajustado. Intenta leer la altura en viewDidLoad, entonces debería ser correcta.

Cuestiones relacionadas