我试图进行键盘测量,但在旋转过程中,我总是遇到2次键盘测量到水平位置和三次到垂直位置的通知。
override func viewDidLoad() {
super.viewDidLoad()
tabBarController?.tabBar.isHidden = true
collectionView?.backgroundColor = UIColor.white
collectionView?.register(ChatLogMessageCell.self, forCellWithReuseIdentifier: cellId)
collectionView?.alwaysBounceVertical = true
collectionView?.showsVerticalScrollIndicator = true
collectionView?.scrollIndicatorInsets = UIEdgeInsets(top: 0,left: 0,bottom: (tabBarController?.tabBar.frame.size.height)!,right: 0)
view.addSubview(messageInputContainerView)
view.addConstraintsWithFormat("H:|[v0]|", views: messageInputContainerView)
view.addConstraintsWithFormat("V:[v0(48)]|", views: messageInputContainerView)
setupInputComponents()
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
}
deinit {
print("Remove NotificationCenter Deinit")
NotificationCenter.default.removeObserver(self)
}
func handleKeyboardNotification(notification: NSNotification) {
if let userInfo = notification.userInfo {
let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
print(keyboardFrame)
}
}
究竟发生了什么: 当我第一次点击textField时:只有一个字符串-Optional((0.0,451.0,375.0,216.0)) - 正如预期的那样。
然后当旋转过程发生时:有两个字符串可选((0.0,213.0,667.0,162.0)) 可选((0.0,213.0,667.0,162.0))
毕竟当我把它带回垂直位置时:甚至还会出现另外三个字符串:可选((0.0,667.0,375.0,0.0)) 可选((0.0,667.0,375.0,0.0)) 可选((0.0,451.0,375.0,216.0))
在其他讨论中有人说过这是正常的行为,因为键盘在旋转之前会下降并且在旋转之后再次向上移动'但我没有在文档中找到任何确认,也没有在其他任何地方找到。它为什么会真的发生?请,我真的很困惑(
答案 0 :(得分:0)
您可以通过将Int
设置为零来解决此问题,然后当用户弹出键盘时,将Int
设置为1(或其他一些数字),如下所示:
var keyBoardCount:Int = 0
func handleKeyboardNotification(notification: NSNotification) {
if keyBoardCount == 0 { //If the keyboard hasnt been raised, raise it.
if let userInfo = notification.userInfo {
let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
print(keyboardFrame)
keyBoardCount = 1 //once you raise the keyboard, set the counter to 1
}
}
}
然后,当用户接受输入的字符串(IE完成编辑textField)时,将keyBoardCount
设置为零以重置整个过程。
通过执行此操作,您可以防止多次触发该功能。