入力/編集中にUITextViewをスクロールさせる方法 質問する

入力/編集中にUITextViewをスクロールさせる方法 質問する

アップデートこれは IOS 7 のみの問題のようです。承認された回答に優れた回避策が追加されました。

私は、テキストビューのタイトルを含む UITextView と UILabel を含むカスタム コントロールを作成しました。つまり、私のコントロールです。私のコントロールは、テキストビューとタイトルに合わせてサイズを自動的に変更します。これが起こる前に、テキストビューのサイズをテキストに合わせて変更します。これは最適に機能します。

テキストビューが自動的に最後の行までスクロールする機能を追加しました。少なくとも、私はそうしようとしています。最後の行に空のテキスト以外が含まれていれば、正常に動作します。テキストが空の場合、テキストが下にスクロールされるため、カーソルの約半分しか見えなくなります。

何が間違っているのでしょうか?

より理解しやすいように、いくつかの画像を作成しました。

これは私が単語を入力して改行しているところです。(まだスクロールするには不十分です)

改行する前に

そして改行します。(Enterキーを押します)カーソルが半分になっているところをよく見てください。これが問題です。

問題

私が期待していた通りのものが正確にわかるように次の写真を作成しました。

私が欲しいもの!

ベストアンサー1

他の回答の問題点:

  • 「\n」のみをスキャンする場合、テキスト ビューの幅を超えるテキスト行を入力すると、スクロールは行われません。
  • textViewDidChange: で contentOffset を常に設定する場合、テキストの中央を編集すると、一番下までスクロールされなくなります。

解決策は、テキスト ビュー デリゲートにこれを追加することです。

- (void)textViewDidChange:(UITextView *)textView {
    CGRect line = [textView caretRectForPosition:
        textView.selectedTextRange.start];
    CGFloat overflow = line.origin.y + line.size.height
        - ( textView.contentOffset.y + textView.bounds.size.height
        - textView.contentInset.bottom - textView.contentInset.top );
    if ( overflow > 0 ) {
        // We are at the bottom of the visible text and introduced a line feed, scroll down (iOS 7 does not do it)
        // Scroll caret to visible area
        CGPoint offset = textView.contentOffset;
        offset.y += overflow + 7; // leave 7 pixels margin
        // Cannot animate with setContentOffset:animated: or caret will not appear
        [UIView animateWithDuration:.2 animations:^{
            [textView setContentOffset:offset];
        }];
    }
}

おすすめ記事