>我有一个带有自定义 2 列布局的集合视图控制器:
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 个(我试图玩一些部分和部分中的项目,但它没有帮助。我从其他主题中发现,默认分页应该是按屏幕,而不是按单元格(在我的例子中是一列(。我做错了什么?
如果我理解你的问题,我认为你本身并没有做错任何事。集合视图的内容大小(部分(由项目大小决定。现在,这大约是 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)
}
请参阅此答案 如何扩展 UI 启用分页时查看内容大小?.它有点旧,但我认为它正在尝试解决同样的问题。
首先 UICollectionViewFlowLayout 不支持分页
我认为有两种解决方案
第一
使用UIScrollView 只需使用分页选项即可添加 7 个项目
第二
使用 UICollectionView 修改您的 UI CollectionViewFlowLayout
子类 UICollectionViewFlowLayout 以支持分页
例如(
在雨燕3中
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