Na dole strony opublikuję właściwe rozwiązanie na wypadek, gdyby ktoś był odważny (lub wystarczająco zdesperowany), aby przeczytać do tego momentu.
Oto repozytorium gitHub dla tych, którzy nie chcą czytać całego tego tekstu: resizableTextView
Działa to z iOs7 (i wierzę, że będzie działać z iOs8) i z autolayout. Nie potrzebujesz magicznych liczb, wyłącz układ i takie tam.Krótkie i eleganckie rozwiązanie.
Myślę, że cały kod związany z ograniczeniami powinien przejść do updateConstraints
metody. Stwórzmy własne ResizableTextView
.
Pierwszym problemem, jaki tu napotykamy, jest to, że nie znam rzeczywistej wielkości zawartości przed viewDidLoad
metodą. Możemy przejść długą i trudną drogę i obliczyć ją na podstawie rozmiaru czcionki, podziałów linii itp. Ale potrzebujemy solidnego rozwiązania, więc zrobimy:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Teraz znamy prawdziwą treść Rozmiar bez względu na to, gdzie jesteśmy: przed czy po viewDidLoad
. Teraz dodaj ograniczenie wysokości do textView (poprzez storyboard lub kod, bez względu na to, jak). Dostosujemy tę wartość za pomocą naszych contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
Ostatnią rzeczą do zrobienia jest powiadomienie superklasy updateConstraints
.
[super updateConstraints];
Teraz nasza klasa wygląda następująco:
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];
}
Ładna i czysta, prawda? I nie musisz zajmować się tym kodem w swoich kontrolerach !
Ale poczekaj!
Y BRAK ANIMACJI!
Możesz łatwo animować zmiany, aby textView
płynnie się rozciągać. Oto przykład:
[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];