Swift 3移动查看键盘显示 - 错误的KeyboardSize

时间:2017-01-24 17:00:42

标签: ios swift swift3

当iOS显示/隐藏键盘时,我正在努力移动我的视图。 (抱歉,不知道如何格式化代码突出显示)

我实施了以下观察员:

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

这些功能:

func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
      if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y += keyboardSize.height/2
      }
    }
  }

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
      if self.view.frame.origin.y == 0 {
        self.view.frame.origin.y -= keyboardSize.height/2
      }
    }
}

我添加了一个扩展名:

extension UIViewController {
  func hideKeyboardWhenTappedAround() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
    tap.cancelsTouchesInView = false
    view.addGestureRecognizer(tap)
  }

  func dismissKeyboard() {
   view.endEditing(true)
  }
}

所以这一切都很好。 但是,一旦键盘认为显示单词建议是个好主意,我就会遇到问题。键盘越来越高,视图向下徘徊太远。 这种情况主要发生在用户从仅限数字键盘切换到另一个文本字段时,它是普通键盘(有时带有建议)。 那么,有没有办法知道键盘当前是否显示单词建议(或其他任何“正常”高度偏差)? 我想过将全局变量用于 keyboardWillShow 功能的键盘高度,但这不起作用,因为当它们在具有不同键盘高度的文本字段之间切换时,我会移动到远或更少(参见数字垫)。 任何帮助都非常感谢!提前谢谢!

编辑: 啊!我认为将 willShowKeyboard - 高度存储在全局变量中并将其与 willHideKeyboard - 高度进行比较可能会有效。我仍然愿意接受更顺畅的解决方案!

2 个答案:

答案 0 :(得分:0)

关键UIKeyboardFrame 开始 UserInfoKey没有为您提供最终尺寸 - 正如名称提示"开始"。

相反,请尝试使用它的姐妹UIKeyboardFrame 结束 UserInfoKey - 这将在结束动画后为您提供键盘的最终尺寸。

请注意,它不会将轮换纳入帐户https://developer.apple.com/reference/uikit/uikeyboardframeenduserinfokey

答案 1 :(得分:-1)

我结束了将keyboardHeight从 keboardWillShow 存储到全局变量中,然后将该变量移回 keboardWillHide 。我正在检查最后一个keyboardHeight是否等于当前移动我的视图(如果需要)。 不太漂亮但是,嘿,它有效!

// keyboardHeight is a global var.

func keyboardWillShow(notification: NSNotification) {
  if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    if self.view.frame.origin.y == 0 ||
      (keyboardHeight != keyboardSize.height/2)
    {
      self.view.frame.origin.y = 0
      self.view.frame.origin.y -= keyboardSize.height/2
      keyboardHeight = keyboardSize.height/2
    }
  }
}

func keyboardWillHide(notification: NSNotification) {
  if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
  _ = keyboardSize.height/2 // to surpress warnings...
    if self.view.frame.origin.y != 0 {
      self.view.frame.origin.y += keyboardHeight //keyboardSize.height/2
    }
  }
}

我不知道 keyboardWillShow 中的 self.view.frame.origin.y = 0 。我想我会考虑只将其移动差异而不是每次都设置为0。但是现在每个人都应该按照自己的意愿行事。