UICollectionView横向滚动无法滚动到最后一项问题求助
UICollectionView横向滚动最后一页元素无法滚动到的解决方案
问题分析
你的数据共10个元素,每页显示3个,最后一页仅1个元素。当前布局下每个cell宽度为collectionView.bounds.width/3,导致collectionView的总内容宽度为10*(width/3)≈3.33*width,而分页滚动的每页宽度是collectionView自身宽度。由于内容总宽度不足4倍的collectionView宽度,无法滚动到让最后一个元素单独占据一页的位置,同时页码计算逻辑也存在错误。
修复步骤
1. 修正页码计算逻辑
当前willDisplay方法里直接用indexPath.row设置页码,会导致页码与实际页数不符,需要改为按每页元素数量计算:
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { benefitControl.currentPage = indexPath.row / 3 }
2. 调整contentInset补全最后一页宽度
在视图布局完成后,给collectionView右侧添加足够的内边距,让总可滚动范围覆盖完整的最后一页:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let itemsPerPage = 3 let remainingItems = benefitIcons.count % itemsPerPage guard remainingItems > 0 else { benefitCollection.contentInset = .zero return } let pageWidth = benefitCollection.bounds.width let lastPageContentWidth = CGFloat(remainingItems) * (pageWidth / CGFloat(itemsPerPage)) let insetRight = pageWidth - lastPageContentWidth benefitCollection.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: insetRight) }
3. 修正滚动时的页码计算
加入contentInset的影响,确保滚动时页码计算准确:
func scrollViewDidScroll(_ scrollView: UIScrollView) { let offSet = scrollView.contentOffset.x + scrollView.contentInset.left let width = scrollView.frame.width let horizontalCenter = width / 2 benefitControl.currentPage = Int(offSet + horizontalCenter) / Int(width) }
4. 确保分页功能开启
检查collectionView的分页设置,确保开启分页:
// 在collectionView初始化或viewDidLoad中添加 benefitCollection.isPagingEnabled = true benefitCollection.showsHorizontalScrollIndicator = false
原理说明
通过添加右侧内边距,让collectionView的总可滚动宽度扩展为完整的页数×每页宽度,这样分页滚动就能到达最后一页的位置,同时修正后的页码计算逻辑能正确对应实际页数。
内容的提问来源于stack exchange,提问作者Alan Muñoz
相关产品推荐
相关产品推荐

