swift中的自定义集合视图单元格
Posted
技术标签:
【中文标题】swift中的自定义集合视图单元格【英文标题】:Custom Collection view cell in swift 【发布时间】:2017-01-25 16:44:09 【问题描述】:我是 ios 开发新手,我正在开发一个购买/销售应用程序。我正在尝试制作一个不硬设置集合视图单元格大小的集合视图。相反,这将取决于发布他们正在销售的东西的用户。我意识到通过硬编码盒子的大小,一切看起来都是“四四方方”的。任何建议将不胜感激。
【问题讨论】:
所以你想动态调整单元格的框架? 你应该看看 UICollectionViewFlowLayoutDelegate 的方法。 @EricZhang 没错 【参考方案1】:假设您使用的是默认流布局,有两种选择:
如果您满足以下条件,您可以拥有自行调整大小的单元格:
在你的单元格和它的子视图之间定义明确的约束;
不要为图像视图定义固定的宽度/高度约束;
设置estimatedItemSize
的UICollectionViewFlowLayout
:
let layout = collectionView?.collectionViewLayout as! UICollectionViewFlowLayout
layout.estimatedItemSize = CGSize(width: 100, height: 100)
然后,自动布局将调整图像视图的大小以适合图像,然后单元格将相应地调整自身大小以适应该图像。因此,例如,对于一些随机图像大小,标准流程布局会自动为我们调整单元格的大小:
现在这是一个简单的单元格,在图像视图中具有随机大小的纯色图像,并且约束为 H:|[imageView]|
和 V:|[imageView]|
,但同样的想法也适用于复杂的单元格。您只需要确保单元格的顶部/底部和前导/尾随约束是明确的。
请注意,如果您依赖图像视图的隐式大小,这当然假定图像的大小已经针对设备保持一致。如果没有,您可能需要为图像视图的高度/宽度创建约束,为此包含 @IBOutlet
引用,然后在 cellForRowAtIndexPath
方法中为这些约束设置 constant
。但是,为了有效地管理内存,您通常希望将图像缩小到适当的大小,因此通常没有必要这样做。
或者,您可以指定流布局的委托(UICollectionViewDelegateFlowLayout
),然后实现sizeForItemAt:
。
【讨论】:
感谢分享,它确实帮助我掌握了 Collectionveiwlayout。所以我希望单元格的宽度保持不变,但高度可以动态改变。我应该为每个盒子设置宽度限制吗? 是的,你可以设置宽度限制。但是,我不会依赖自动布局结合这个固定约束加上计算图像视图的高度隐含地从图像尺寸和这个固定宽度约束的组合。 (它实际上做得非常好,但并不完美。)所以,如果你要拥有一个固定的宽度约束,那么我会在高度约束中添加一个出口并相应地设置它为constant
。诀窍在于动态高度约束的优先级应低于 1000(甚至 999 就足够了)。
另一种选择是失去基于约束的单元格高度并回退到sizeForItemAt:
。
基于约束的解决方案见gist.github.com/robertmryan/6357d2b985f93c76c2d85c662be5a06a以上是关于swift中的自定义集合视图单元格的主要内容,如果未能解决你的问题,请参考以下文章