Publicaré la solución correcta en la parte inferior de la página en caso de que alguien sea valiente (o lo suficientemente desesperado) como para leer hasta este punto.
Aquí está el repositorio de gitHub para aquellos que no quieren leer todo ese texto: resizableTextView
Esto funciona con iOs7 (y creo que funcionará con iOs8) y con autolayout. No necesita números mágicos, deshabilite el diseño y cosas así. Solución corta y elegante.
Creo que todo el código relacionado con restricciones debería ir al updateConstraints
método. Entonces, hagamos el nuestro ResizableTextView
.
El primer problema que encontramos aquí es que no conocemos el tamaño real del contenido antes del viewDidLoad
método. Podemos tomar un camino largo y con errores y calcularlo en función del tamaño de fuente, los saltos de línea, etc. Pero necesitamos una solución robusta, así que haremos:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Así que ahora sabemos contenido real Tamaño sin importar dónde estemos: antes o después viewDidLoad
. Ahora agregue restricción de altura en textView (a través de guión gráfico o código, no importa cómo). Ajustaremos ese valor con nuestro contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
Lo último que debe hacer es decirle a la superclase updateConstraints
.
[super updateConstraints];
Ahora nuestra clase se ve así:
ResizableTextView.m
- (void) updateConstraints {
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
[super updateConstraints];
}
Bonita y limpia, ¿verdad? ¡Y no tiene que lidiar con ese código en sus controladores !
¡Pero espera!
Y NO ANIMACIÓN!
Puede animar fácilmente los cambios para que se textView
estiren suavemente. Aquí hay un ejemplo:
[self.view layoutIfNeeded];
// do your own text change here.
self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
[self.infoTextView setNeedsUpdateConstraints];
[self.infoTextView updateConstraintsIfNeeded];
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
[self.view layoutIfNeeded];
} completion:nil];