5

必要に応じてcontentViewに合わせて拡大するように設計されたUITextViewがあります。ただし、テキストの段落を貼り付けると、コンテンツの開始点と終了点が間違った場所に垂直に配置されます。文字を入力または削除すると、正しい位置にリセットされます。

これがなぜであるかについて何か考えはありますか?

-(void)textViewDidChange:(UITextView *)textView {
    self.textView.frame = CGRectMake(
        self.textView.frame.origin.x,
        self.textView.frame.origin.y,
        self.textView.frame.size.width,
        self.textView.contentSize.height + HEADER_ADDITIONAL_HEIGHT);

    self.textView.contentOffset = CGPointMake(0, 0);

    self.previousContentSize = textView.contentSize;
}
4

2 に答える 2

1

私が使用したとき:

textView.contentSize = textView.frame.size;  
textView.contentOffset = CGPointZero;  

これで問題は解決しましたが、テキストの入力または削除中に奇妙なスクロールが発生することがあるという新しい問題が発生しました。だから、私はこれを使用しました:

textView.contentSize = CGSizeMake( textView.contentSize.width,
                                   textView.contentSize.height+1);  

これで問題も解決しました。contentSizeここで必要なのは、テキストビューの が変更されるたびに得られる効果だと思います。残念ながら、この効果が何であるかはわかりません。知ってる人いたら教えてください。

更新: 問題を解決するために使用できる方法を見つけました (これを使用して問題を解決しました)。NSLayoutMANager にレイアウト全体を更新するように依頼できます。

[textView.textStorage edited:NSTextStorageEditedCharacters range:NSMakeRange(0, textView.textStorage.length) changeInLength:0];

NSLayoutManager は、時間がかかり、多くの作業が必要なため、レイアウトの更新を回避しようとします。そのため、絶対に必要な場合にのみ (遅延して) 実行するように設定されています。このクラスに関連する関数は多数ありますが、invalidateLayout呼び出されたときに実際の再レイアウトを引き起こす関数はありません。

于 2014-05-26T14:04:12.077 に答える
-1

これが遅れていることはわかっていますが、私はこの問題に遭遇し、他の人が同じ状況に陥った場合に備えて、私が思いついたことを共有する必要があると考えました.

あなたは正しい軌道に乗っていtextViewDidChange:ますが、フレームの高さを更新した後に contentSize を設定するという重要なことが 1 つ欠けています。

// I used 0.f for the height, but you can use another value because according to the docs:
//  "the actual bounding rectangle returned by this method can be larger 
//    than the constraints if additional space is needed to render the entire 
//    string. Typically, the renderer preserves the width constraint and 
//    adjusts the height constraint as needed."
CGSize size = CGSizeMake(textview.frame.size.width, 0.f);
CGRect rect = [string boundingRectWithSize:size
                                   options:OptionsYouNeedIfAny // NSStringDrawingOptions
                                   context:nil];

// Where MinTextViewHeight is the smallest height for a textView that 
//   your design can handle
CGFloat height = MAX(ceilf(rect.size.height), MinTextViewHeight); 
CGRect rect = textView.frame;
rect.size.height = height;
textView.frame = rect;

// Adjusting the textView contentSize after updating the frame height is one of the things you were missing
textView.contentSize = textView.frame.size;
textView.contentOffset = CGPointZero;

これが役立つことを願っています!

の使用に関する詳細については、ドキュメントを参照してくださいboundingRectWithSize:options:context:

于 2014-04-29T20:46:19.777 に答える