scrollView

时间:2016-08-08 15:10:32

标签: ios swift user-interface uiscrollview keyboard-events

这是我的观点,左侧是键盘未显示时的视图,右侧是键盘显示时我想要实现的效果。

enter image description here

我的所有字段都被添加到scrollView中,然后我设置了这样的约束,field1 topConstraint设置为scrollView top,field4 bottomConstraint设置为scrollView bottom。所有其他字段都附加到下面的字段。

从正确的模型中可以看出,当键盘显示时,我想重新调整视图。所以我现在正在做的是:

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的当前约束是我将其设置为绑定到视图而不是scrollView底部,并且我将scrollView的每个边缘设置为绑定到视图。

更新 如果我将field4底部约束设置为与scrollView相关联,则scrollViews高度为0,如果我在将scrollView设置为与视图本身一样大之前,怎么能知道它应该是多少呢?这让我很困惑..

更新2 我像这样设置scrollView约束:

    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的顶部和底部。因此,scrollViews框架和scrollViews contentSize之间存在差异,因为它在contentSize>时起作用。框架scrollView是可滚动的。 所以这对我来说是一大进步,现在唯一奇怪的是contentInset。

我对contentInset的理解是,您可以指定视图在任一方向上缩小的程度。因此,现在我正在使用scrollView底部的键盘高度进行插入,但它不会滚动,但是当我将顶部的contentInset设置为一些随机负数,如-100它的滚动,为什么在调整底部插入时没有实现这种行为?

1 个答案:

答案 0 :(得分:0)

所以我用以下方法解决了这个问题:

我确保将Field1和Field4约束设置为scrollview,这样scrollView就能自动计算高度,并且如果某些内容在视图之外,也可以滚动。然后,我从键盘顶部和框架计算出可见帧。

   func keyboardWillShow(notification: NSNotification) {

    self.Field2.snp_updateConstraints { make -> Void in
         make.bottom.equalTo(self.Field3.snp_top)
    }

    self.Field3.snp_updateConstraints { make -> Void in
         make.bottom.equalTo(self.Field4.snp_top)
    }

    self.view.layoutIfNeeded()

    let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height + 4, 0)
    let visibleRect = UIEdgeInsetsInsetRect(self.scrollView.frame, contentInset)
    let scrollToOffset = max(0,self.Field4.frame.maxY - visibleRect.height)
    self.scrollView.setContentOffset(CGPoint(x: 0, y: scrollToOffset), animated: true)
 }

关键是在更改约束之后,我需要使当前布局无效并再次布局视图,这样我们可以计算更新约束在哪里可以正确完成。