2020 年更新
正确使用约束...
只有一种方法可以在 iOS 中正确处理这种混乱。
-
将下面的KUIViewController粘贴到您的项目中,
-
创建一个对“内容底部”非常简单的约束。
-
将该约束拖到bottomConstraintForKeyboard
KUIViewController 将始终自动正确地调整您的内容视图的大小。
一切都是全自动。
所有 Apple 行为都以标准方式正确处理,例如通过点击关闭等。
你已经 100% 完成了。
那么“你应该调整哪个视图的大小?”
你不能使用.view ...
因为...您无法在 iOS 中调整 .view 的大小!!!!!!呵呵!
只需制作一个名为“holder”的 UIView。它位于.view 内。
把你所有的东西都放在“持有人”里面。
对于.view,持有者当然会有四个简单的上/下/左/右约束。
对“持有人”的底部约束确实是bottomConstraintForKeyboard。
你已经完成了。
给客户寄账单然后去喝酒。
没有什么可做的了。
class KUIViewController: UIViewController {
// KBaseVC is the KEYBOARD variant BaseVC. more on this later
@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
// Note. that is the correct, actual value. Some prefer to use:
// bottomConstraintForKeyboard.constant = k - bottomLayoutGuide.length
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)
// (subtle iOS bug/problem in obscure cases: see note below
// you may prefer to add a short delay here)
}
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 {
在这些屏幕上,关于键盘的绝对一切现在完全自动。
你已经完成了。
呼。
*次要脚注 - 背景点击正确关闭键盘。这包括落在您的内容上的点击。这是正确的 Apple 行为。任何不寻常的变化都需要大量非常反苹果的自定义编程。
*非常小的脚注 - 因此,屏幕上的所有按钮每次都能 100% 正确工作。然而,在嵌套 (!) 滚动视图内的嵌套 (!) 容器视图与嵌套 (!) 页面视图容器 (!!!!) 的令人难以置信的模糊案例中,您可能会发现按钮似乎不起作用。在当前的 iOS 中,这似乎基本上是一个(晦涩的!)问题。如果您遇到这个令人难以置信的晦涩问题,幸运的是解决方案很简单。查看函数clearKeyboard(),只需添加一个短暂的延迟,就完成了。
@objc func clearKeyboard() {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
self.view.endEditing(true)
}
}
(来自用户 @wildcat12 https://stackoverflow.com/a/57698468/294884 的一个很好的提示)