web-dev-qa-db-ja.com

iOS 7で編集すると、UITextViewカーソルが正しく配置されません。なぜですか。

Why is this a thing thats happening

上の黄色のボックスは、現在編集中の編集可能なUITextViewです(ファーストレスポンダーです)。しかし、あなたはおそらく正しく言うことができませんでしたか?カーソルがないからです。しかし、そこには...黄色のtextViewの左下にある小さな青い点です。 textViewsの下の境界線の少し下にあります。したがって、新しい行に移動し続けるか、Enterキーを押すと、テキストは自然に上に移動します。ただし、カーソルが「水平」になったり、UITextViewの下枠の真上になったりすることはありません。それは常に、境界線の数ポイント下の底からかろうじて突き出ているだけです。

どうして?これはiOS6では問題ではありませんでした。これを修正する方法はありますか?

23
Joe

このバグはiOS7.0にあり、textViewデリゲートメソッドを変更することでこれを解決できます。

以下のコードを試してください

- (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];
        }];
    }
}

あなたの問題は解決されます。

41
Pratik

ナビゲーションコントローラーのシナリオを使用している場合、これは実際にはiOS7で導入されたプロパティの結果だと思います:automaticallyAdjustsScrollViewInsetsiOS 7移行ガイド を参照)

これはデフォルトでYESに設定されており、ナビゲーションコントローラーの高さのスクロールオフセットを調整することにより、UITextView(それ自体がスクロールビュー)を巧みに利用しようとします。

したがって、解決策は、viewDidLoadでこのプロパティをNOに設定することです(iOS 7以降でのみ使用可能であるため、iOS 6では呼び出さないように注意してください)。

3
chrishol