iOS - scrollViewDidEndDecelerating 为 scrollView 和 collectionView 运行
iOS - scrollViewDidEndDecelerating runs for both scrollView and collectionView
我有一个 VC,其中包含一个 collectionView
和一个 scrollView
。我把这段代码通过在 scrollView 中滚动来更改 pageController
的当前页面:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
它对 scrollView
很好用,但问题是当我在 collectionView
中滚动时,它会声明并导致 pageController
中不需要的更改!
我该怎么办?
首先,您必须了解有关 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
}
}
谢谢。
if scrollView == yourScrollView{
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
检查实例运行方法是否真的是你的scrollView
您需要检查 scrollViewDidEndDecelerating
中的 scrollView
是滚动视图还是 collection 视图。
只需在执行您拥有的 2 行代码之前添加一个 if scrollView == myScrollView
。
您的代码应该如下所示
函数
scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView == myScrollView {
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
}
除了上面发布的答案,您还可以使用视图的标签 属性。
只需在 xib 中或通过代码为您的滚动视图分配一个标签 (Int)。
yourScrollView.tag = 10
并在滚动视图委托方法中检查此标记:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView.tag == 10 {
///Your scrollview was scrolled
} else {
// Collection view was scrolled
}
}
我有一个 VC,其中包含一个 collectionView
和一个 scrollView
。我把这段代码通过在 scrollView 中滚动来更改 pageController
的当前页面:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
它对 scrollView
很好用,但问题是当我在 collectionView
中滚动时,它会声明并导致 pageController
中不需要的更改!
我该怎么办?
首先,您必须了解有关 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
}
}
谢谢。
if scrollView == yourScrollView{
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
检查实例运行方法是否真的是你的scrollView
您需要检查 scrollViewDidEndDecelerating
中的 scrollView
是滚动视图还是 collection 视图。
只需在执行您拥有的 2 行代码之前添加一个 if scrollView == myScrollView
。
您的代码应该如下所示
函数
scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView == myScrollView {
let pageNumber = round(scrollView.contentOffset.x / scrollView.frame.size.width)
self.pageController.currentPage = Int(pageNumber)
}
}
除了上面发布的答案,您还可以使用视图的标签 属性。
只需在 xib 中或通过代码为您的滚动视图分配一个标签 (Int)。
yourScrollView.tag = 10
并在滚动视图委托方法中检查此标记:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
if scrollView.tag == 10 {
///Your scrollview was scrolled
} else {
// Collection view was scrolled
}
}