UICollectionView 的典型流程是“移动,然后向下”
我很好奇是否有办法颠倒“流”的顺序,即“先向下”(最大行数,然后穿过。)类似于这样:
我很好奇是否有一种方法可以反转“流”的顺序,即“先向下”(对于最大行,然后穿过。)
没有办法以UICollectionFlowLayout
列优先顺序排列单元格 - 它首先“流动”单元格,然后向下。如果您考虑一下,这是有道理的——UICollectionFlowLayout
在开始第二列之前,如何知道在第一列中放置了多少个单元格?事实上,它只是在移动到下一行之前放置尽可能多的行。但是由于您希望滚动方向保持垂直,因此没有任何理由停止将单元格添加到第一列。
但是UICollectionView
会很乐意将单元格放置在您喜欢的任何位置 - 您只需创建自己的自定义布局对象来告诉它放置它们的位置。这不必像听起来那样令人生畏……在网格上布置单元格不是火箭科学,而且您的集合布局对象不必像现在这样健壮UICollectionFlowLayout
——它只需要满足您的特定需求。
感谢@Caleb 启发了我。我尝试了以下设置
class ViewController: UIViewController {
let items = ["A", "B", "C", "D", "E"]
// other unnecessary stuff for this demonstration
}
extension ViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if section == 0 {
return ((items.count + 1) / 2) // just ceiling, after dividing by 2
} else if section == 1 {
return items.count - ((items.count + 1) / 2) // calculating the remainder item
} else {
return 0
}
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
var text = "";
if indexPath.section == 0 {
// take the even part
text = items[indexPath.row * 2]
} else {
// take the odd part
text = items[(indexPath.row * 2) + 1]
}
(cell.subviews[0].subviews[0] as? UILabel)?.text = text
return cell
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 2
}
}
我将滚动方向设置为vertical
,输出看起来像。它适用于奇数项目和偶数项目。
显然这不是 OP 正在寻找的。在这里,我使用了两个不同的部分,但 OP 想要在一个部分中制作锯齿形图案。正如@Caleb 整理的那样,这肯定是不可能的,如果不填充宽度,我们就不能在垂直方向上下降。