Swift:按屏幕分页不适用于两列布局集合视图
Posted
技术标签:
【中文标题】Swift:按屏幕分页不适用于两列布局集合视图【英文标题】:Swift: paging by screen doesn't work for two column layout collection view 【发布时间】:2017-02-08 04:48:44 【问题描述】:我有一个带有自定义 2 列布局的 collectionview 控制器:
class CVLayout: UICollectionViewFlowLayout
override init()
super.init()
setupLayout()
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
setupLayout()
override var itemSize: CGSize
set
get
let numberOfColumns: CGFloat = 2
let itemWidth = (self.collectionView!.frame.width - (numberOfColumns - 1)) / numberOfColumns
return CGSize(width: itemWidth, height: itemWidth)
func setupLayout()
minimumInteritemSpacing = 1
minimumLineSpacing = 1
scrollDirection = .horizontal
在我的控制器中我设置了
class ViewController: UICollectionViewController
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
collectionView?.isScrollEnabled = true
collectionView?.isPagingEnabled = true
我有 7 个项目,屏幕上显示了 6 个项目,我希望在下一页看到一个项目,但我看到的是 4 个(上一页中的 3 个) 我试图玩一些部分和部分中的项目,但这没有帮助。我从其他主题中发现的是,默认分页应该是按屏幕,而不是按单元格(在我的例子中是一列)。我究竟做错了什么?
【问题讨论】:
【参考方案1】:如果我理解您的问题,我认为您本身并没有做错什么。集合视图的内容大小(部分)由项目大小决定。现在,这大约是 3 个项目(或一页半内容)的宽度。我认为您需要覆盖集合视图的内容大小属性以反映整页内容(宽度)以达到预期的效果。
override var collectionViewContentSize: CGSize
if let collectionView = collectionView
let numberOfItems = collectionView.numberOfItems(inSection: 0)
let pages = numberOfItems/2
let size = CGSize(width: collectionView.frame.width * CGFloat(pages), height: collectionView.frame.height)
return size
return CGSize(width: 0, height: 0)
请看这个答案How to expand UICollectionView contentSize when paging enable?。它有点旧,但我认为它正在尝试解决同样的问题。
【讨论】:
这就是我想要的!我稍微更改了您的代码(计算页数)。而且我还必须减去导航栏的高度,否则我的收藏视图会在滚动时跳起来。谢谢!【参考方案2】:首先 UICollectionViewFlowLayout 不支持分页
我认为有两种解决方案
第一
使用 UIScrollView 只需通过分页选项添加 7 个项目
秒
使用 UICollectionView 修改你的 UICollectionViewFlowLayout
子类 UICollectionViewFlowLayout 以支持分页
例如)
在 Swift3 中
class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint
var offsetAdjustment = CGFloat.greatestFiniteMagnitude
let horizontalOffset = proposedContentOffset.x
let targetRect = CGRect(x: proposedContentOffset.x, y: 0, width: self.collectionView!.bounds.size.width, height: self.collectionView!.bounds.size.height)
for layoutAttributes in super.layoutAttributesForElements(in: targetRect)!
let itemOffset = layoutAttributes.frame.origin.x
if abs(itemOffset - horizontalOffset) < abs(offsetAdjustment)
offsetAdjustment = itemOffset - horizontalOffset
return CGPoint(x: proposedContentOffset.x + offsetAdjustment, y: proposedContentOffset.y)
更多信息可以搜索UICollectionViewFlowLayout with Paging
【讨论】:
以上是关于Swift:按屏幕分页不适用于两列布局集合视图的主要内容,如果未能解决你的问题,请参考以下文章