计算&在键盘上移动UIView(显示/隐藏)

时间:2018-03-18 09:08:50

标签: swift uiview swift4

如果键盘与字段重叠并在键盘关闭后移回原位,我试图计算移动UITextField及其父UIView的位置。

我已经尝试了https://github.com/hackiftekhar/IQKeyboardManager,但在我的特定情况下它不起作用。

要解释这个问题,请参阅两个附带的截图,一个是键盘打开时,另一个是关闭时。

View Without Keyboard View With Keyboard

正如您所看到的,在键盘打开时,文本字段与键盘重叠,我想将文本字段与弹出视图一起移动以重新调整并坐在键盘上方。

这是我尝试过的。

func textFieldDidBeginEditing(_ textField: UITextField) {
    self.startOriginY = self.frame.origin.y
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
}

@objc func keyboardWillShow(_ notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
        let screenHeight = self.backgroundView.frame.height
        let viewHeight = self.frame.height
        let diffHeight = screenHeight - viewHeight - keyboardHeight
        if diffHeight < 0 {
            self.frame.origin.y = -self.textField.frame.height
        }
    }
}

func textFieldDidEndEditing(_ textField: UITextField) {
    self.frame.origin.y = self.startOriginY
}

此代码将视图移动到错误的位置。我试图弄清楚如何计算移动视图和删除键盘重叠的正确位置。

解决此问题的最佳方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

基本上,您需要在滚动视图中嵌入视图,并使用Apple's example通过更改滚动视图的底部内容插入来处理调整:

  1. 嵌入滚动视图
  2. 注册键盘通知
  3. 通过更改底部内容插入来实现处理通知的逻辑
  4. 我已将Apple的代码狙击转换为Swift。

    键盘将显示

    if let info = notification.userInfo,
       let size = (info[UIKeyboardFrameEndUserInfoKey] as AnyObject?) {
           let newSize = size.cgRectValue.size
           let contentInset = UIEdgeInsetsMake(0.0, 0.0, newSize.height, 0.0)
           scrollView.contentInset = contentInset
     }
    

    键盘将隐藏:

    let contentInset = UIEdgeInsets.zero
    scrollView.contentInset = contentInset
    scrollView.scrollIndicatorInsets = contentInset
    

    您还可以向newSize.height添加硬编码的偏移量,即:newSize.height + 20