ios 检测 UICollectionView 中的页面变化
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29507675/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Detect page change in UICollectionView
提问by Ahsan Ebrahim
I tried finding this question for a while but could not find this problem's answer.
My problem is that i have a UICollectionView
and the Scroll Direction is Horizontal
with Paging Enabled
. My problem is that i want to keep the tack of the current page number on which the user is, so i created an int
variable and now want to add or subtract it by 1 each time the user swipes right or left. I tried using scrollView
's delegate
我试图找到这个问题一段时间,但找不到这个问题的答案。我的问题是,我有一个UICollectionView
和滚动方向是Horizontal
有Paging Enabled
。我的问题是我想保留用户所在的当前页码的粘性,所以我创建了一个int
变量,现在每次用户向右或向左滑动时都想加或减 1。我尝试使用scrollView
的委托
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
but when the user swipes right or left, it is called as many number of the times as the number of columns on a page in the UICollectionView
plus it wont let me know that whether the user went to the next page or the previous one.
但是当用户向右或向左滑动时,它被调用的次数与页面上的列数一样多,UICollectionView
它不会让我知道用户是转到下一页还是上一页。
回答by itsji10dra
Use :
用 :
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = collectionView.frame.size.width;
float currentPage = collectionView.contentOffset.x / pageWidth;
if (0.0f != fmodf(currentPage, 1.0f))
{
pageControl.currentPage = currentPage + 1;
}
else
{
pageControl.currentPage = currentPage;
}
NSLog(@"Page Number : %ld", (long)pageControl.currentPage);
}
And if you are not using any pageControl, then ceil(currentPage)
will be your current page number.
如果您没有使用任何 pageControl,ceil(currentPage)
则将是您当前的页码。
回答by Ahmed Safadi
Swift 3 Xcode 8.2
斯威夫特 3 Xcode 8.2
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let x = scrollView.contentOffset.x
let w = scrollView.bounds.size.width
let currentPage = Int(ceil(x/w))
// Do whatever with currentPage.
}
回答by Andrej
Based on @Shankar BS 's answer I've implemented it like this in Swit. Keep in mind that CollectionViewDelegate conforms to ScrollViewDelegate:
基于@Shankar BS 的回答,我已经在 Swit 中实现了它。请记住,CollectionViewDelegate 符合 ScrollViewDelegate:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageWidth = scrollView.frame.size.width
let page = Int(floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1)
print("page = \(page)")
}
回答by Shankar BS
You can get the current page like below, index will be from 0
to (total page - 1)
您可以获得如下所示的当前页面,索引将从0
到(total page - 1)
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
NSLog(@"Current page -> %d",page);
}
回答by Jonni ?kesson
Swift 2.2
斯威夫特 2.2
func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
let x = collectionView.contentOffset.x
let w = collectionView.bounds.size.width
let currentPage = Int(ceil(x/w))
print("Current Page: \(currentPage)")
}
回答by álvaro Agüero
SWIFT 5
快速 5
For example, put this method in your ViewController with extensions UICollectionViewDelegate,UICollectionViewDataSource
例如,将此方法放在带有扩展 UICollectionViewDelegate,UICollectionViewDataSource 的 ViewController 中
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageWidth = scrollView.frame.size.width
let page = Int(floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1)
print("page = \(page)")
}
回答by wcoder
Xamarin.iOS:
Xamarin.iOS:
You can override DecelerationEnded
method of UICollectionViewDelegate
or subscribe to DecelerationEnded
event of UICollectionView
(custom delegate will be used under the hood).
您可以覆盖DecelerationEnded
方法UICollectionViewDelegate
或订阅DecelerationEnded
事件UICollectionView
(自定义委托将在后台使用)。
public override void DecelerationEnded(UIScrollView scrollView)
{
var x = scrollView.ContentOffset.X;
var w = scrollView.Bounds.Size.Width;
var currentPage = Math.Ceiling(x / w);
// use currentPage here
}