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
字典中检查键盘的结束框架来了解键盘是否真正可见。这将告诉您它的大小和在屏幕上的位置,然后您可以使用它来确定如何在您的用户界面中做出最佳反应。
为了在用户键盘的正上方显示文本字段,我在我的自定义视图控制器中覆盖了 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
字典中检查键盘的结束框架来了解键盘是否真正可见。这将告诉您它的大小和在屏幕上的位置,然后您可以使用它来确定如何在您的用户界面中做出最佳反应。