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

UITextView disappears behind keyboard after typing a while

我们正在尝试支持 iOS 9 一段时间...这是唯一发生这种情况的地方...

我有一个UITextView占据了整个view,占据了整个屏幕。我注册接收 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 的大小似乎 return显示键盘前的原始大小。

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

我最好的猜测是您将自动布局与自动调整大小混合在一起,它似乎在稍后的 iOS 中选择了 intended,但在 iOS 9.

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

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

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

...

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