will sister seguire reparto pelicula monja letra him habito follow español canciones cambio act ios ios6 autolayout

sister - Autolayout de iOS: emita con UILabels en una vista principal de cambio de tamaño



sister act reparto (3)

Tengo una vista que contiene solo un UILabel. Esta etiqueta contiene texto de líneas múltiples. El padre tiene un ancho variable que se puede cambiar de tamaño con un gesto panorámico. Mi problema es que cuando hago este redimensionamiento, UILabel no recalcula su altura de forma que todo el contenido aún esté visible, simplemente lo corta.

Logré solucionarlo con un truco, pero es terriblemente lento de ejecutar:

- (void)layoutSubviews { CGSize labelSize = [self.labelDescription sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)]; if (self.constraintHeight) { [self removeConstraint:self.constraintHeight]; } self.constraintHeight = [NSLayoutConstraint constraintWithItem:self.labelDescription attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:labelSize.height]; [self addConstraint:self.constraintHeight]; [super layoutSubviews]; }

¿No debería suceder esto automáticamente con el autolayout?

EDITAR

La estructura de mi vista es:

UIScrollView ---> UIView ---> UILabel

Estas son las restricciones en UIScrollView:

<NSLayoutConstraint:0x120c4860 H:|-(>=32)-[DescriptionView:0x85c81c0] (Names: ''|'':UIScrollView:0x85db650 )>, <NSLayoutConstraint:0x120c48a0 H:|-(32@900)-[DescriptionView:0x85c81c0] priority:900 (Names: ''|'':UIScrollView:0x85db650 )>, <NSLayoutConstraint:0x120c48e0 H:[DescriptionView:0x85c81c0(<=576)]>, <NSLayoutConstraint:0x120c4920 H:[DescriptionView:0x85c81c0]-(>=32)-| (Names: ''|'':UIScrollView:0x85db650 )>, <NSLayoutConstraint:0x120c4960 H:[DescriptionView:0x85c81c0]-(32@900)-| priority:900 (Names: ''|'':UIScrollView:0x85db650 )>, <NSLayoutConstraint:0x8301450 DescriptionView:0x85c81c0.centerX == UIScrollView:0x85db650.centerX>,

Estas son las limitaciones de UIView:

<NSLayoutConstraint:0x85c4580 V:|-(0)-[UILabel:0x85bc7b0] (Names: ''|'':DescriptionView:0x85c81c0 )>, <NSLayoutConstraint:0x85c45c0 H:|-(0)-[UILabel:0x85bc7b0] (Names: ''|'':DescriptionView:0x85c81c0 )>, <NSLayoutConstraint:0x85c9f80 UILabel:0x85bc7b0.trailing == DescriptionView:0x85c81c0.trailing>, <NSLayoutConstraint:0x85c9fc0 UILabel:0x85bc7b0.centerY == DescriptionView:0x85c81c0.centerY>

El UILabel en sí no tiene restricciones, aparte de fijarlo a los bordes de su padre


Solucioné este problema después de provocar un error con Apple. El problema de que el texto multilínea requiere un enfoque de dos pasos para el diseño y todo depende de la propiedad preferredMaxLayoutWidth

Aquí está el código relevante que debe agregarse a un controlador de vista que contiene una etiqueta de líneas múltiples:

- (void)viewWillLayoutSubviews { // Clear the preferred max layout width in case the text of the label is a single line taking less width than what would be taken from the constraints of the left and right edges to the label''s superview [self.label setPreferredMaxLayoutWidth:0.]; } - (void)viewDidLayoutSubviews { // Now that you know what the constraints gave you for the label''s width, use that for the preferredMaxLayoutWidth—so you get the correct height for the layout [self.label setPreferredMaxLayoutWidth:[self.label bounds].size.width]; // And then layout again with the label''s correct height. [self.view layoutSubviews]; }


De acuerdo, finalmente lo clavé. La solución es establecer el preferredMaxLayoutWidth en viewDidLayoutSubviews , pero solo después de la primera ronda de diseño. Puede organizar esto simplemente mediante el envío asincrónico de nuevo en el hilo principal. Asi que:

- (void)viewDidLayoutSubviews { dispatch_async(dispatch_get_main_queue(), ^{ self.theLabel.preferredMaxLayoutWidth = self.theLabel.bounds.size.width; }); }

De esta forma, no establece preferredMaxLayoutWidth hasta después de que el ancho de la etiqueta se haya establecido correctamente por sus restricciones relacionadas con la supervisión.

Proyecto de ejemplo de trabajo aquí:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/ch23p673selfSizingLabel4/p565p579selfSizingLabel/ViewController.m

EDIT: ¡ Otro enfoque! Subclase UILabel y anular layoutSubviews :

- (void) layoutSubviews { [super layoutSubviews]; self.preferredMaxLayoutWidth = self.bounds.size.width; }

El resultado es una etiqueta de auto-tamaño: cambia automáticamente su altura para acomodar su contenido sin importar cómo cambia su ancho (suponiendo que su ancho sea modificado por restricciones / diseño).


En Xcode 6.1 para iOS 7/8, pude hacer que esto funcionara estableciendo preferredMaxLayoutWidth en un método setter que se llama en mi vista para mostrar el texto de la etiqueta. Supongo que se estableció en 0 para comenzar. Ejemplo a continuación, donde self.teachPieceLabel es la etiqueta. La etiqueta está conectada con restricciones junto con otras etiquetas en una vista en Interface Builder.

- (void)setTeachPieceText:(NSString *)teachPieceText { self.teachPieceLabel.text = teachPieceText; [self.teachPieceLabel setPreferredMaxLayoutWidth:[self.teachPieceLabel bounds].size.width]; }