14

Facebook が iOS アプリのメッセージ セクションに使用するものとよく似たコメント セクションを作成しています。UITextView高さのサイズを変更して、入力しているテキストがその中に収まるようにしたいのですが、スクロールしてオーバーフローしたテキストを表示する必要はありません。これを行う方法はありますか?CGRectテキストビューのサイズと高さに割り当てられた を使用して、コンテンツのサイズと一致する可能性があることを調べました。

CGRect textFrame = textView.frame;
textFrame.size.height = textView.contentSize.height;
textView.frame = textFrame;

UITextViewテキストが境界に達したことを検出し、ビューの高さを変更する何らかの機能が必要だと思いますか? 誰かがこの同じ概念に苦労しましたか?

4

5 に答える 5

23

このデリゲート メソッドでフレームを調整できます。textView のデリゲートを自分自身に設定することを忘れないでください。

-(BOOL)textView:(UITextView *)_textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
      [self adjustFrames];  
      return YES;
}


-(void) adjustFrames
{
   CGRect textFrame = textView.frame;
   textFrame.size.height = textView.contentSize.height;
   textView.frame = textFrame;
}

このソリューションはiOS6以前用です... iOS7の場合はこれを参照してください

スタックオーバーフローの回答

于 2012-11-21T13:00:48.007 に答える
8

これは、autolayoutとを使用した私のソリューションtextView.contentSize.heightです。iOS8 Xcode6.3 beta4 でテスト済み。

最後にについて 1 つのキャッチがありsetContentOffsetます。行数が変更されたときに「間違った contentOffset」アーティファクトを回避するために配置しました。最後の行の下に余分な不要な空白が追加され、制約を変更した直後に元に戻さない限り、見栄えがよくありません。これを理解するのに何時間もかかりました!

// set this up somewhere
let minTextViewHeight: CGFloat = 32
let maxTextViewHeight: CGFloat = 64

func textViewDidChange(textView: UITextView) {

    var height = ceil(textView.contentSize.height) // ceil to avoid decimal

    if (height < minTextViewHeight + 5) { // min cap, + 5 to avoid tiny height difference at min height
        height = minTextViewHeight
    }
    if (height > maxTextViewHeight) { // max cap
        height = maxTextViewHeight
    }

    if height != textViewHeight.constant { // set when height changed
        textViewHeight.constant = height // change the value of NSLayoutConstraint
        textView.setContentOffset(CGPointZero, animated: false) // scroll to top to avoid "wrong contentOffset" artefact when line count changes
    }
}
于 2015-04-06T09:26:34.600 に答える
1

contentsizeiOS 7 では動作しません。これを試してください:

CGFloat textViewContentHeight = textView.contentSize.height;

 textViewContentHeight = ceilf([textView sizeThatFits:textView.frame.size].height + 9);
于 2014-01-27T07:55:37.237 に答える