xcode - top - nslayoutconstraint swift 4
¿Cómo creo una vista basada en restricciones que cambie de tamaño entre iPhone 5 y iPhone 4 comparable a la operación de Anclaje? (2)
Esta es la respuesta si no desea desactivar el nuevo modo de diseño automático de iOS6.
Si el modo de vista para la vista de nivel superior y todas las vistas de subnivel es Escalar para completar, utiliza el modo de anclaje "menor o igual" en este caso, porque no puede eliminar esta restricción. Las dos vistas en color no se almacenan en la plumilla como que tienen un tamaño (ancho, alto) o una posición (esquina superior izquierda), sino que se almacenan con restricciones que representan su diseño. Se puede acceder al diseño "menor o igual" en lugar de "igual" haciendo clic en el cuadrado superior, luego aparecen cuatro líneas de restricción, seleccione la inferior que va desde el borde inferior del control que ha seleccionado hasta la parte inferior de la vista y cambie el tipo de igual a menor que o igual.
Si el modo de vista NO es Escala para completar, se requerirán otros cambios de restricción. Este diseño multifacético es más flexible que los antiguos "resortes y puntales", pero no es exactamente tan fácil de aprender.
El modo más obvio que podría usar es obtener una restricción entre dos objetos. Por qué esto es tan difícil (a veces puedo hacer esto y otras no) todavía no sé.
Aquí hay una muestra cuando pude obtener una restricción para aparecer entre dos objetos en lugar de desde ese objeto hasta su vista principal, pero esta situación, si pudiese conseguir que Interface Builder cooperara, sería una forma mucho más intuitiva de creando una situación en la que el cuadrado superior no está anclado a la altura de toda la vista:
Si la vista de color superior tiene un ancla a la vista debajo de ella, esto significa absolutamente que la restricción inversa no puede ser contra la misma vista, o de lo contrario existiría una situación de ambigüedad o "razonamiento circular". Por lo tanto, podemos hacer que A dependa de B, pero no que B dependa simultáneamente de A. Entonces, en ese caso, la restricción cambia para que dependa de la altura o el ancho absolutos de la vista. En este caso particular que he encontrado, parece que se requieren pruebas y errores considerables para recrear lo que anteriormente se podría haber hecho increíblemente intuitivo antes de que se mejorara.
Finalmente, encuentro que las instrucciones anteriores parecerán que no funcionan cuando terminas con restricciones adicionales, que se añaden mágicamente cuando menos las esperas. Muy sutilmente, deberías ver dos líneas en lugar de una, como esta:
Puedo hacer que Interface Builder siga agregando más y más restricciones duplicadas simplemente cambiando una restricción de Igual a Menor o igual. Creo que ese es un error en el constructor de interfaces en XCode 4.6, y como las restricciones de diseño son una parte relativamente nueva de CococaTouch, no me sorprende que el soporte del creador de interfaces para las restricciones de creación automática a medida que arrastre y mueva los elementos, tenga muchos errores.
El tipo de resortes y puntales clásicos, también conocido como "Ancla y alineación", o "Máscaras de tamaño automático" es el único tipo de administración de tamaño que entiendo. Sin embargo, en XCode 4.6, "autolayout" usando restricciones tal como se introdujo en iOS 6, es el valor predeterminado, y hace que algunas cosas simples sean más difíciles, al tiempo que hace posible todo un mundo de nuevos arreglos, una vez que aprenda cómo hacerlo. (Para ser claros, a algunos usuarios les puede interesar que una vista simple funcione sin luchar contra las batallas de autoajuste, por lo que Matt sugirió una solución al principio para desactivar Autolayout, que se reproduce a continuación).
iOS 6 Restricciones de diseño, el sistema Interface Builder de restricciones de edición, no entiendo.
Donde XCode Interface Builder crea automáticamente restricciones (como en los bordes de la vista), parece comportarse de una manera que yo entiendo.
Lo que no entiendo es por qué en el .xib que se muestra aquí, y también disponible here , por qué no puedo hacer que las regiones verde y magenta mantengan un borde constante (el área blanca entre ellas) que no se vuelve más gruesa ni más delgada , pase lo que pase con el tamaño de la vista.
Eso significa que necesito que el área verde no cambie el tamaño verticalmente y que solo el tamaño horizontalmente, pero insiste en anclarse a la parte inferior del formulario, y aunque a partir de una nueva punta en blanco nuevamente, se restaurará el generador de interfaces para que note la adyacencia del las vistas verde y magenta de nuevo, una vez que el creador de la interfaz se ha vuelto "estúpido", insiste en que solo defina el borde inferior de la vista verde en términos de su distancia desde el borde inferior de la vista principal, y no (por cualquier cantidad de altercado) lo hará de otra manera meras operaciones de arrastrar y soltar. También he experimentado con los comandos Pin y no he encontrado un comando pin que funcione.
Ninguna cantidad de peleas con los menús del creador de interfaces o arrastrar y soltar parece ser suficiente, para hacer que deje de lado una de las restricciones. No puedo entender lo que se supone que debo hacer. ¿Borrar una restricción? ¿Cómo? Las restricciones no se pueden eliminar en absoluto por lo que puedo ver, ya sea desde el panel Objetos IB o desde el Inspector de Utilidades -> Tamaño. Existe una opción de eliminación, pero aparece en gris en el menú desplegable que aparece al hacer clic en el botón del icono "engranaje" en el área de restricciones.
Lo ideal sería que me encantara si el área verde cambiara de tamaño a medida que la vista se amplia, pero no a medida que se hace más alta o más corta. Pensé que esto era obvio en todas las demás herramientas, pero en XCode + Autolayout, o no se redimensiona en absoluto, o se redimensiona en las cuatro direcciones. No puedo eliminar o eliminar las restricciones que están haciendo cosas que no quiero hacer. ¿Tiene que tener cuatro restricciones en cada vista que está dentro de otra vista?
(Actualización 1: no puede eliminar ninguna restricción que pudiera dar como resultado un diseño ambiguo o no especificado).
(Actualización 2: A veces, si un panel uiview no se ajusta a un hermano, eliminar esa vista y volver a intentarlo permitirá que se "ajuste" de forma natural a un hermano, y la restricción se hará en relación con un objeto de vista hermano en lugar de padre.)
(Actualización 3: Matt eliminó su solución, la he reproducido a continuación).
Solución para las personas que no querían Autolayout en primer lugar, y que solo querían los viejos resortes y puntales atrás:
Paso 1: Desactivar Autolayout:
Paso 2: Seleccione las Máscaras de Autoresizing Correctas:
La clave para editar restricciones en el generador de interfaces es nunca arrastrar y soltar nada una vez que lo haya agregado a la vista. Mueve y organiza las cosas editando las restricciones en su lugar. Utilice el menú de fijación para crear nuevas restricciones. Puede eliminar las restricciones no deseadas una vez que haya agregado suficientes nuevas para reemplazar sin ambigüedad las restricciones del sistema agregadas automáticamente.
En tu caso he creado las siguientes restricciones:
Cambié el nombre de sus vistas a "Verde" y "Magenta" para aclarar las cosas en el navegador de documentos. Lo que he hecho es:
- Pin el espaciado vertical entre las vistas
- Fijado cada vista a los lados izquierdo y derecho.
- Fijó la vista superior a una altura establecida y una distancia establecida desde la parte superior de la vista de supervisión
- Fijó la parte inferior de la vista inferior a la parte inferior de la vista de supervisión.
Esto te da el diseño que quieres, creo. He escrito en detalle insoportable sobre esto here , si quieres leer más.