我怎么知道数据在 collectionView 中显示为 3 个水平行?
How do i know data is displayed in 3 horizontal rows in collectionView?
我有包含 6 个对象的数组,显示如下。
我需要的是我想让水平行数为 3
我怎样才能通过集合视图获得它..?
我正在使用以下代码将单元格设置在屏幕中央
class CollectionViewRow {
var attributes = [UICollectionViewLayoutAttributes]()
var spacing: CGFloat = 0
init(spacing: CGFloat) {
self.spacing = spacing
}
func add(attribute: UICollectionViewLayoutAttributes) {
attributes.append(attribute)
}
var rowWidth: CGFloat {
return attributes.reduce(0, { result, attribute -> CGFloat in
return result + attribute.frame.width
}) + CGFloat(attributes.count - 1) * spacing
}
func centerLayout(collectionViewWidth: CGFloat) {
let padding = (collectionViewWidth - rowWidth) / 2
var offset = padding
for attribute in attributes {
attribute.frame.origin.x = offset
offset += attribute.frame.width + spacing
}
}
}
class UICollectionViewCenterLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let attributes = super.layoutAttributesForElements(in: rect) else {
return nil
}
var rows = [CollectionViewRow]()
var currentRowY: CGFloat = -1
for attribute in attributes {
if currentRowY != attribute.frame.midY {
currentRowY = attribute.frame.midY
rows.append(CollectionViewRow(spacing: 10))
}
rows.last?.add(attribute: attribute)
}
rows.forEach { [=10=].centerLayout(collectionViewWidth: collectionView?.frame.width ?? 0) }
return rows.flatMap { [=10=].attributes }
}
}
如果您正在创建自己的布局子类,那么您可以为其添加一个值,例如...
class UICollectionViewCenterLayout: UICollectionViewFlowLayout {
var numberOfRows: Int = 0
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let attributes = super.layoutAttributesForElements(in: rect) else {
return nil
}
var rows = [CollectionViewRow]()
var currentRowY: CGFloat = -1
for attribute in attributes {
if currentRowY != attribute.frame.midY {
currentRowY = attribute.frame.midY
rows.append(CollectionViewRow(spacing: 10))
}
rows.last?.add(attribute: attribute)
}
rows.forEach { [=10=].centerLayout(collectionViewWidth: collectionView?.frame.width ?? 0) }
// add this bit
self.numberOfRows = rows.count
return rows.flatMap { [=10=].attributes }
}
}
然后在您的视图中,您可以访问布局(或者最好仍将其存储为 var)并从中获取 numberOfRows
。
if let layout = self.collectionView.collectionViewLayout as? namesLayout {
print("numberOfRows===\(layout.numberOfRows)")
rowsCount = layout.numberOfRows
}
此外...不要将您自己的布局命名为 UICollectionView...
,只需将其命名为 CenterLayout
或 NamesLayout
或其他名称即可。 :D 让它更短。
我有包含 6 个对象的数组,显示如下。 我需要的是我想让水平行数为 3 我怎样才能通过集合视图获得它..?
我正在使用以下代码将单元格设置在屏幕中央
class CollectionViewRow {
var attributes = [UICollectionViewLayoutAttributes]()
var spacing: CGFloat = 0
init(spacing: CGFloat) {
self.spacing = spacing
}
func add(attribute: UICollectionViewLayoutAttributes) {
attributes.append(attribute)
}
var rowWidth: CGFloat {
return attributes.reduce(0, { result, attribute -> CGFloat in
return result + attribute.frame.width
}) + CGFloat(attributes.count - 1) * spacing
}
func centerLayout(collectionViewWidth: CGFloat) {
let padding = (collectionViewWidth - rowWidth) / 2
var offset = padding
for attribute in attributes {
attribute.frame.origin.x = offset
offset += attribute.frame.width + spacing
}
}
}
class UICollectionViewCenterLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let attributes = super.layoutAttributesForElements(in: rect) else {
return nil
}
var rows = [CollectionViewRow]()
var currentRowY: CGFloat = -1
for attribute in attributes {
if currentRowY != attribute.frame.midY {
currentRowY = attribute.frame.midY
rows.append(CollectionViewRow(spacing: 10))
}
rows.last?.add(attribute: attribute)
}
rows.forEach { [=10=].centerLayout(collectionViewWidth: collectionView?.frame.width ?? 0) }
return rows.flatMap { [=10=].attributes }
}
}
如果您正在创建自己的布局子类,那么您可以为其添加一个值,例如...
class UICollectionViewCenterLayout: UICollectionViewFlowLayout {
var numberOfRows: Int = 0
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let attributes = super.layoutAttributesForElements(in: rect) else {
return nil
}
var rows = [CollectionViewRow]()
var currentRowY: CGFloat = -1
for attribute in attributes {
if currentRowY != attribute.frame.midY {
currentRowY = attribute.frame.midY
rows.append(CollectionViewRow(spacing: 10))
}
rows.last?.add(attribute: attribute)
}
rows.forEach { [=10=].centerLayout(collectionViewWidth: collectionView?.frame.width ?? 0) }
// add this bit
self.numberOfRows = rows.count
return rows.flatMap { [=10=].attributes }
}
}
然后在您的视图中,您可以访问布局(或者最好仍将其存储为 var)并从中获取 numberOfRows
。
if let layout = self.collectionView.collectionViewLayout as? namesLayout {
print("numberOfRows===\(layout.numberOfRows)")
rowsCount = layout.numberOfRows
}
此外...不要将您自己的布局命名为 UICollectionView...
,只需将其命名为 CenterLayout
或 NamesLayout
或其他名称即可。 :D 让它更短。