Ich werde die richtige Lösung am Ende der Seite veröffentlichen, falls jemand mutig (oder verzweifelt genug) ist, bis zu diesem Punkt zu lesen.
Hier ist gitHub Repo für diejenigen, die den ganzen Text nicht lesen möchten: resizableTextView
Dies funktioniert mit iOs7 (und ich glaube, es wird mit iOs8 funktionieren) und mit Autolayout. Sie brauchen keine magischen Zahlen, deaktivieren das Layout und ähnliches. Kurze und elegante Lösung.
Ich denke, dass der gesamte Code, der sich auf Einschränkungen bezieht, zur updateConstraints
Methode gehen sollte . Also, machen wir unsere eigenen ResizableTextView
.
Das erste Problem, auf das wir hier stoßen, ist, dass wir die tatsächliche Größe des Inhalts vor der viewDidLoad
Methode nicht kennen . Wir können einen langen und fehlerhaften Weg nehmen und ihn basierend auf Schriftgröße, Zeilenumbrüchen usw. berechnen. Aber wir brauchen eine robuste Lösung, also tun wir Folgendes:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Jetzt kennen wir also echte ContentSize, egal wo wir sind: vorher oder nachher viewDidLoad
. Fügen Sie nun textView eine Höhenbeschränkung hinzu (über Storyboard oder Code, egal wie). Wir werden diesen Wert mit unserem anpassen contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
Das Letzte, was zu tun ist, ist, Superklasse zu sagen updateConstraints
.
[super updateConstraints];
Jetzt sieht unsere Klasse so aus:
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];
}
Schön und sauber, oder? Und Sie müssen sich nicht mit diesem Code in Ihren Controllern befassen !
Aber warte!
Y KEINE ANIMATION!
Sie können Änderungen leicht animieren, um die textView
Dehnung reibungslos zu gestalten. Hier ist ein Beispiel:
[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];