Ich werde die richtige Lösung am Ende der Seite posten, falls jemand den Mut hat (oder verzweifelt genug ist), bis zu diesem Punkt zu lesen.
Hier ist gitHub repo für diejenigen, die nicht den ganzen Text lesen wollen: resizableTextView
Dies funktioniert mit iOs7 (und ich glaube, es wird auch mit iOs8 funktionieren) und mit Autolayout. Sie brauchen keine magischen Zahlen, deaktivieren Sie das Layout und solche Sachen. Kurze und elegante Lösung.
Ich denke, dass der gesamte Code, der sich auf Einschränkungen bezieht, in updateConstraints
Methode. Also, machen wir unsere eigene ResizableTextView
.
Das erste Problem, auf das wir hier stoßen, ist, dass wir die tatsächliche Größe des Inhalts vorher nicht kennen viewDidLoad
Methode. Wir können einen langen und fehleranfälligen Weg nehmen und ihn anhand von Schriftgröße, Zeilenumbrüchen usw. berechnen. Aber wir brauchen eine robuste Lösung, so werden wir tun:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Jetzt kennen wir die tatsächliche contentSize, egal wo wir uns befinden: vor oder nach viewDidLoad
. Fügen Sie nun eine Höhenbeschränkung für textView hinzu (über Storyboard oder Code, egal wie). Wir passen diesen Wert mit unserem 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 der 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];
}
Hübsch und sauber, oder? Und Sie müssen sich nicht mit dem Code in Ihrem Kontrolleure !
Doch halt! Y KEINE ANIMATION!
Sie können Änderungen leicht animieren, um textView
sanft dehnen. 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];
0 Stimmen
Bitte aktualisieren Sie die korrekte Antwort, da die akzeptierte Antwort zu unnötigen Berechnungen führt; jetzt gibt es eine contentSize-Eigenschaft für dieses Problem.
0 Stimmen
Warum gibt es keine Fragen dazu, wie man das nicht dynamisch machen kann? Ich kann nicht einmal herausfinden, wie man es statisch macht. Und die bereitgestellten Lösungen scheinen nicht zu "Einschränkungen" in Storyboard außer Kraft setzen.