2012-09-28 26 views
9

Prefiero desactivar autoresizesSubviews y usar setFrame para colocar todas mis subvistas. A partir de iOS 6, las cosas parecen haber cambiado mucho. Cuando llamo a setFrame en una vista en viewDidLoad, no hay ningún efecto. Lo intenté desde viewWillAppear; la misma cosa.iOS: setFrame ya no funciona desde viewDidLoad o viewWillAppear

Una llamada setFrame funcionará en willAnimateRotationToInterfaceOrientation, pero eso no se llama inicialmente al igual que lo fue en iOS 5.

Puede alguien aclarar por favor, donde se espera que yo a la disposición de mis puntos de vista?

+0

¿Deshabilitará también la función de disparo automático? – Philip007

Respuesta

19

Supongo que quiere diseñar sus vistas desde UIViewController. ¿Usted ha intentado llevar a cabo sus tareas de diseño en viewDidLayoutSubviews:

- (void)viewDidLayoutSubviews 

De acuerdo con la documentación de Apple:

Su controlador de vista puede reemplazar este método para hacer cambios después de la vista expone sus subvistas.

Dado que su vista en sí misma no hace del diseño sus subvistas (no usa autosize, autolayout o layoutSubViews :) puede realizar las tareas de diseño en este método.

Sin embargo, la manera elegante sería el uso de una matriz UIView personalizada y realizar todo el diseño existe, anulando de UIView layoutSubViews: (a menos que se agrega/quita vistas dinámicamente). Presupuesto de la documentación de Apple en "How View Controllers Participate in the View Layout Process":

Idealmente, los puntos de vista a sí mismos realizar todos los trabajos necesarios para reposicionarse, sin que el controlador de vista para participar en el proceso en absoluto. Sin embargo, si el controlador de vista agrega y quita vistas de forma dinámica, es posible que no sea posible un diseño estático en el Creador de interfaces. En este caso, el controlador de vista es un buen lugar para controlar el proceso, porque a menudo las vistas en sí mismas solo tienen una imagen limitada de las otras vistas en la escena.

+0

Pedir las vistas para que se desvelen no tiene sentido para mí. Las vistas no tienen autoridad para decir a dónde deben ir. Esa es la función del controlador, ¿no es así? – Prog

+0

UIViewController tiene una propiedad de vista que apunta a una vista única: la vista de contenido del controlador de vista. Esta vista única es responsable de mostrar todo lo que está relacionado con su controlador. En teoría, esta vista única conoce todas sus subvistas y también su diseño. Por favor piense por qué el controlador de vista tiene un método llamado "viewDidLayoutSubviews". Debido a que el diseño de las subvistas debería ser responsabilidad de THE (contenido) view. Es cierto que también es posible diseñar las subvistas desde el controlador y no es necesariamente una mala práctica. –

+0

Siempre he encontrado la idea de Apple de que el autoajuste debería ser una especie de muerte cerebral. ¿Nunca han leído un libro sobre diseño de interfaz de usuario? Un mecanismo automático de cambio de tamaño de la vista nunca producirá el diseño ideal de las subvistas. El diseño debe hacerlo la persona que diseñó la IU. El enfoque automático es antitético al buen diseño, y me sorprende que una compañía anteriormente dirigida por Steve Jobs defienda ese enfoque. Tal vez, si su única subvista es algo una tabla, el diseño automático es apropiado. Pero si tiene una variedad de subvistas, no tiene sentido automatizar el diseño. – Prog

0

En cuanto a "Pedir que las vistas se extiendan por sí mismas no tiene sentido para mí. Las vistas no tienen autoridad para decir dónde deben ir. Esa es la función del controlador, ¿no?". Creo que la respuesta es a menudo negativa. Es la vista principal (no ver el controlador) que generalmente desempeña la función de diseñar sus propias subvistas. Lo hace al utilizar autoresizingMask o autolayout (iOS 6 solamente). O bien, puede hacer el diseño mediante programación anulando el método -layoutSubviews de la vista principal.

Seguro, como se menciona Imre, el controlador también puede participar en el proceso de disposición anulando - (void)viewDidLayoutSubviews. A menudo uso este enfoque cuando no quiero subclasificar la vista de nivel superior del controlador de vista para mantener las cosas simples.

Finalmente, encontré este post súper útil. Incluso con algunos errores menores, la publicación proporciona una visión general del proceso de diseño de vista.

3

Puede usar setFrame en viewDidLoad si desmarca la opción Autolayout en el Generador de interfaces. Si necesita utilizar el diseño automático, debe realizar las tareas de diseño en viewDidLayoutSubviews:.

Uncheck Autolayout in Interface Builder

+0

Guau, no entendí eso. Gracias por el aviso, ahora estoy haciendo todo mi diseño inicial en viewWillAppear. –

Cuestiones relacionadas