keyboardwillshow在水平旋转和垂直方向上调用两次甚至三次(vert)

时间:2018-02-01 11:11:01

标签: ios swift nsnotificationcenter

我试图进行键盘测量,但在旋转过程中,我总是遇到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))

在其他讨论中有人说过这是正常的行为,因为键盘在旋转之前会下降并且在旋转之后再次向上移动'但我没有在文档中找到任何确认,也没有在其他任何地方找到。它为什么会真的发生?请,我真的很困惑(

1 个答案:

答案 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设置为零以重置整个过程。

通过执行此操作,您可以防止多次触发该功能。