【发布时间】:2016-12-14 10:32:15
【问题描述】:
这是我的视图,左边是键盘不显示时的视图,右边是键盘显示时我想要实现的视图。
我的所有字段都添加到一个滚动视图中,然后我设置这样的约束,field1 topConstraint 设置为 scrollView 顶部,field4 bottomConstraint 设置为 scrollView 底部。所有其他字段都附在下面的字段中。
从最右边的模型中可以看出,当显示键盘时,我想像这样重新调整视图。所以我现在要做的是:
func keyboardWillShow(notification: NSNotification) {
self.field2.snp_updateConstraints { make -> Void in
make.bottom.equalTo(self.field3.snp_top).offset(8)
}
用这个我调整了 field2 和 field3 之间的大空间,到目前为止一切都很好。然后我继续设置 contentInset:
let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height, 0)
self.scrollView.contentInset = contentInset
self.scrollView.scrollIndicatorInsets = contentInset
但是 scrollView 没有按我想要的方式调整,因为 field3 仍然隐藏在键盘后面的一半。
发表这篇文章的原因是我显然不明白 contentInsets 是如何与 scrollView 一起工作的,如果可能的话,我想避免手动设置 contentOffset。
我设置的约束似乎有问题。 field4 的当前约束是我将其设置为绑定到视图而不是滚动视图底部,并且我将滚动视图的每个边缘设置为绑定到视图。
更新: 如果我将 field4 底部约束设置为绑定到 scrollView,scrollViews 高度为 0,如果我在将 scrollView 设置为与视图本身一样大之前,它怎么会不知道它应该是什么大小?这真的让我很困惑..
更新 2 我正在设置这样的滚动视图约束:
self.scrollView.snp_makeConstraints { make -> Void in
make.top.equalTo(self.snp_topLayoutGuideBottom)
make.left.right.equalTo(self.view)
make.bottom.equalTo(self.snp_bottomLayoutGuideBottom)
}
从UIDebugger我可以看到scrollView的高度是一样的,但是Y坐标变成了20,但是还是不能滚动进去??此外,在调试时,我可以将 scrollViews contentSize 设置为大于框架,这意味着它应该是可滚动的,但事实并非如此。
更新 3 我现在了解到 Field1 和 Field4 都需要附加到滚动视图的顶部和底部。因此,scrollViews frame 和 scrollViews contentSize 之间存在差异,因为当 contentSize > frame scrollView 可滚动时,它的工作原理与预期相同。 所以这对我来说是向前迈出的一大步,现在唯一奇怪的是 contentInset。
我对 contentInset 的理解是,您可以指定视图在任一方向上应缩小多少。所以现在我正在使用scrollView底部的键盘高度进行插入,但它没有滚动,但是当我将顶部contentInset设置为一些随机负数(如-100)时,它会滚动,为什么调整底部插图时未实现此行为?
【问题讨论】:
-
所以你不想移动你的“字段4”,它应该独立于键盘,对吧?对不起,实际上我没有这方面的经验,所以我的评论可能没有多大帮助。但只是想看看我是否理解正确,因为我也对你的问题的答案感兴趣。
-
是的,field4 不应该移动。
标签: ios swift user-interface uiscrollview keyboard-events