unidos online new estados apple iphone model-view-controller uiview uiviewcontroller

iphone - online - Dónde determinar el tamaño de UIView



iphone store (3)

Actualmente estoy tratando de lograr lo mismo después de crear una subclase de UIViewController para crear un componente genérico y me di cuenta de algo bastante extraño:

UIViewController tiene un método "loadView" que puede anular (citando documentación) "Aquí es donde las subclases deberían crear su jerarquía de vista personalizada".

Entonces, creo mi jerarquía de vistas, componiendo mi pantalla usando un tamaño de fotograma predeterminado (ya que es posible que no sepa en qué marco debería mostrar las cosas en el momento en que se llama a loadView).

Pero entonces, ¿en qué llamada configuro correctamente los tamaños de fotograma? Aka: ¿a qué hora mi controlador de vista está al tanto de su tamaño real?

¿Debo crear un "setFrame" en mi subclase ViewController al que debería llamar el objeto que crea el viewcontroller? eso parece extraño

drvdijk: ¿tuviste una solución para tu problema?

EDITAR: acaba de encontrar esta Nota en la documentación de UIViewController: Nota: No debe usar controladores de vista para administrar vistas que llenen solo una parte de su ventana, es decir, solo una parte del área definida por el rectángulo de contenido de la aplicación. Si desea tener una interfaz compuesta por varias vistas más pequeñas, incrústelas todas en una sola vista de raíz y administre esa vista con su controlador de vista.

Por lo tanto, parece que la vista principal de UIViewController siempre es a pantalla completa. Período.

Sin embargo, eso me plantea un problema, ya que estoy tratando de crear un UITabBarViewController personalizado (para poder mostrar imágenes personalizadas en la barra de pestañas, y no un degradado azul): mi control tabBarView debe mostrar los controladores de subvista en una parte de la ventana solamente. ..

Resumen: ¿cómo debe saber UIViewController el tamaño de su instancia de UIView al inicializar esa vista?

El método de inicialización dedicado para una UIView es el método de initWithFrame:(CGRect)frame . Esto establece el marco para el UIView recién creado. Este método podría UIViewController''s desde el método UIViewController''s UIViewController, si se solicita la vista de ese controlador de vista. La documentación de los estados de UIViewController con respecto a la subclasificación y el tamaño de la vista:

Al crear las vistas para su jerarquía de vistas, siempre debe establecer las propiedades de conversión automática de sus vistas. Cuando se muestra un controlador de vista en la pantalla, su vista raíz normalmente se redimensiona para adaptarse al espacio disponible, que puede variar según la orientación actual de la ventana y la presencia de otros elementos de la interfaz, como la barra de estado.

Por lo tanto, la instancia de UIViewController debe establecer esas propiedades. Hasta ahora todo bien, el UIViewController hasta ahora no tiene que saber qué tan grande es o será su vista.

Cuando se solicita la vista de un UIViewController y la propiedad de vista es nula, se llama al método loadView del controlador de vista. Ahora hay un problema, porque UIView necesita inicializarse, pero el controlador de vista todavía no sabe qué tamaño debería tener la vista. ¿Qué tan grande debe inicializar esa vista? ¿Dónde en el código determina el tamaño de la vista?

Puede inicializar la vista con un rect cero ( CGRectZero ):

- (void)loadView { self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; }

Y permita que quien llama configure el marco de vista de la siguiente manera:

UIViewController *viewController = [[MyUIViewController alloc] init]; // next two lines are normally combined, but for clarity they are not now UIView *view = viewController.view; view.frame = CGRectMake(0, 0, 200, 200);

Esto solicita la vista desde el controlador de vista (viewController.view) y, por lo tanto, carga su vista con el método loadView. Este método loadView inicializa la vista con un CGRectZero . Entonces la persona que llama establece su marco (view.frame = ...)

Lo que ocurre es que la propiedad del marco en la vista se establece dos veces, posiblemente causando incluso más trabajo doble si su UIView personalizado está haciendo un diseño avanzado en el método setFrame (colocando y redimensionando subvistas, por ejemplo). Podría evitar esto creando un método de inicialización dedicado para el UIViewController que ya le pide a la persona que llama para un CGRect, que almacenaría en un ivar. En el momento en que se llama al método loadView, usa este ivar para crear la vista.

¿Cuál es la mejor manera de ir aquí? ¿Configurando el marco de la vista dos veces (inicializando con CGRectZero , y estableciendo luego), o dándole al UIViewController un nuevo método de inicialización con un CGRect (y dándole así una propiedad de marco)? ¿O me estoy perdiendo algo y hay otras posibilidades?


Es posible que desee calcular los límites del espacio de pantalla disponible (que depende de la presencia de otras vistas, como la barra de navegación, la barra de pestañas y la barra de estado). Puede usar estos límites para el parámetro frame en [[UIView alloc] initWithFrame:] en loadView.

Si esto es lo que desea, entonces puede encontrar mi respuesta aquí útil: Determine el tamaño correcto en loadView


No tiene que usar el inicializador designado. Solo use init como en [[UIView alloc] init] . El inicializador designado debe usarse desde los inicializadores de las subclases.

Por otro lado, establecer el marco dos veces no debería causar mucho daño. Realizar muchas tareas en setFrame: es inusual. Layouting normalmente se realiza en layoutSubviews y solo se realiza una vez.