objective c - has - UIScrollView no utiliza restricciones de autolayout
scrollview xcode (4)
La relación entre UIScrollView y el diseño automático es diferente de otros aspectos del diseño automático. Básicamente, si se permite el funcionamiento de la distribución automática simple, no se desplazará nada. Por ejemplo, si una vista secundaria de la vista de desplazamiento se fijara de la manera normal mediante una restricción a 10 puntos desde la parte superior de la vista de desplazamiento, quedaría inmovilizada allí; nunca se movería, sin importar cómo se desplazó la vista de desplazamiento.
Para resolver este problema, un UIScrollView que usa el autolayout funciona de una manera completamente nueva. Por lo tanto, cuando diga "Estoy usando el diseño automático", debe prepararse para que las cosas funcionen de forma muy diferente a como lo hacía antes. Debe usar una subvista de vista de desplazamiento única con tralatesAutoresizingMaskIntoConstraints translatesAutoresizingMaskIntoConstraints = YES
, y un tamaño de contenido explícito, o bien todo debe tener translatesAutoresizingMaskIntoConstraints = NO
y el tamaño del contenido se deducirá implícitamente de acuerdo con las restricciones de las subvistas.
Esto está muy bien explicado en https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html
Tengo una vista de desplazamiento y una vista de imagen detrás de ella y la estoy poblando de plumillas. Estoy usando autolayout. Tengo un espacio inferior para supervisar y un espacio superior para supervisar en ambas vistas. La vista de imagen hace exactamente lo que quiero que haga. Para iphone 5 es donde lo quiero. Y para los otros iPhones, permanece por encima de la parte inferior de la pantalla, por lo que cambia el tamaño correctamente. La vista de desplazamiento se ve a la derecha en el iphone 5, pero en los otros teléfonos no cambia de tamaño, por lo que se desplaza hacia abajo debajo de la vista de la aplicación. Recibo estos mensajes en el registro:
2012-11-21 10:42:38.576 LCHApp[12604:907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don''t want.
Try this: (1) look at each constraint and try to figure out which you don''t expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you''re seeing NSAutoresizingMaskLayoutConstraints that you don''t understand, refer
to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
"<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 h=-&- v=-&- ScheduleViewNib:0x1d853630.height == UIScrollView:0x1d8413b0.height - 386>",
"<NSLayoutConstraint:0x1d8e5340 V:[UIImageView:0x1d892110]-(64)-| (Names: ''|'':ScheduleView:0x1d8efc30 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cf520 h=--& v=--& V:[ScheduleView:0x1d8efc30(480)]>",
"<NSLayoutConstraint:0x1d8eaed0 V:|-(45)-[UIScrollView:0x1d8413b0] (Names: ''|'':ScheduleView:0x1d8efc30 )>"
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>
Ya lo intenté
[self setTranslatesAutoresizingMaskIntoConstraints:YES];
y
[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES];
Por lo que puedo ver, esto simplemente elimina todas las limitaciones de las vistas. Y no es lo que quiero
Muy importante cuando usa el diseño automático: debe fijar el derecho y / o el fondo de la última subvista a la derecha y / o abajo de la vista de desplazamiento. Así es como la vista de desplazamiento conoce el tamaño del contenido. Por ejemplo:
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
attribute:NSLayoutAttributeRight
relatedBy:NSLayoutRelationEqual
toItem:scrollView
attribute:NSLayoutAttributeRight
multiplier:1.0
constant:0]];
Mi agradecimiento a este sitio por proporcionarme el ejemplo perfecto.
Perdí horas debido a esto, y espero evitarle a otros mi dolor.
Para que UIScrollviews funcione bien con restricciones, uso este enfoque que se responde here . En esa respuesta, abordo cómo hacer que funcione un scrollview de desplazamiento vertical que también funciona con la rotación del dispositivo. También puede modificar el enfoque para trabajar con scrollviews de desplazamiento horizontal . Para scrollviews que se desplazan en ambas direcciones, no agregue el truco de restricción de ancho de coincidencia de tamaño. Pero haz todo lo demás igual.
Un par de cosas.
- Asegúrate de que el ajuste automático esté activado (IB en la pestaña "Archivo Inspector")
- Asegúrate de que NO estás haciendo ningún cambio que implique límites, marco, etc., todo esto lo hacen las restricciones automáticas ahora
- Asegúrese de mantenerse alejado de AutoResizingMask. Esto competirá con tu nueva configuración. Si esto se hace bien, ahora puede diseñar su botón y funcionará de maravilla. Así es cómo.
Este error indica que su plumilla o un control dentro de ese plumín NO está utilizando el diseño automático.