在 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 的框架