7

ビューコントローラーで次のコードを使用して、キーボードが表示されたときに UITextView のコンテンツオフセットを更新しました。

- (void)keyboardWasShown:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];

    UIEdgeInsets contentInsets = UIEdgeInsetsMake( 0.0, 0.0, keyboardRect.size.height, 0.0 );
    self.textView.contentInset = contentInsets;
    self.textView.scrollIndicatorInsets = contentInsets;
}

キーボードが表示されている状態で、UITextView のコンテンツを手動で下にスクロールすると、キーボードのすぐ上で適切に終了します。- [UITexView scrollRangeToVisible:] ただし、キーボードの存在を考慮していないようです。

  • iOS 6 では、指定した範囲がキーボードの真上に表示されるまで、テキスト ビューがスクロールされました。
  • iOS 7 では、可視性は、以前のようにコンテンツ インセットではなく、テキスト ビューのフレームに基づいているように見えます。そのため、範囲がフレームの下にある場合にのみビューがスクロールし、その範囲がフレームの下部に表示されるのに十分なだけスクロールします。

視覚的には、これが起こっていることです。結果間をジャンプするためのコントロールを使用して、テキスト ビューのインライン検索を作成しました (Safari での検索に似ています)。したがって、ユーザーが「次へ」ボタンをタップしたときの検索結果を含むここに示されているテキスト ビューでは、シアンの選択が結果を下に循環します。ユーザーが 7 番目の結果に移動すると、表示されるまでビューがスクロールされます。

ユーザーが 5 番目の検索結果に移動したときに同じ検索結果で(UISearchBar からの) キーボードを使用すると、スクロールしてキーボードのすぐ上に表示されます。ただし、iOS 6 のみです。iOS 7 では、キーボード以外の状況のように 7 番目の検索結果に移動するまでスクロールは行われず、それでも同じ量だけスクロールされるため、テキスト ビューのフレームの下部に表示されます。

これは iOS 7 の既知の変更ですか? 私は自動レイアウトを使用しているので、次にしようとしているのは、問題を回避するためにテキスト ビューの下部の間隔の制約を調整してビュー全体を縮小することですが、既存のコードを引き続き使用する方法があるかどうかを確認したいと考えています。 iOS7.

4

2 に答える 2

3

これは iOS7 のバグのようです。回避策として次のコードを使用しています (次の質問への回答に大きく影響を受けています: iOS 7 でキーボードが表示されたときに UITextView のサイズを変更する方法)。

CGRect caret_rect = [_editTextView caretRectForPosition:_editTextView.selectedTextRange.end];
UIEdgeInsets insets = _editTextView.contentInset;
CGRect visible_rect = _editTextView.bounds;
visible_rect.size.height -= (insets.top + insets.bottom);
visible_rect.origin.y = _editTextView.contentOffset.y;
if(!CGRectContainsRect(visible_rect, caret_rect)) {
    CGFloat new_offset = MAX((caret_rect.origin.y + caret_rect.size.height) - visible_rect.size.height - _editTextView.contentInset.top,  - _editTextView.contentInset.top);
    [_editTextView setContentOffset:CGPointMake(0, new_offset) animated:NO];
}

奇妙なことに、最後の呼び出しでアニメーションを YES に変更することはできません。

Appleにバグレポートを提出します。

于 2013-10-13T13:12:44.447 に答える