-scrollRangeToVisible:在iOS 7中不考虑键盘大小

时间:2013-09-26 15:29:42

标签: ios objective-c uitextview ios7

我一直在视图控制器中使用以下代码来更新键盘显示时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中搜索)。因此,在文本视图shown here with search results中,当用户点击“下一步”按钮时,青色选择将循环显示结果。当用户转到第七个结果时,视图将滚动直到可见。

当用户转到第五个搜索结果时,使用键盘(来自UISearchBar)up on the same search results,它将滚动到键盘上方。但仅限于iOS 6.在iOS 7中,在非键盘情况下转到第七个搜索结果之前不会进行滚动,即使这样,它也会滚动相同的数量,因此它只能在文本视图框架的底部下方显示。

这是iOS 7中的已知更改吗?我正在使用自动布局,所以我要尝试的下一件事是调整文本视图的底部间距约束来缩小整个视图以避免问题,但是想要检查是否仍有使用我现有代码的方法iOS 7。

2 个答案:

答案 0 :(得分:5)

尽管已经回答了这个问题,但在构建我自己的UITextView子类时遇到了同样的问题,如果您感兴趣,可以使用搜索突出显示(可用on my GitHub)并提出自定义scrollRangeToVisible:方法的实现。您所需要做的就是调整contentInset的{​​{1}}和scrollIndicatorInset属性(正如您所做的那样related answer对于正在阅读此内容的Google员工),然后致电:

UITextView

我将相关代码包装在一个类别中,其中还有一些其他有用的方法来解释iOS 7中的插入内容:

注意:由于我在子类中组织此代码的方式,您需要它们。随意根据自己的喜好重新组织。

[textView scrollRangeToVisible:range consideringInsets:YES];

答案 1 :(得分:3)

这似乎是iOS7中的一个错误。我正在使用以下代码作为解决方法(受到以下问题的答案的启发:How to re-size UITextView when keyboard shown with iOS 7)。

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提交错误报告。