如何解决如何根据swift中的标签文本更改CollectionView单元格宽度
我需要像这样根据标签文本更改 collectionview 单元格宽度
为此,我给出了 collectionview 约束
top,leading,trailing,= 10 height = 80
在单元格中,我在 uiview 中放置了标签,我放置了 uiview,因为我需要给角放射状
和代码
class SearchFilterVC: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {
var textArray = ["hbdhwebhj","behgwfhjewgbkfjbe","hbhjs","bdhsbfhegu","gwdgyqwuguq"]
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0
layout.minimumLinespacing = 5
self.collectionView.collectionViewLayout = layout
}
func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int {
return textArray.count
}
func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "searchfiltercollectionViewCell",for: indexPath as IndexPath) as! searchfiltercollectionViewCell
cell.textLabel.text = textArray[indexPath.row]
return cell
}
}
编辑:
o/p
解决方法
collectionView 中的所有项目都采用完全相同的大小,因为您已为 collectionView 的流布局指定了 layout.itemSize
删除layout.itemSize = CGSize(width: self.collectionView.frame.size.width / 2,height: 80)
代码中的其他问题:
-
layout.invalidateLayout()
在ViewDidLoad
中是不必要的 -
if let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
设置minimumInteritemSpacing
和minimumLineSpacing
是不必要的,在它上面的语句中您已经创建了let layout = UICollectionViewFlowLayout()
为什么不简单地设置minimumInteritemSpacing
和 { {1}} 有吗?为什么要使用额外的minimumLineSpacing
?
简单写
if let
您无需指定项目大小,集合视图流布局本质上设置为水平的,因此默认情况下,每个项目将采用与集合视图高度相同的高度,并且如果单元格内只有一个标签,并且如果您已正确设置自动布局约束,标签的内在内容大小将确保单元格获得适当的宽度
无论出于何种原因,如果您决定将标签包装在上面的 let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 5
self.collectionView.collectionViewLayout = layout
逻辑中,只要您正确设置标签的自动布局约束,labell 的内在内容大小将设置 containerView 的宽度,这将反过来有助于适当地设置单元格的宽度,
这里单元格的背景颜色为红色,容器视图为橙色,标签没有背景颜色,我在单元格和视图之间添加了前后间距为10,标签和容器视图的前后间距为5>
编辑:
由于 OP 要求容器视图、标签和单元格之间的约束,我正在更新答案以反映相同
显然
UIView
如果需要,您可以在单元格和容器之间添加顶部和底部约束,但我已将容器视图垂直居中于单元格
它是如何工作的?
标签具有从文本集获取的内在内容大小,视图确实根据其子视图的大小获取其内在大小,因为容器视图中没有子视图,它从标签获取其大小,并且显然,无论大小标签返回视图的宽度增加 10,高度增加 10(5 个前导,5 个尾随,5 个顶部和 5 个底部)最终单元格从其子视图中获取其大小,因为只有一个子视图(容器视图)它获得宽度从容器视图和高度,它从集合视图获取其高度(因为子视图没有提供足够的数据来计算其高度)
如果由于某种原因(可能是因为您有意/无意地设置了一些其他约束,例如在容器视图上添加宽度约束)标签没有正确采用其内在内容大小,您始终可以设置 - - - - - - - - - - - - Cell - - - - - - - - - - - - - - - -
| - - - - - - - - Container View - - - - - - - - |
| | |5 | |
|-10- |-5- Label -5-| -10- |
| | |5 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - |
| |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
和setContentCompressionResistancePriority
在你的单元格从笔尖唤醒的标签上
setContentHuggingPriority
尽管在通常情况下不需要这样做,但如果需要这样做才能获得正确的内在大小,则必须有一些其他限制会阻止标签采用其适当的隐式内在内容大小,如果我在您的位置上宁愿首先检查并修复它。尽管如此,仍无法使用您提供的有限代码进一步调试。
编辑 2:
没有意识到 OP 正在使用 override func awakeFromNib() {
super.awakeFromNib()
self.label.setContentCompressionResistancePriority(.defaultLow,for: .horizontal)
self.label.setContentHuggingPriority(.defaultHigh,for: .horizontal)
}
的自定义实例并且没有将 UICollectionViewFlowLayout
属性设置为 estimatedItemSize
automaticSize
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。