UIKeyboardDidShow 触发太频繁?

UIKeyboardDidShow triggers too often?

为了在用户键盘的正上方显示文本字段,我在我的自定义视图控制器中覆盖了 inputAccessoryView
我还确保视图控制器可以通过覆盖 canBecomeFirstResponder(并且 return 为真)并通过在 viewWillAppear() 中调用 self.becomeFirstResponder() 来成为第一响应者。

现在,当我在我的视图控制器中将一些消息显示为 UICollectionViewCells 时,我想在键盘出现时向下滚动。所以我在viewDidLoad()中添加了一个通知:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: Notification.Name.UIKeyboardDidShow, object: nil)

keyboardDidShow() 然后调用滚动函数:

@objc private final func scrollToLastMessage() {
    // ('messages' holds all messages, one cell represents a message.)
    guard messages.count > 0 else { return }
    let indexPath = IndexPath(item: self.messages.count - 1, section: 0)
    self.collectionView?.scrollToItem(at: indexPath, at: .bottom, animated: true)
}

的确,通过在Xcode中设置断点,我发现该函数是在键盘出现后触发的。但另外,它也会在我辞去第一响应者之后触发(f.ex。通过点击 return 键 [我辞去了第一响应者并且 return true in textFieldShouldReturn ])和键盘消失了。尽管我认为它不应该:正如 Apple 文档所说:

Posted immediately after the display of the keyboard.

访问视图控制器时也会触发通知,因此在主视图出现后单击(自定义)UICollectionViewCell(单元格没有任何可编辑的内容,只有静态标签或图像意见,所以键盘甚至不应该出现)。

提供更多信息:我几乎在 Youtube 上遵循了这个教程:https://www.youtube.com/watch?v=ky7YRh01by8

UIKeyboardDidShow 通知的发布频率可能比您预期的要高,而不仅仅是在它最初出现的时候。例如,当框架在可见后发生变化时,将发布 UIKeyboardDidShow

不过,您可以通过在 userInfo 字典中检查键盘的结束框架来了解键盘是否真正可见。这将告诉您它的大小和在屏幕上的位置,然后您可以使用它来确定如何在您的用户界面中做出最佳反应。