Je post juste solution au bas de la page au cas où quelqu'un est courageux (ou désespéré assez) lire à ce point.
Voici dépôt gitHub pour ceux qui ne veulent pas lire tout ce texte: resizableTextView
Cela fonctionne avec iOs7 (et je ne crois qu'il va travailler avec iOs8) et avec mise en page automatique. Vous n'avez pas besoin des numéros de magie, de désactiver la mise en page et des trucs comme ça. Courte et élégante solution.
Je pense, que toutes les contraintes liées code doit aller à l' updateConstraints
méthode. Donc, nous allons faire notre propre ResizableTextView
.
Le premier problème que nous rencontrons ici est que ne sais pas le contenu réel de la taille avant d' viewDidLoad
méthode. On peut prendre longtemps et buggy route et de calculer sur la base taille de la police, des sauts de ligne, etc. Mais nous avons besoin d'une solution fiable, de sorte que nous allons faire:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Alors maintenant, nous savons réel contentSize peu importe où nous sommes: avant ou après l' viewDidLoad
. Maintenant ajouter de la hauteur de la contrainte sur textView (via la table de montage ou de code, n'importe comment). Nous allons régler cette valeur avec notre contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
La dernière chose à faire est de dire super - updateConstraints
.
[super updateConstraints];
Maintenant, notre classe ressemble à:
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];
}
Jolie et propre, droit? Et vous n'avez pas à traiter avec ce code dans vos contrôleurs!
Mais attendez!
Y PAS D'ANIMATION!
Vous pouvez facilement animer des changements à apporter textView
étirer en douceur. Voici un exemple:
[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];