【发布时间】:2016-03-26 14:19:38
【问题描述】:
说明
当其中一个在编辑期间被键盘覆盖时,我想向上滚动一些 UITextField。这里有很多关于 SO 的答案,有很多风格:移动视图(通过改变它的框架),修改约束,使用 UIScrollView 和 UITableView,或者使用 UIScrollView 和修改 contentInset。
我决定使用最后一个。这个也是described by Apple,有一个Swift version on SO,还有一个described on this blog,包括一个sample project on the GitHub。
部分代码
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(textField: UITextField) {
self.activeField = nil
}
func textFieldDidBeginEditing(textField: UITextField) {
self.activeField = textField
}
func keyboardWillShow(notification: NSNotification) {
if let activeField = self.activeField, keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
let contentInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)
self.scrollView.contentInset = contentInsets
self.scrollView.scrollIndicatorInsets = contentInsets
var aRect = self.view.frame
aRect.size.height -= keyboardSize.size.height
if (!CGRectContainsPoint(aRect, activeField.frame.origin)) {
self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
}
}
}
func keyboardWillBeHidden(notification: NSNotification) {
let contentInsets = UIEdgeInsetsZero
self.scrollView.contentInset = contentInsets
self.scrollView.scrollIndicatorInsets = contentInsets
}
问题
我只想要一个简单的修改 - 在键盘和已编辑字段之间留出更多空间。因为开箱即用,它看起来像这样:
我在scrollRectToVisible 调用中修改了CGRect,但它没有任何改变。更重要的是,即使用scrollRectToVisible 注释掉这行也没有任何效果——一切都和以前一样(包括向上滚动内容)。在 iOS 9.2 上检查
如果需要,复制很简单 - 只需使用上面的 GitHub 链接下载工作代码并注释掉 scrollRectToVisible 行。
经过测试的解决方法
我尝试了解决方法,但不喜欢最终效果:
- 增加
contentInset- 用户可以向上滚动超过 contentSize - 将
UIKeyboardDidShowNotification替换为UIKeyboardWillShowNotification,添加另一个UIKeyboardDidShowNotification观察者,里面只有scrollRectToVisible- 可以,但是有两个向上滚动的动画,看起来不太好。
问题
- 为什么更改
contentInset(没有scrollRectToVisible调用)会滚动scrollView 中的内容?我没有在任何文档中看到有关此类行为的信息 - 更重要的是 - 怎么做,再向上滚动一点,在编辑的文本字段和键盘之间留出一些空间?
我错过了什么?有什么简单的方法可以解决吗?或者使用scrollView.contentSize 而不是contentInset 会更好?
【问题讨论】:
标签: ios swift uiscrollview uikit uikeyboard