我有来自服务器的文字,动态地我设置了集合视图,每个单元格显示一个字母。
但如果这个词太长,那么一切都会缩小。
我希望每个字母都适合集合视图,这个单词应该只适合一行,所以我使用了:
CommonModule
答案 0 :(得分:0)
答案 1 :(得分:0)
我认为您需要的是保持细胞左对齐,固定细胞宽度和细胞之间的填充。字母很少时不是动态填充。你不希望“a b c”成为“a ........ b ........ c”。解决方案是在单元格之间设置最大填充,遗憾的是,没有使用默认集合视图布局的此类设置。你需要定义一个:
class MaxSpacingCollectionViewFlowLayout : UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let attributes = super.layoutAttributesForElements(in: rect) else {
return nil
}
if attributes.count <= 0 { return attributes }
let firstCellOriginX = attributes[0].frame.origin.x
for i in 1..<attributes.count {
let currentLayoutAttributes = attributes[i];
if currentLayoutAttributes.frame.origin.x == firstCellOriginX {
continue //first cell of a new row
}
let prevLayoutAttributes = attributes[i - 1]
let prevOriginMaxX = prevLayoutAttributes.frame.maxX
if currentLayoutAttributes.frame.origin.x - prevOriginMaxX > 8 { // 8 here is the max padding
var frame = currentLayoutAttributes.frame
frame.origin.x = prevOriginMaxX + 8
currentLayoutAttributes.frame = frame
}
}
return attributes
}
}
然后替换默认布局:
let collectionView = UICollectionView()
//......
collectionView.collectionViewLayout = MaxSpacingCollectionViewFlowLayout()
最后,委托方法sizeForItemAt
可以简单地返回固定宽度:
return CGSize(width : 35, height : 35)
答案 2 :(得分:0)
试试这个:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let size: CGSize = self.letters[indexPath.row].size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 18.0)])//18.0 replace it with your label font size.
let height = collectionView.frame.size.height / 2
return CGSize(width: size.width+2 , height: height)
}