gaz*_*ola 36 objective-c ios ios6
在研究iOS6的新功能时,我遇到了一个关于UICollectionView的问题.
我目前正在使用Flow布局测试它,滚动方向设置为水平,滚动和分页启用.我将其大小设置为与我的自定义单元格完全相同,因此它可以一次显示一个,并通过向侧面滚动,用户将看到其他现有单元格.
它完美地运作.
现在我想将UIPageControl添加到我创建的集合视图中,这样就可以显示哪个单元格可见以及有多少单元格.
构建页面控件非常简单,定义了frame和numberOfPages.
我所遇到的问题,如问题标题,是如何在集合视图中获取当前可见的单元格,因此它可以更改页面控件的currentPage.
我已经尝试过委托方法,比如cellForItemAtIndexPath,但它是为了加载单元格而不是显示它们.当一个单元格不再显示时,didEndDisplayingCell触发,这是我需要的相反事件.
它似乎-visibleCells和-indexPathsForVisibleItems,集合视图方法,对我来说是正确的选择,但我碰到了另一个问题.什么时候触发它们?
在此先感谢,希望我能让自己清楚明白,这样你们才能理解我!
Sen*_*doa 91
你必须自己设置UIScrollViewDelegate并实现这样的scrollViewDidEndDecelerating:方法:
Objective-C的
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = self.collectionView.frame.size.width;
self.pageControl.currentPage = self.collectionView.contentOffset.x / pageWidth;
}
Run Code Online (Sandbox Code Playgroud)
迅速
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let pageWidth = self.collectionView.frame.size.width
pageControl.currentPage = Int(self.collectionView.contentOffset.x / pageWidth)
}
Run Code Online (Sandbox Code Playgroud)
小智 18
我也挣扎了一段时间,然后建议我查看UICollectionView的父类.其中一个恰好是UIScrollView,如果你把自己设置为UIScrollViewDelegate,你可以访问非常有用的方法,例如scrollViewDidEndDecelerating,这是一个更新UIPageControl的好地方.
Nik*_*kov 17
我建议稍微调整一下计算和处理,因为它会在任何滚动位置立即更新页面控制,并且准确性更高.
下面的解决方案适用于任何滚动视图或它的子类(UITableView UICollectionView和其他)
在viewDidLoad方法中写这个
scrollView.delegate = self
Run Code Online (Sandbox Code Playgroud)
然后使用您的语言代码:
斯威夫特3
func scrollViewDidScroll(_ scrollView: UIScrollView)
{
let pageWidth = scrollView.frame.width
pageControl.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特2:
func scrollViewDidScroll(scrollView: UIScrollView)
{
let pageWidth = CGRectGetWidth(scrollView.frame)
pageControl.currentPage = Int((scrollView.contentOffset.x + pageWidth / 2) / pageWidth)
}
Run Code Online (Sandbox Code Playgroud)
目标C.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat pageWidth = self.collectionView.frame.size.width;
self.pageControl.currentPage = (self.collectionView.contentOffset.x + pageWidth / 2) / pageWidth;
}
Run Code Online (Sandbox Code Playgroud)
使用较少代码的另一个选项是使用可见项索引路径并设置页面控件.
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
self.pageControl.currentPage = [[[self.collectionView indexPathsForVisibleItems] firstObject] row];
}
Run Code Online (Sandbox Code Playgroud)
int pages = floor(ImageCollectionView.contentSize.width/ImageCollectionView.frame.size.width); [pageControl setNumberOfPages:pages];
添加ScrollView Delegate方法,
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = ImageCollectionView.frame.size.width;
float currentPage = ImageCollectionView.contentOffset.x / pageWidth;
if (0.0f != fmodf(currentPage, 1.0f))
{
pageControl.currentPage = currentPage + 1;
}
else
{
pageControl.currentPage = currentPage;
}
NSLog(@"finishPage: %ld", (long)pageControl.currentPage);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31170 次 |
| 最近记录: |