【问题标题】:iOS - scrollViewDidEndDecelerating runs for both scrollView and collectionViewiOS - scrollViewDidEndDecelerating 同时运行 scrollView 和 collectionView
【发布时间】:2017-11-11 08:00:03
【问题描述】:
我有一个包含collectionView 和scrollView 的VC。我把这段代码通过在scrollView中滚动来改变pageController的当前页面:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
它对scrollView 很有效,但问题是当我滚动到collectionView 时,它会声明并导致pageController 发生不必要的变化!
我该怎么办?
【问题讨论】:
标签:
ios
objective-c
swift
scrollview
collectionview
【解决方案1】:
首先你必须了解UICollectionView 的一些细节。 UICollectionView 是 UIScrollView 的子类。这就是为什么滚动(滚动集合视图和滚动滚动视图)都调用它的原因。你可以这样做来区分它是什么类型的滚动,
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView == "Your scrollView outlet name" { // Scroll view
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
} else {
// Collection view
}
}
谢谢。
【解决方案2】:
if scrollView == yourScrollView{
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
检查运行该方法的实例是否真的是你的滚动视图
【解决方案3】:
您需要检查scrollViewDidEndDecelerating 中的scrollView 是滚动视图还是集合视图。
只需添加if scrollView == myScrollView,然后再执行您拥有的 2 行代码。
你的代码应该是这样的
功能
scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView == myScrollView {
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
}
【解决方案4】:
除了上面发布的答案,您还可以使用视图的标签属性。
只需在 xib 或代码中为您的滚动视图分配一个标记 (Int)。
yourScrollView.tag = 10
并在滚动视图委托方法中检查此标记:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView.tag == 10 {
///Your scrollview was scrolled
} else {
// Collection view was scrolled
}
}