制作多个滚动视图时会响应滚动行为

时间:2018-01-26 10:14:03

标签: ios swift uiscrollview

我有一个视图,里面有四个滚动视图。我想做的是让所有这些滚动视图在其中一个滚动时响应。我试着通过这段代码来做到这一点:

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)

enter image description here

有没有办法让这感觉像普通的滚动一样?

2 个答案:

答案 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
    } }
}