在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架

Posted

技术标签:

【中文标题】在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架【英文标题】:Change frame of UIView in UICollectionViewCell in cellForItemAtIndexPath 【发布时间】:2014-09-15 23:00:39 【问题描述】:

我的问题与这个问题非常相似,尽管选择的正确答案(只是使用标签)对我不起作用(也没有任何其他答案):Changing label position in UICollectionViewCell。

我有一个带有自定义 UICollectionViewCell 的 UICollectionView。该单元格中有一个 UIView,通过 IBOutlet 属性引用。我只是试图在cellForItemAtIndexPath 方法中更改框架,虽然 UIView is 的框架实际上已更改,但它随后被忽略或不兑现。

但是,一旦 UICollectionView 稍微滚动并开始重用单元格,重用的单元格确实会遵守对 UIView 框架的先前更改,并且 UIView 看起来就像它应该的那样。因此,出于某种原因,第一次为特定单元调用 cellForItemAtIndexPath 时,会忽略帧更改,但随后会在重用该单元后兑现。

实际上,我刚刚注意到的更奇怪的是,重复使用的单元格具有先前更改的框架的 size,但保留了原始 origin,恰好是 (0, 0),尽管我正在尝试将其更新为 (0, 50)。

更改 UIView 的其他属性可以正常工作,例如更改背景颜色。可能会发生什么阻止 UIView 的框架最初更改?

【问题讨论】:

你是如何改变框架的?你在使用自动布局吗? 感谢您在此处和下方提供的反馈。我正在使用setFrame 更改框架,并且我正在使用自动布局。下面你提到使用自动布局时,直接更新约束而不是框架更好?您认为cellForItemAtIndexPath 中所做的框架更改是否会被后续的自动布局操作覆盖(......但随后出于任何原因在单元重用方面受到尊重)? 我不确定,但如果您使用自动布局,则绝对不应该设置框架。您可以尝试将其关闭,看看是否能解决问题,但我会坚持使用自动布局并更改您的代码以调整这些约束。 谢谢@rdelmar,我决定只更新视图的约束,它工作得很好(当然)。您想再次提交您的建议作为答案,以便我将其标记为正确吗? 【参考方案1】:

UICollectionViewCell 不会更新在故事板或 xib 文件中定义的视图的框架。

您必须在自定义单元格 initWithFrame 和/或 awakeFromXib 文件中以编程方式创建视图。

干杯!

嗯嗯

我可能弄错了。我知道这对于 UITableViewCell 是正确的 Cannot update UI object's frame in UITableViewCell

【讨论】:

这很有趣。我有一个 UIImageView 作为上述 UIView 的子视图,它 正在 完美地更新其框架,正如 cellForItemAtIndexPath 中所预期的那样。所以奇怪的是,有些视图的框架会更新得很好,而其他的则不会,不是吗?另外,为什么一旦细胞被重复使用,它最终会起作用? 这个答案是错误的。您可以更新在故事板中创建的集合视图单元格内的视图,就像任何其他视图一样。 @rdelmar 请参考***.com/questions/12872987/… UITableViewCell 遇到了同样的问题。让我们知道这是否解决了它@shibbowhat 当然可以(但可以解决),但您可以更改单元格子视图的框架。问题可能是因为自动布局。如果您使用自动布局,则应通过修改其约束来更改视图的大小或位置,而不是直接更改其框架。

以上是关于在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架的主要内容,如果未能解决你的问题,请参考以下文章

cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发

集合视图:可以手动触发 cellForItemAtIndexPath 吗?

collectionView:cellForItemAtIndexPath: 永远不会被调用

使用 UICollectionViewFlowLayout / UICollectionViewLayout 子类,不会在正确的时间调用 CellForItemAtIndexPath

在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架

旋转时多次调用方法 collectionview(cellForItemAtIndexPath)