swift - 使用键盘快速移动视图
问题描述
我试图在键盘出现时向上移动我的视图,并在键盘隐藏时向后移动。
我遇到的问题是高度似乎不同:KBH1 输出 216,KBH2 输出 260。
这会导致视图比最初移动的更远。
我将如何纠正这个问题?
extension UIViewController {
func addKeyboardFunctions() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboardEx))
// tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: Notification.Name.UIKeyboardWillHide, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: Notification.Name.UIKeyboardWillShow, object: nil)
}
@objc func keyboardWillAppear(_ 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
print("KBH: \(keyboardSize.height)")
}
}
}
@objc func keyboardWillDisappear(_ 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
print("KBH: \(keyboardSize.height)")
}
}
}
解决方案
问题是您正在使用UIKeyboardFrameBeginUserInfoKey
.
该通知将为您提供一个开始帧和一个结束帧,因此您可以相应地移动您的视图。结束帧将是键盘动画结束的位置,因此是它的最终位置。你应该使用这个。
我以前经常使用这个扩展,我认为它适用于 Swift 2
func getKeyboardHeight(notification: NSNotification) -> CGFloat {
let userInfo = notification.userInfo
let keyboardSize = userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
return keyboardSize.CGRectValue().height
}
您应该能够为 Swift 4 更新它,但最重要的部分是使用结束帧而不是开始
推荐阅读
- javascript - javascript Promise 在运行时环境中是如何处理的
- python - 如何从部分为空的列表中获取平均值示例 [0,2,4,0,4,0,0,0,0,10]
- apache-kafka - 如何让第一个 Storm Kafka 演示工作?
- django - 使用字典将值打印到 HTML 表会创建空表
- svg - 是否可以使用 circle svg 命令在 svg gnuplot 终端中绘制圆?
- java - Java Cplex 中的最佳解决方案
- c# - Unity:等待状态转换时动画循环
- arrays - 在 Xcode 10.2 中将数组读取和写入文本文件的代码
- google-sheets - 将任何 SQL 查询转换为不区分大小写
- python - 如何在python re中通过字符串修饰符否定默认的IGNORECASE