将 UIScrollView 滚动到键盘隐藏的 UITextView 中的奇怪行为

Posted

技术标签:

【中文标题】将 UIScrollView 滚动到键盘隐藏的 UITextView 中的奇怪行为【英文标题】:Strange Behavior in Scrolling UIScrollView to UITextView hidden by keyboard 【发布时间】:2013-05-09 18:13:55 【问题描述】:

我在这里查看了许多关于滚动和取消隐藏 UITextField 的帖子,并认为相同的代码应该适用于 UITextView,但情况似乎并非如此。我遇到的第一个问题是我的示例应用程序是仅支持横向的 iPad 应用程序。从通知返回的键盘大小与键盘的高度和宽度相反。

接下来,虽然我可以让滚动视图滚动文本视图,但它并没有显示所有内容,实际上显示的文本视图数量取决于我在文本视图中点击的位置。它更像是滚动到光标所在的位置,这不是我想要的。

这是我正在使用的代码。它取自一个示例,唯一真正的变化是使用 UITextView 而不是 UITextField。如果我唯一要做的就是用文本字段替换文本视图,它就可以正常工作。

- (void)keyboardWasShown:(NSNotification*)aNotification

    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.width, 0.0);
    _myscrollview.contentInset = contentInsets;
    _myscrollview.scrollIndicatorInsets = contentInsets;
    CGRect aRect = self.view.frame;
    aRect.size.height -= kbSize.width;
    DebugLog(@"textview = %@", _textview);

    if (!CGRectContainsPoint(aRect, _textview.frame.origin) ) 
        CGPoint scrollPoint = CGPointMake(0.0, _textview.frame.origin.y-kbSize.width);
        [_myscrollview setContentOffset:scrollPoint animated:YES];
    

【问题讨论】:

【参考方案1】:

如果你只是想滚动到 UITextView 的顶部,你可以这样做

[textview scrollRectToVisible:CGRectMake(0,0,1,1) animated:YES];

尝试使用以下方法。也许将其设置为 textView 的高度。可以发一张问题截图吗?

- (void)textViewDidChangeSelection:(UITextView *)textView

    [textView setSelectedRange:NSMakeRange(0, 0)];

【讨论】:

不,我想要的是让 UITextView 完全可见。当键盘隐藏它时,我提交的代码适用于 UITextField,但不适用于 UITextView。 UITextView 仅部分显示,显示多少取决于我在 UITextView 中点击的位置。如果我点击视图顶部,则只有一小部分 UITextView 未被发现。如果我点击 UITextView 的底部,大部分内容都会被发现。就好像 UITextView 框架的原点根据我点击的位置而改变。 textView.selectedRange。试着弄乱它。 MarkM 关于使用 textView.selectedRange 的建议提供了我正在寻找的答案。很明显,textView 将插入点作为原点返回,然后滚动视图以使插入点可见,而不是我想要的整个视图。因此,我将位置范围设置为 textView.text.length,将其长度设置为 0,该长度被定义为插入点,整个 textView 被滚动以可见。【参考方案2】:

Apple 提供了正确的方法here(查看清单 4-1)。它适用于 UITextField 和 UITextView。我们不需要编辑范围或其他任何内容。它应该是需要处理的滚动视图。标记为“已回答”的可能有效,但我们最好遵循创建者的方法!

【讨论】:

以上是关于将 UIScrollView 滚动到键盘隐藏的 UITextView 中的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

当键盘可见时,UIScrollView滚动到按钮

如何以编程方式移动 UIScrollView 以集中在键盘上方的控件中?

UIScrollView 仅在显示键盘时才需要

键盘出现时的UIScrollView

当我在显示的键盘上单击文本字段两次时,iOS UIScrollView 无法滚动

键盘消失时,UIScrollView 不会向下滚动到其原始位置