我正在尝试滑动一个位于tableview底部的文本框(实际上是在页脚视图中)。所以我尝试了两种方法:
但是,他们没有工作或部分工作。目前,我无法在真正的iPad上测试这个(应用程序仅限iPad),我正在模拟器上测试,但我认为这样的事情应该有效:
动画内容设置
func keyboardWillShow(notification: NSNotification) {
if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
UIView.animate(withDuration: 0.2, animations: {
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
})
}
}
func keyboardWillHide(notification: NSNotification) {
UIView.animate(withDuration: 0.2, animations: {
self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
})
}
动画自动布局约束
func keyboardWillShow(notification: NSNotification) {
if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
UIView.animate(withDuration: 0.2, animations: {
self.bottomTableviewConstraint.constant = keyboardHeight
self.qaTableview.layoutIfNeeded()
})
}
}
func keyboardWillHide(notification: NSNotification) {
UIView.animate(withDuration: 0.2, animations: {
self.bottomTableviewConstraint.constant = 0
self.qaTableview.layoutIfNeeded()
})
}
所以在第一个例子中,我从未注意到动画,也没有注意到tableview内容的移动。在第二个例子中,我做了一个autolayout约束的出口(底部垂直间距),但我得到一些奇怪的结果。例如,tableview向上移动,但不是完全移动,而且只是第一次。
如果我设置断点,keyboardHeight
等于471
。我错过了一些明显的东西吗?
答案 0 :(得分:3)
这是我尝试过的,它按预期工作得非常好。
您可以查看添加通知中心的位置吗?
- 动画内容设置
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
UIView.animate(withDuration: 0.2, animations: {
self.tbl.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
})
}
}
func keyboardWillHide(notification: NSNotification) {
UIView.animate(withDuration: 0.2, animations: {
self.tbl.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
})
}
- 动画自动布局约束
确保您没有在故事板中为UITableView设置底部布局和高度约束。
<强> 注 强>
但是,只需使用UITableViewController
,就可以更轻松地完成此操作。它默认会处理此功能。当然,如果您在使用它时没有问题。
<强> 修改 强>
UITextView
的行为与UITextField
略有不同。为delegate
设置UITextView
。并在textViewShouldBeginEditing
中执行所有表格视图对齐。
extension ViewController: UITextViewDelegate {
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
let pointInTable:CGPoint = textView.superview!.convert(textView.frame.origin, to: tbl)
tbl.contentOffset = CGPoint(x: tbl.contentOffset.x, y: pointInTable.y)
return true
}
}
答案 1 :(得分:0)
我使用IQKeyboardManager库来处理这种行为:https://github.com/hackiftekhar/IQKeyboardManager
IQKeyboardManager允许您防止键盘向上滑动并覆盖UITextField / UITextView,而无需您输入任何代码,也无需其他设置。要使用IQKeyboardManager,只需将源文件添加到项目中即可。
实施起来非常简单。使用pod导入库,然后在AppDelegate中添加:
import IQKeyboardManager
在didFinishLaunchingWithOptions中:
IQKeyboardManager.sharedManager().enable = true