UILabel en vista anidada en UIScrollView se comprime en autolayout incluso con 1000 resistencia de compression de contenido

Si juntar escenas que consisten en cualquiera de las siguientes dos jerarquías de vista y restricciones (fácilmente realizadas en InterfaceBuilder), entonces todo funciona como se espera …


1)

  • Un UIScrollView pantalla completa (distancia 0 a todos los bordes de la supervisión)
  • Dentro de UIScrollView , una única UILabel , con numberOfLines establecida en 0 , con un ancho del 100% (0 restricciones de avance y arrastre de distancia), sin restricción de altura, con enormes cantidades de text (1000s de líneas) y con restricciones superiores e inferiores con una constante de 0 (por lo que debe haber 0 de distancia de los límites de la UILabel a la vista de contenido de la UIScrollView ).

El comportamiento es el esperado: el UILabel se ajusta al tamaño de su contenido, lo que fuerza a la vista de contenido de UIScrollView a expandirse para ajustarse al text, haciendo que todo el text se desplace.


2)

  • Una UILabel con numberOfLines igual a 0 dentro de alguna UIView innerView dentro de alguna UIView outerView tal que:
    • Los bordes de la label tienen una distancia de 0 desde los bordes de la vista interna (con prioridad 1000)
    • Los bordes de la vista interna tienen 0 distancia de los bordes de la vista externa (con la prioridad 1000)
    • Los bordes superiores, iniciales y posteriores de outerView tienen 0 de distancia de la vista de supervisión (con prioridad 1000)
    • outerView tiene una altura que es menor que la altura completa de su vista de supervisión, aplicada por una restricción de altura o una restricción de distancia de background a supervisión, pero esta restricción final tiene una prioridad más baja, digamos, 600.

En este caso, el comportamiento vuelve a ser el esperado: si la prioridad de resistencia de compression de contenido de UILabel es mayor que 600, la altura de outerView se incrementa para ajustarse a todo el text, y si es menor, la label se trunca.


Sin embargo, el siguiente caso no funciona como esperaba, a pesar de que me parece que es exactamente análogo a los otros dos:

3)

  • Un UIScrollView pantalla completa, como el primer caso
  • Dentro de UIScrollView , una vista UIView UIView cuyos bordes tienen una distancia 0 de los bordes de UIScrollView (como el segundo caso).
  • Dentro de innerView , una UILabel con numberOfLines configurada en 0 , cargas de text y Prioridad de resistencia de compression de contenido configurada en 1000.

Mi expectativa, basada en los dos casos de testing anteriores, es que la vista de contenido de UIScrollView debe networkingimensionarse para ajustarse al text de la label. Sin embargo, lo que sucede es que la vista de contenido se establece en el tamaño de UIScrollView , al igual que innerView , y UIScrollView no es desplazable.

¿Por qué obtengo este comportamiento que no constring con mis dos casos de testing anteriores y cómo puedo get resistencia de compression de contenido de trabajo y tener el tamaño de contenido intrínseco de mi UILabel respetado cuando lo estoy anidando en una vista dentro de un UIScrollView en autolayout? No veo ninguna razón para que la reproducción automática comprima mi UILabel en el tercer caso cuando es perfectamente posible que no lo comprima y aún satisfaga todas las restricciones exactamente de la misma manera que lo hizo en el primer caso.

Tuve el mismo problema. Parece que hay un error con la manzana, por lo que el text multilínea requiere un enfoque de dos pasos para la disposition correcta y todo depende de la propiedad preferida de MaxLayoutWidth.

Terminé de agregar estos dos methods al ScrollViewController:

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; [self performSelectorOnMainThread:@selector(adjustScrollContentSizeOnMainThread) withObject:nil waitUntilDone:NO]; } - (void)adjustScrollContentSizeOnMainThread { self.myLabel.prefernetworkingMaxLayoutWidth = self.myLabel.bounds.size.width; } 

Basé mi solución en esta respuesta: https://stackoverflow.com/a/13616052/2828256