誰かがこの時点まで読む勇気がある(または十分に絶望している)場合に備えて、ページの下部に正しい解決策を掲載します。
そのテキストをすべて読みたくない人のためのgitHubリポジトリがあります:resizableTextView
これはiOs7(iOs8でも機能すると思います)およびautolayoutで動作します。マジックナンバーは必要ありません。レイアウトなどを無効にしてください。短くエレガントなソリューション。
私は、すべての制約関連のコードはupdateConstraints
メソッドに行くべきだと思います。それでは、自分で作ってみましょうResizableTextView
。
ここで最初に遭遇する問題は、viewDidLoad
メソッドの前に実際のコンテンツサイズを知らないことです。長くてバグの多い道をたどって、フォントサイズ、改行などに基づいて計算することができます。しかし、堅牢なソリューションが必要なので、次のようにします。
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
これで、どこにいても、前でも後でも、実際のcontentSizeがわかりviewDidLoad
ます。次に、textViewに高さの制約を追加します(ストーリーボードまたはコードを介して、どのようにしても)。その値を次のように調整しますcontentSize.height
。
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
最後に行うことは、スーパークラスにを伝えることupdateConstraints
です。
[super updateConstraints];
これで、クラスは次のようになります。
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];
}
きれいできれいですよね?そして、コントローラーでそのコードを処理する必要はありません。
ちょっと待って!
Yアニメーションなし!
変更を簡単にアニメーション化して、textView
スムーズにストレッチできます。次に例を示します。
[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];