xcode4 interface-builder nslayoutconstraint

xcode4 - ¿Cómo se hace que Interface Builder respete el tamaño del contenido intrínseco de una vista personalizada en un diseño basado en restricciones?



interface-builder nslayoutconstraint (2)

Interface Builder en XCode 4.5 respeta intrinsicContentSize para algunas vistas, por ejemplo, NSButton, pero no puedo convencerlo de que lo respete en mis propias subvistas personalizadas. Esto hace que IB agregue restricciones adicionales al tratar de forzar el diseño dibujado en IB, lo que hace que los tamaños intrínsecos no se usen cuando se ejecuta el programa.

Por ejemplo, considere un botón centrado en una ventana y una vista personalizada centrada en una ventana ...

Puede ver que la vista personalizada tiene cuatro restricciones, presumiblemente porque IB no conoce el tamaño de contenido intrínseco. Puede cambiar las restricciones adicionales que se agregan, por ejemplo, puede forzar que sean ancho y alto en su lugar, pero no puede eliminarlas.

Estoy lidiando con esto ahora buscando y eliminando las restricciones adicionales en mi awakeFromNib, pero debe haber una mejor manera de hacerlo.


Bien, el punto aquí es hacer que Xcode use el tamaño de contenido intrinsicContentSize de su vista personalizada en IB.

Esto se puede lograr agregando una vista de marcador de posición dentro de su vista personalizada en IB con un ancho y una altura fijos (también puede centrarla horizontal y verticalmente)

Luego, seleccione su vista personalizada y pulse "Tamaño para ajustar el contenido" del menú Editar en IB. En este punto, todas las restricciones de definición de tamaño extra se eliminarán dejando solo las de posicionamiento.

De esa manera, IB ajustará el tamaño de su vista personalizada para que se ajuste a la vista de marcador de posición y Autolayout dependería de la anulación de su vista de - (CGSize)intrinsicContentSize en tiempo de ejecución para determinar el tamaño de su vista personalizada.

El último paso es eliminar la vista de marcador de posición para permitir que su vista muestre su contenido y tamaño correctamente:

- (void)viewDidLoad { [super viewDidLoad]; [_placeholderView removeFromSuperview]; }

Sé que esto es un truco pero espero que te ayude.


Establezca un tamaño de contenido intrínseco de marcador de posición, una "conjetura", si lo desea, en Interface Builder.

  1. Seleccione su vista personalizada.
  2. Mostrar el inspector de tamaño ( Shift 5 ).
  3. Cambie el menú desplegable "Tamaño intrínseco" de "Predeterminado (definido por el sistema)" a "Marcador de posición".
  4. Ingrese conjeturas razonables en el ancho y la altura de su vista.

Estas restricciones se eliminan en tiempo de compilación, lo que significa que no tendrán ningún efecto en su aplicación en ejecución, y el motor de diseño agregará las restricciones según corresponda en el tiempo de ejecución para respetar el tamaño de contenido intrinsicContentSize la vista.