我有一个视图,它可以作为另外两个视图的容器(一个视图占据屏幕的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()
})
}
}
答案 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)