上の黄色のボックスは、現在編集中の編集可能なUITextViewです(ファーストレスポンダーです)。しかし、あなたはおそらく正しく言うことができませんでしたか?カーソルがないからです。しかし、そこには...黄色のtextViewの左下にある小さな青い点です。 textViewsの下の境界線の少し下にあります。したがって、新しい行に移動し続けるか、Enterキーを押すと、テキストは自然に上に移動します。ただし、カーソルが「水平」になったり、UITextViewの下枠の真上になったりすることはありません。それは常に、境界線の数ポイント下の底からかろうじて突き出ているだけです。
どうして?これはiOS6では問題ではありませんでした。これを修正する方法はありますか?
このバグは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];
}];
}
}
あなたの問題は解決されます。
ナビゲーションコントローラーのシナリオを使用している場合、これは実際にはiOS7で導入されたプロパティの結果だと思います:automaticallyAdjustsScrollViewInsets
( iOS 7移行ガイド を参照)
これはデフォルトでYESに設定されており、ナビゲーションコントローラーの高さのスクロールオフセットを調整することにより、UITextView(それ自体がスクロールビュー)を巧みに利用しようとします。
したがって、解決策は、viewDidLoad
でこのプロパティをNOに設定することです(iOS 7以降でのみ使用可能であるため、iOS 6では呼び出さないように注意してください)。