6

高さが最大に達すると、ユーザーが入力してスクロールすると垂直方向に成長する NSTextView を作成しようとしています。これは、メッセージ作品のテキスト ビューに似ています。

私の最初の試みでは、デリゲートを使用してテキストの変更をリッスンし、NSTextView のスクロール ビューに関連付けられた高さの制約を調整します。

- (void)textDidChange:(NSNotification *)notification
{
    NSTextView *textView = self.textView;
    NSRect usedRect = [textView.textContainer.layoutManager usedRectForTextContainer:textView.textContainer];
    NSLog(@"DEBUG: used rect: %@", NSStringFromRect(usedRect));
    self.textViewHeightConstraint.constant = MIN(80.f, MAX(usedRect.size.height, 30.f));
}

これはほとんど機能します。入力すると、テキスト ビュー (スクロール ビュー) の高さが更新されますが、テキストの最後の行が切り取られます。

ここに画像の説明を入力

スクロール ビューが最大の高さに達してスクロールを開始すると、うまく機能します。囲んでいるスクロールビューで表示/レイアウト/制約の更新を強制しようとしましたが、うまくいきませんでした。私の推測では、スクロール ビューのクリップ ビューが正しく更新されておらず、テキスト ビューの下部が切り取られています。制約が変更されたときに、クリップ ビュー/スクロール ビューを強制的に適切に更新する方法はありますか?

4

2 に答える 2

0

NSTextView の高さを textContainer に必要なサイズに設定していると思いますが、テキスト ビューが追加するインセットを考慮していません。-[NSTextView textContainerInset]の高さを計算した高さに追加してみてください。

ドキュメントは実際には指定していませんが、textContainerInsetすべての辺の幅/高さの合計インセットを返し、それ-[NSTextView textContainerOrigin]を大まかに半分に分割すると想定しています。

于 2014-04-07T21:35:31.940 に答える