我有一个视图,里面有四个滚动视图。我想做的是让所有这些滚动视图在其中一个滚动时响应。我试着通过这段代码来做到这一点:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
self.hpcScrollView.setContentOffset(scrollView.contentOffset, animated: true)
self.parScrollView.setContentOffset(scrollView.contentOffset, animated: true)
self.scoreScrollView.setContentOffset(scrollView.contentOffset, animated: true)
self.holeScrollView.setContentOffset(scrollView.contentOffset, animated: true)
}
然而,当我应用它时,滚动"行为"被带走了。它仍然滚动,但没有反弹,当我从滚动视图中取出手指时,它会立即停止滚动(请参阅下面的gif)
有没有办法让这感觉像普通的滚动一样?
答案 0 :(得分:1)
问题是您重置原始滚动视图,使其停止。您需要跟踪用户正在与之交互的当前滚动视图,并仅更新其他滚动视图。否则,它们都将生成滚动事件并最终相互更新。
// currentScrollView is an object var
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
currentScrollView = scrollView
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView == currentScrollView {
if currentScrollView != self.hpcScrollView {
self.hpcScrollView.setContentOffset(scrollView.contentOffset, animated: false)
}
if currentScrollView != self.parScrollView {
self.parScrollView.setContentOffset(scrollView.contentOffset, animated: false)
}
if currentScrollView != self.scoreScrollView {
self.scoreScrollView.setContentOffset(scrollView.contentOffset, animated: false)
}
if currentScrollView != self.holeScrollView {
self.holeScrollView.setContentOffset(scrollView.contentOffset, animated: false)
}
}
}
请注意,您必须将animated
标记设置为false
。
答案 1 :(得分:1)
不要将contentOffset
应用于当前正在滚动的scrollView。更改当前滚动视图的contentOffset
会导致它停止滚动并立即跳转到偏移量。
let scrollableViews = [hpcScrollView, parScrollView, scoreScrollView, holeScrollView]
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollableViews.forEach { if $0 != scrollView { $0.setContentOffset(scrollView.contentOffset, animated: true) } }
}
修改强>
每当我们设置内容偏移时,都会调用scrollViewDidScroll
,这会导致gif中显示的奇怪的滚动行为。
试试这个
let scrollableViews = [hpcScrollView, parScrollView, scoreScrollView, holeScrollView]
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollableViews.forEach { if $0 != scrollView {
let scrollBounds = $0.bounds
scrollBounds.origin = scrollView.contentOffset
$0.bounds = scrollBounds
} }
}