UILabel dynamic con ancho proporcional y altura controlada por text

Estoy tratando de crear mediante progtwigción una vista de contenedor con dos subvenciones UILabel que se comportan de la siguiente manera:

  • El ancho del contenedor está fijado a su supervisión; su altura está limitada para ajustarse a las tags.
  • Las tags están dispuestas horizontalmente, con un espacio estándar entre ellas (8pts)
  • El ancho de la label izquierda es del 25% del ancho del contenedor.
  • El ancho correcto de la label llena el espacio disponible, less el espacio horizontal estándar
  • El text largo debe romperse cuando los límites de palabras son de flujo en varias líneas; ambas tags deben crecer verticalmente para acomodar text largo

He definido las tags con numberOfLines = 0 y lineBreakMode = NSLineBreakByWordWrapping .

Tenga en count que el tamaño del contenedor es completamente dynamic; su ancho está determinado por su supervisión, mientras que su altura está determinada por sus subvenciones (las tags). El tamaño de las tags también es dynamic; sus anchos son proporcionales al ancho del contenedor, y sus alturas dependen de la longitud del text.

He podido lograr todo lo anterior, excepto el último artículo, con las siguientes restricciones (pseudocódigo). A es la label izquierda, B es la derecha.

  • A.top == container.top
  • B.top == container.top
  • A.leading = container.leading
  • A.trailing == B.leading – 8
  • B.trailing == container.trailing
  • A == .25 * container.width
  • container.height> = A.height
  • container.height> = B.ight

Las últimas 2 restricciones están destinadas a estirar el contenedor para ajustarlo al más alto de las tags, pero el motor de layout parece ignorar el hecho de que las tags pueden ser multilíneas. Es decir, siempre aparece una sola línea, sin importar la longitud del text.

Entonces, ¿qué restricciones debo agregar / modificar / eliminar para lograr el set completo de comportamientos descritos anteriormente?

Para que las tags cambien automáticamente el tamaño de la altura, debe hacer lo siguiente:

  1. Establecer restricciones de layout para la label (Eso es lo que realmente has hecho)
  2. Establezca la restricción de altura con baja prioridad. Debería ser un amante que ContentCompressionResistancePriority
  3. Establecer numberOfLines = 0
  4. Establezca ContentHuggingPriority más alto que la prioridad alta de la label.
  5. Establezca prefernetworkingMaxLayoutWidth para la label. Ese valor es usado por la label para calcular su altura

Por ejemplo:

 self.descriptionLabel = [[[UILabel alloc] init] autorelease]; self.descriptionLabel.numberOfLines = 0; self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping; self.descriptionLabel.prefernetworkingMaxLayoutWidth = 200; [self.descriptionLabel setContentHuggingPriority:UILayoutPriorityRequinetworking forAxis:UILayoutConstraintAxisVertical]; [self.descriptionLabel setContentCompressionResistancePriority:UILayoutPriorityRequinetworking forAxis:UILayoutConstraintAxisVertical]; [self.descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addSubview:self.descriptionLabel]; NSArray* constrs = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[descriptionLabel_]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]; [self addConstraints:constrs]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[descriptionLabel_]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]]; [self.descriptionLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[descriptionLabel_(220@300)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]]; 

Establezca la prioridad de Restricciones de altura para las tags en un valor bajo e intente configurar las restricciones en el código.

Asegúrate de configurar

  1. prioridad de resistencia de compression de contenido horizontal y vertical . Si no desea que la label trunque su contenido, configúrelo en 1000. si es requinetworking .
  2. Contenido abrazando prioridad . Mira esta respuesta para entender cómo funciona.