为了在用户的键盘正上方显示文本字段,我在自定义视图控制器中覆盖了inputAccessoryView
。
我还确保视图控制器可以通过覆盖canBecomeFirstResponder
(并返回true)并通过调用self.becomeFirstResponder()
中的viewWillAppear()
来成为第一个响应者。
现在,当我在视图控制器中显示一些消息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.通过点击返回键[我辞去第一个响应者并在textFieldShouldReturn
中返回])并且键盘消失了。虽然我认为它不应该:正如Apple博士说的那样:
在显示键盘后立即发布。
通知也会在访问视图控制器时触发,因此在主视图出现后和单击(自定义)UICollectionViewCell
时(单元格没有任何可编辑内容,只有静态标签或图像视图,所以键盘甚至不应该出现。
提供更多信息:我几乎在Youtube上遵循了本教程:https://www.youtube.com/watch?v=ky7YRh01by8
答案 0 :(得分:2)
UIKeyboardDidShow
通知可能会比您预期的更频繁地发布,而不仅仅是最初出现时。例如,当框架在可见之后发生更改时,会发布UIKeyboardDidShow
。
但是,通过从userInfo
字典中检查键盘的结束帧,您可以知道键盘是否真正可见。这将告诉您屏幕上的大小和位置,然后您可以使用它来确定在用户界面中的最佳反应。