uiview - Cómo agregar restricciones de nivel superior y deshabilitar traduceAutomatizarMaskIntoConstraints en el archivo.xib de Interface Builder
interface-builder autolayout (1)
Al cargar un UIView desde un archivo nib, la vista generalmente tiene traduceAutoresizingMastIntoConstraints establecido en YES.
Como consecuencia, no puede agregar restricciones de nivel superior a la vista (por ejemplo, ancho y alto).
En el pasado he podido generar una vista de nivel superior que me permite crear restricciones de nivel superior, y establece translatesAutoresizingMastIntoConstraints
a NO.
¿Cómo puedo obtener este comportamiento al cargar un UIView desde un plumín sin crear subclases?
Actualización: aunque puede crear vistas restringibles, no lo recomendaría porque es extremadamente difícil distinguir entre las dos. Si alguna vez necesita modificar o volver a crear la vista, puede olvidar que era una vista restringible y recrear accidentalmente una vista estática. Por lo tanto, le recomendaría que deje las vistas de nivel superior como vistas estáticas y las actualice manualmente después de crearlas desde un plumín:
let view = UINib(nibName: "ABCView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
view.translatesAutoresizingMaskIntoConstraints = false
Si la vista necesita un tamaño de contenido intrínseco, anule intrinsicContentSize o defina su ancho y / o altura mediante el archivo nib, simplemente agregue una subvista de "tamaño" que esté anclada en la parte superior de la vista del nivel superior (es decir, la vista estática). restricciones inferiores, finales y principales, y tiene una restricción de ancho y / o altura.
Esta parece ser una característica Xcode no documentada (probada en Xcode 6 y Xcode 7.1).
Usaré los siguientes términos:
- Vista estática : las vistas predeterminadas que no permiten las restricciones de nivel superior, y
translatesAutoresizingMaskIntoConstraints
en YES. - Vista restringida: una vista que le permite crear restricciones de nivel superior, y
translatesAutoresizingMaskIntoConstraints
establecido en NO.
Primero echemos un vistazo a algunas de sus diferencias ...
Vista estática
Contenido de .xib:
<view contentMode="scaleToFill" id="bU6-qJ-x7d" userLabel="STATIC">
<rect key="frame" x="0.0" y="0.0" width="320" height="439"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="687" y="37.5"/>
</view>
Más información:
-
<UIView: 0x7fec19ccb1b0; frame = (0 0; 320 439); autoresize = W+H; layer = <CALayer: 0x7fec19ccae80>>
- traduceAutoresizingMaskIntoConstraints: SÍ
- No se pueden agregar restricciones de nivel superior en Interface Builder.
Vista incontrastable
Contenido de .xib:
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0G6-nE-8IZ" userLabel="CONSTRAINABLE">
<rect key="frame" x="0.0" y="0.0" width="320" height="439"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="687" y="-455.5"/>
</view>
Más información:
-
<UIView: 0x7f9503eb2ba0; frame = (0 0; 320 439); autoresize = RM+BM; layer = <CALayer: 0x7f9503e9dc80>>
- traduceAutoresizingMaskIntoConstraints: NO
- Puede agregar restricciones de nivel superior en el Interface Builder.
Diferencias sutiles:
- El estático tiene un elemento
<autoresizingMask ...
- Al arrastrar en una UIView desde la Biblioteca de objetos al espacio en blanco, se genera una vista estática .
- Arrastrar en una UIView desde la Biblioteca de Objetos como una subvista de otra vista produce una vista Restringible (incluso si no define ninguna restricción).
Cómo crear una nueva vista restringible:
- Arrastre una UIView a otra para crear una subvista. (Si no tiene nada en una punta, debe arrastrar temporalmente una vista allí y eliminarla al final de este proceso).
- Agregue una restricción a esa vista que poseerá la vista (por ejemplo, crear una restricción de ancho).
- Arrastre la vista fuera de su supervista y colóquela en la parte blanca del documento de Interface Builder.
- Ahora no debería tener una super visión y debería poder crear restricciones de nivel superior en la vista.
Cómo convertir una vista estática existente a una vista restringible:
- Arrastre la vista desde el Esquema del documento a otra vista para que se convierta en una subvista (nuevamente, puede que necesite crear una vista temporal para esto).
- Agregue al menos una restricción de nivel superior (por ejemplo, cree una restricción de altura).
- Arrastra la vista a los espacios en blanco.
- Cambie el tamaño de la vista a Forma libre en el Inspector de atributos en Métricas simuladas.
Cómo convertir una vista restringible existente a una vista estática:
- Arrastre la vista desde el Esquema del documento a otra vista para que se convierta en una subvista (nuevamente, puede que necesite crear una vista temporal para esto).
- Elimine todas sus restricciones de nivel superior (por ejemplo, elimine sus restricciones de ancho / altura).
- Arrastra la vista a los espacios en blanco.
- Cambie el tamaño de la vista a Forma libre en el Inspector de atributos en Métricas simuladas.