2023 更新
在 iOS 中,正确使用约束是处理这个混乱的唯一方法。
将 KUIViewController
粘贴到您的项目中,
创建一个非常简单的约束,将其与您的内容的底部对齐。
将该约束拖动到 bottomConstraintForKeyboard
。
KUIViewController 将始终自动且正确地调整您的内容视图的大小。
一切都是完全自动的。
所有 Apple 的行为都以标准的方式正确处理,例如通过点击来解除等等。
您已经完成了 100%。
那么“您应该调整哪个视图的大小?”
您不能使用 .view
...
因为...您不能在 iOS 中调整 .view
的大小!!!!噢!
只需创建一个名为“holder”的 UIView。它位于 .view
内部。
把你的所有东西放进“holder”里。
当然,“holder”会有四个简单的约束条件:上/下/左/右到.view。
那个底部约束到“holder”的确是bottomConstraintForKeyboard。
你完成了。
给客户发一张账单,然后去喝酒。
没有其他事情要做了。
class KUIViewController: UIViewController {
@IBOutlet var bottomConstraintForKeyboard: NSLayoutConstraint!
@objc func keyboardWillShow(sender: NSNotification) {
let i = sender.userInfo!
let s: TimeInterval = (i[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
let k = (i[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
bottomConstraintForKeyboard.constant = k
UIView.animate(withDuration: s) { self.view.layoutIfNeeded() }
}
@objc func keyboardWillHide(sender: NSNotification) {
let info = sender.userInfo!
let s: TimeInterval = (info[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
bottomConstraintForKeyboard.constant = 0
UIView.animate(withDuration: s) { self.view.layoutIfNeeded() }
}
@objc func clearKeyboard() {
view.endEditing(true)
}
func keyboardNotifications() {
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillShow),
name: UIResponder.keyboardWillShowNotification,
object: nil)
NotificationCenter.default.addObserver(self,
selector: #selector(keyboardWillHide),
name: UIResponder.keyboardWillHideNotification,
object: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
keyboardNotifications()
let t = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard))
view.addGestureRecognizer(t)
t.cancelsTouchesInView = false
}
}
只需在可能出现键盘的任何地方使用KUIViewController。
class AddCustomer: KUIViewController, SomeProtocol {
class EnterPost: KUIViewController {
class EditPurchase: KUIViewController {
在那些屏幕上,现在关于键盘的一切都是完全自动化的。
你完成了。
呼。
*小注脚 - 背景点击可以正确地关闭键盘。这包括点击落在您的内容上的点击。这是正确的苹果行为。任何与此有很大不同的异常变化都需要大量的反苹果定制编程。
*非常小的注脚 - 因此,屏幕上的所有按钮每次都会100%正确地工作。然而,在极其罕见的情况下,嵌套的(!)容器视图内嵌套的(!)滚动视图内嵌套的(!)页面视图容器(!!!!),您可能会发现一个按钮似乎无法工作。这似乎基本上是当前iOS中的一个(隐晦的!)问题。如果您遇到这个极其隐晦的问题,幸运的是解决方案很简单。只需在函数
clearKeyboard()
中添加一个短延迟,问题就解决了。
@objc func clearKeyboard() {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
self.view.endEditing(true)
}
}
(来自用户@wildcat12的一个很棒的提示
https://dev59.com/i6jja4cB1Zd3GeqP6SWw#57698468)