键入一段时间后,UITextView消失在键盘后面

时间:2018-08-29 20:36:46

标签: ios objective-c uitextview ios9 uikeyboard

我们暂时尝试支持iOS 9。。。这是唯一正在发生的事情。。。

我有一个UITextView,它占据了整个视图,它占据了整个屏幕。我注册接收UIKeyboardWillShowNotificationUIKeyboardWillHideNotification。我得到的效果很好,并调整了UITextView的高度,使其位于键盘上方:

- (void) keyboardWillShow:(NSNotification *)aNotification 
    {
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect bounds = self.view.bounds;
    bounds.size.height = bounds.size.height - keyboardRect.size.height;
    self.textView.frame = bounds;
    }

同样,这很好。现在我输入几行。有一阵子,当我添加更多行文本时,文本的底行会自动保持在键盘上方。但是最终,通常在几行(可能是4-5行)之内,下一行将进入键盘下方,而我可以继续在键盘下方键入行。最终,当我在屏幕底部输入要在键盘后面键入的线条时,仍然可以在键盘上方看到的行开始滚动。

在此过程中我没有得到UIKeyboardWillHideNotification,但是它的行为几乎和我一样-也就是说,我的UITextView的大小似乎恢复到了键盘之前的原始大小。显示。

所有这些在iOS 11中都可以正常工作。也就是说,当我键入内容时,文本会向上滚动,因此文本的底行永远不会落在键盘后面。只是iOS9。有人记得那些日子的已知问题吗,还有解决方法?

1 个答案:

答案 0 :(得分:0)

我最好的猜测是您正在混合使用自动调整大小的自动版式,并且似乎是在以后的iOS中选择了预期,但在iOS 9中却没有。

在情节提要中使用您的代码+自动布局约束的快速示例导致我相信是您在较旧的iOS(以下所示的iOS 9.3模拟器)中看到的行为:

AutoResizing+AutoLayout_iOS9

如果我使用纯自动布局方法滚动(即IBOutlet textView的底部约束,并在keyboardWillShow中以编程方式调整该常量),那么它将在iOS 9上产生正确的行为(不调用setFrame):

Pure_AutoLayout_iOS9

@property (strong, nullable) IBOutlet NSLayoutConstraint *textViewBottomConstraint;

...

- (void)keyboardWillShow:(NSNotification *)aNotification {
    CGRect keyboardRect = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    self.textViewBottomConstraint.constant = -keyboardRect.size.height;
}