当用户在tableview中滚动时,动画约束更改

时间:2017-01-11 17:04:34

标签: ios swift uitableview animation

我有一个视图,它可以作为另外两个视图的容器(一个视图占据屏幕的1/4,一个视图占据屏幕的3/4)。我想要的是当用户向上滚动(滑动方向)桌面视图时,桌面视图将平滑地向上(直到屏幕)并在用户向下滚动时向下移动(滑动方向)。

到目前为止,我已经设法让桌面视图上升,但是它太突然而且不能让它失效。 我是这样做的: viewViewTopConstraint是容器顶部约束的tableview顶部约束

extension StatsOverlayViewController: UIScrollViewDelegate {
func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView == statsTableView {
        let scrolledOffset = scrollView.contentOffset.y

        while viewViewTopConstraint.constant > 0  && viewViewTopConstraint.constant < 69 {
            print("scrolling with offset\(scrollView.contentOffset.y)")
                self.viewViewTopConstraint.constant -= scrolledOffset
        }
    }
}

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if scrollView == statsTableView {
        if  viewViewTopConstraint.constant < 0 {
            viewViewTopConstraint.constant = 0
        } else if viewViewTopConstraint.constant > 69 {
            viewViewTopConstraint.constant = 69
        }
    }
}

}

编辑:

将视图放回原位的问题是由于scrollview.bounces = true和错误使用while循环 有效的代码是:

       func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView == statsTableView {
        let scrolledOffset = scrollView.contentOffset.y
        UIView.animateWithDuration(0.2, animations: {
            if scrolledOffset > 0 {
                self.viewViewTopConstraint.constant = 0
            } else {
                self.viewViewTopConstraint.constant = self.viewViewTopConstraintOriginalValues
            }
            self.view.layoutIfNeeded()
        })
    }
}

1 个答案:

答案 0 :(得分:1)

您需要在self.view.layoutIfNeeded阻止

中致电UIView.animate
UIView.animate(withDuration: 1) { 
    self.view.layoutIfNeeded
}

更改约束后立即添加此代码。如果您想对动画进行更多控制,请使用此

UIView.animate(withDuration: 1, delay: 0, options: [.curveEaseInOut], animations: {
    self.view.layoutIfNeeded
}, completion: nil)