带有contentInset的UITextView:文本输入会导致内容跳转

时间:2019-07-02 10:42:13

标签: uitextview

我有一个UITextView,可让用户输入多行文本。当文本超过TextView的大小时,它需要开始滚动。

当弹出屏幕键盘时,我将键盘的高度设置为TextView的bottom-contentInset,以减轻键盘与TextView重叠的问题。但是,当contentInset大于TextView框架的高度时,尝试输入文本时其内容开始跳跃。文本输入插入符跳出视野,每次击键时,整个文本内容都会上下跳动,从根本上使文本输入成为不可能。

无需任何代码即可复制,因此这不是代码错误,而是组件行为问题:

  • 使用ViewController创建视图,禁用自动布局。
  • 在视图上放置一个UITextView(您可以在其中保留lorem-ipsum文本)
  • 使UITextView的高度为400
  • 在UITextView的底部添加一个500的contentInset
  • 在设备上或模拟器中运行

只要触摸UITextView以使其专注于开始键入,一切都会跳起,并且文本输入光标/插入符号移出视野并开始不规律地跳动。

我在做错什么,或者如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

回答我自己的问题:

Apple的文档建议使用contentInset属性,以防止键盘与UI的关键部分重叠。但是,正如我在上面发现的那样,这不适用于UITextViews ...

您应该使用textContainerInset属性!这符合预期。

- (void)keyboardWasShown:(NSNotification*)aNotification {

    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake( 0, 0, kbSize.height, 0 );
    textView.textContainerInset = contentInsets;
    textView.scrollIndicatorInsets = contentInsets;
}

- (void)keyboardWillBeHidden:(NSNotification*)aNotification {
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    textView.textContainerInset = contentInsets;
    textView.scrollIndicatorInsets = contentInsets;
}