【发布时间】:2019-07-27 22:10:54
【问题描述】:
我有一个水平集合视图。 每个单元格都有一个标签和一个图像。
我面临的问题是label从服务端渲染数据时,有时文字太大,会和图片重叠,因为每个单元格的宽度是固定的。
如何根据集合视图视图单元格包含的数据更改其宽度,以使标签不与图像重叠?
【问题讨论】:
标签: ios uicollectionview swift4 uicollectionviewlayout
我有一个水平集合视图。 每个单元格都有一个标签和一个图像。
我面临的问题是label从服务端渲染数据时,有时文字太大,会和图片重叠,因为每个单元格的宽度是固定的。
如何根据集合视图视图单元格包含的数据更改其宽度,以使标签不与图像重叠?
【问题讨论】:
标签: ios uicollectionview swift4 uicollectionviewlayout
CollectionView 确实有一个返回单元格大小的委托方法。
请继承UICollectionViewDelegateFlowLayout并实现以下方法。
func collectionView(_ collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 30, height: 30)
}
您可以计算标签宽度并将其返回给函数。
希望这会有所帮助。
【讨论】:
先用与文本关联的字体计算标签文本的宽度。
extension String {
func size(with font: UIFont) -> CGSize {
let fontAttribute = [NSAttributedString.Key.font: font]
let size = self.size(withAttributes: fontAttribute)
return size
}
}
在collectionView(_, collectionViewLayout:_, sizeForItemAt)中返回计算出的宽度和collectionView的高度
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
// Note: Margins are spaces around the cell
// model[indexPath.row].text is the text of label to be shown
let newWidth = model[indexPath.row].text.size(with: labelFont!).width + margins + imageView.width
return CGSize(width: newWidth, height: collectionView.bounds.height)
}
注意:
别忘了确认你的 viewController 到UICollectionViewDataSource, UICollectionViewDelegateFlowLayout。
【讨论】: