【发布时间】:2016-06-11 08:55:05
【问题描述】:
我知道我发布的问题已经被讨论了很多,但据我在 SO 中搜索,我找不到特定于我的问题的解决方案。我发布这个以获得一些输入。
问题:
视图层次结构: View -> ScrollView -> View -> Textfield
我已经实现了两个屏幕,在滚动视图顶部放置了多个文本字段,以避免当文本字段位于页面底部时键盘遮挡文本字段。我使用 Apple 提供的示例代码稍作修改就实现了这一点。
- 订阅
UIKeyboardWillShowNotification和UIKeyboardWillHideNotification - 显示键盘时,从
userInfo字典中获取键盘高度并设置适当的内容插入以将文本字段移动到键盘上方 - 隐藏键盘时,将内容插入设置为
UIEdgeInsetZero以恢复正常大小
当有更多的文本字段可以占据整个屏幕时,上述实现工作得非常好(假设有 10 个文本字段并且它们超出了滚动视图的框架)。每当我点击文本字段时,它会按预期移动到键盘上方,我还可以滚动页面直到最底部的文本字段在键盘框架上方可见(当键盘仍在向上时)。
当我在滚动视图中只有两个在屏幕上垂直居中的文本字段时,我的问题就出现了。当我点击文本字段时,滚动视图会获得一个与键盘高度等效的插图,并且它会按预期移动到键盘上方,但是当我滚动屏幕时,我可以在文本字段下方看到一个巨大的空白区域(由于附加的插图)。
当页面中只有一两个文本字段时,如何避免出现空白?我是否必须编写不同的逻辑来处理这种情况?任何帮助,将不胜感激。
下面是代码:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShow(notification: NSNotification) {
if let userInfo = notification.userInfo {
let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
if let kbFrame = keyboardFrame {
let inset = CGRectGetHeight(kbFrame)
scrollView.contentInset = UIEdgeInsetsMake(0, 0, inset, 0)
scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, inset, 0)
}
}
}
func keyboardWillHide(notfication: NSNotification) {
scrollView.contentInset = UIEdgeInsetsZero
scrollView.scrollIndicatorInsets = UIEdgeInsetsZero
}
【问题讨论】:
标签: ios swift uiscrollview keyboard uitextfield