He estado entrando en autolayouts recientemente y estoy atascado en lo que parece un ejemplo de problema realmente trivial. Tengo una vista que quiero sentarme en la parte superior de la pantalla y ocupar la mitad de la altura de la pantalla. Simple antes de la distribución automática: simplemente colóquelo en su lugar y dígale que se expanda verticalmente cuando la supervista cambie de tamaño.
Ahora, por mi vida no puedo ver cómo hacerlo. Esto es lo que obtengo cuando intento configurar esto:
La restricción de espacio inferior se establece en "igual a 284", lo cual es absoluto y absolutamente inútil para mí cuando cambio al diseño de iPhone4, ya que mantiene 284 puntos de espacio en la parte inferior de la pantalla y reduce la vista para que ya no sea la mitad. Tamaño de la pantalla. Y no hay forma de establecer esa restricción para que sea igual a una fracción de la altura de cualquier otra vista ...
Después de luchar por un tiempo, la única forma en que puedo pensar en hacer esto sería introducir otra vista debajo de esta vista, fijar sus alturas por igual, hacer que se sienten uno encima del otro y luego establecer la segunda vista (inferior) para que sea invisible .. que parece un poco feo!
¿Me estoy perdiendo algo obvio? ..
fuente
Respuestas:
Esto ahora es posible en IB a partir de [al menos] Xcode 5.1.1. Aunque me llevó algún tiempo descubrir que en realidad es súper simple:
Primero cree una restricción de alineación superior básica (también deberá configurar las restricciones inferior, izquierda y derecha, como es normal). Luego seleccione la restricción y navegue al inspector de atributos :
Entonces puedes ajustar el multiplicador. Si lo desea, déjelo en el 50% de la súper vista
1
, ya que está alineado por el centro de la súper. Esta también es una excelente manera de crear vistas que también son otros porcentajes (como el 25% de la super vista)fuente
First Item
esView.Top
noView.Center Y
. De lo contrario, sí, solo lo centrará. También deberá asegurarse de que otras restricciones estén establecidas correctamente para manejar los otros bordes de la vista.Solución de guión gráfico donde puede establecer la proporción exacta entre las vistas
Ahora:
¡¡¡LUCRO!!!
PD También tenga en cuenta que este método funciona con vistas en diferentes niveles de anidación y (obviamente) aplicable para el ancho
PPS a veces puede ser útil "invertir el primer y segundo elemento" de la restricción o establecer un multiplicador inverso (por ejemplo, 2 en lugar de 0.5) (pero estos métodos no son útiles si no comprende cómo se relacionan las vistas entre sí).
fuente
Después de un poco más de tiempo, se me ocurrió lo siguiente.
Lo estoy señalando como una respuesta, pero no es muy satisfactorio, ya que supone que en realidad no puede hacer esto en Interface Builder, pero la restricción correcta se puede agregar en el código después como:
Básicamente, establece un multiplicador de 0.5 contra la altura de self.view, actuando en la vista superior. Tuve que establecer la prioridad de la restricción de espacio vertical inferior en IB a menos de 1000 para evitar un montón de mensajes de tiempo de ejecución sobre romper las restricciones también.
Entonces, si alguien puede mostrar cómo hacer esto en Interface Builder, eso respondería mejor a mi pregunta, de lo contrario, ¿supongo que esto es tan bueno (por ahora)?
fuente
Un poco más fácil y directo que el método que la respuesta de Fyodor Volchyok. - Mantenga presionado el botón de control y haga clic en la subvista. -Todavía manteniendo presionado el botón de comando, arrastre el cursor a la supervista y luego haga clic en la supervista. -Seleccione "Relación de aspecto".
-A continuación, haga clic en el Inspector de tamaño. -Luego haga doble clic en la restricción.
-Asegúrese de que esté seleccionada la "altura" para ambos elementos.
-Entonces cambie el "Multiplicador" a 0.5 para la mitad de la pantalla, o cualquier fracción de la supervista que desee.
fuente
También hay otra posibilidad en el código en caso de que tenga 2 vistas que tengan la misma altura: simplemente configure la altura de view2 en la altura de view1 (el truco aquí no es establecer la altura de view1 explícitamente).
fuente
Versión rápida de la respuesta de Mete:
fuente