您好我需要帮助通过UICollectionViewFlowLayout集中我的集合视图单元格。我的最终目标是让第一个细胞位于中间,让其他细胞在中间对齐。谢谢!
我找到了这个"解决方案"在SO但它似乎无法正常工作。
class CenterAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElementsInRect(rect)
// Constants
let leftPadding: CGFloat = 8
let interItemSpacing: CGFloat = 5
// Tracking values
var leftMargin: CGFloat = leftPadding // Modified to determine origin.x for each item
var maxY: CGFloat = -1.0 // Modified to determine origin.y for each item
var rowSizes: [[CGFloat]] = [] // Tracks the starting and ending x-values for the first and last item in the row
var currentRow: Int = 0 // Tracks the current row
attributes?.forEach { layoutAttribute in
// Each layoutAttribute represents its own item
if layoutAttribute.frame.origin.y >= maxY {
// This layoutAttribute represents the left-most item in the row
leftMargin = leftPadding
// Register its origin.x in rowSizes for use later
if rowSizes.count == 0 {
// Add to first row
rowSizes = [[leftMargin, 0]]
} else {
// Append a new row
rowSizes.append([leftMargin, 0])
currentRow += 1
}
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + interItemSpacing
maxY = max(layoutAttribute.frame.maxY, maxY)
// Add right-most x value for last item in the row
rowSizes[currentRow][1] = leftMargin - interItemSpacing
}
// At this point, all cells are left aligned
// Reset tracking values and add extra left padding to center align entire row
leftMargin = leftPadding
maxY = -1.0
currentRow = 0
attributes?.forEach { layoutAttribute in
// Each layoutAttribute is its own item
if layoutAttribute.frame.origin.y >= maxY {
// This layoutAttribute represents the left-most item in the row
leftMargin = leftPadding
// Need to bump it up by an appended margin
let rowWidth = rowSizes[currentRow][1] - rowSizes[currentRow][0] // last.x - first.x
let appendedMargin = (collectionView!.frame.width - leftPadding - rowWidth - leftPadding) / 2
leftMargin += appendedMargin
currentRow += 1
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + interItemSpacing
maxY = max(layoutAttribute.frame.maxY, maxY)
}
return attributes
}
答案 0 :(得分:2)
确保您的视图控制器是集合视图的委托,并从UICollectionViewDelegateFlowLayout
实现以下方法:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
let sideInset = (collectionView.frame.size.width - myCollectionViewCellSize.width) / 2
return UIEdgeInsets(top: 0, left: sideInset, bottom: 0, right: sideInset)
}
答案 1 :(得分:0)
使用UICollectionViewDelegateFlowLayout,有方法collectionView:collectionViewLayout:sizeForItemAtIndexPath。
在那里你可以定义你想要多少边距(让我们说这个例子它是一个定义为10.0的变量),只需对你的宽度做一些计算:
let width = collectionView.frame.size.width - (margin * 2)
然后从那里返回你的宽度和身高的CGSize。
您的应用是否支持多种布局(纵向/横向以及iPad上的多任务处理)?不要忘记同时实现willTransitionToTraitCollection和viewWillTransitionToSize,因为你的视图宽度都会发生变化,你也应该更新你的单元格。