Pubblicherò la soluzione giusta in fondo alla pagina nel caso qualcuno sia coraggioso (o abbastanza disperato) da leggere fino a questo punto.
Ecco il repository gitHub per coloro che non vogliono leggere tutto quel testo: resizableTextView
Funziona con iOs7 (e credo che funzionerà con iOs8) e con autolayout. Non hai bisogno di numeri magici, disabilita layout e cose del genere. Soluzione breve ed elegante.
Penso che tutto il codice relativo ai vincoli dovrebbe andare al updateConstraints
metodo. Quindi, facciamo il nostro ResizableTextView
.
Il primo problema che incontriamo qui è che non conosco le dimensioni reali del contenuto prima del viewDidLoad
metodo. Possiamo prendere una strada lunga e buggy e calcolarla in base alla dimensione del carattere, alle interruzioni di riga, ecc. Ma abbiamo bisogno di una soluzione solida, quindi faremo:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Quindi ora conosciamo il contenuto reale Dimensione indipendentemente da dove siamo: prima o dopo viewDidLoad
. Ora aggiungi un vincolo di altezza su textView (tramite storyboard o codice, non importa come). Adatteremo quel valore con il nostro contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
L'ultima cosa da fare è dirlo alla superclasse updateConstraints
.
[super updateConstraints];
Ora la nostra classe si presenta come:
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];
}
Bello e pulito, giusto? E non devi occuparti di quel codice nei tuoi controller !
Ma aspetta!
SÌ ANIMAZIONE!
Puoi facilmente animare le modifiche per textView
allungare senza intoppi. Ecco un esempio:
[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];