Vou postar a solução certa na parte inferior da página, caso alguém seja corajoso (ou desesperado o suficiente) para ler até este ponto.
Aqui está o repositório do gitHub para aqueles que não querem ler todo esse texto: resizableTextView
Isso funciona com o iOs7 (e acredito que funcionará com o iOs8) e com a execução automática. Você não precisa de números mágicos, desative o layout e coisas assim. Solução curta e elegante.
Eu acho que todo código relacionado a restrições deve ir para o updateConstraints
método Então, vamos fazer o nosso ResizableTextView
.
O primeiro problema que encontramos aqui é que não sabemos o tamanho real do conteúdo antes do viewDidLoad
método. Podemos pegar uma estrada longa e de buggy e calculá-la com base no tamanho da fonte, quebras de linha, etc. Mas precisamos de uma solução robusta, então faremos:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Portanto, agora sabemos o real contentSize, não importa onde estamos: antes ou depois viewDidLoad
. Agora adicione restrição de altura no textView (via storyboard ou código, não importa como). Ajustaremos esse valor com nosso contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
A última coisa a fazer é dizer à superclasse updateConstraints
.
[super updateConstraints];
Agora nossa classe se parece com:
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];
}
Bonito e limpo, certo? E você não precisa lidar com esse código em seus controladores !
Mas espere!
S NÃO ANIMAÇÃO!
Você pode animar facilmente as alterações para fazer textView
alongamentos sem problemas. Aqui está um exemplo:
[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];