【问题标题】:Change frame of UIView in UICollectionViewCell in cellForItemAtIndexPath在 cellForItemAtIndexPath 中的 UICollectionViewCell 中更改 UIView 的框架
【发布时间】: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,我决定只更新视图的约束,它工作得很好(当然)。您想再次提交您的建议作为答案,以便我将其标记为正确吗?

标签: ios objective-c uicollectionview frame uicollectionviewcell


【解决方案1】:

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

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

干杯!

嗯嗯

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

【讨论】:

  • 这很有趣。我有一个 UIImageView 作为上述 UIView 的子视图,它 正在 完美地更新其框架,正如 cellForItemAtIndexPath 中所预期的那样。所以奇怪的是,有些视图的框架会更新得很好,而其他的则不会,不是吗?另外,为什么一旦细胞被重复使用,它最终会起作用?
  • 这个答案是错误的。您可以更新在故事板中创建的集合视图单元格内的视图,就像任何其他视图一样。
  • UITableViewCell 遇到了同样的问题。让我们知道这是否解决了它@shibbowhat
  • 当然可以(但可以解决),但您可以更改单元格子视图的框架。问题可能是因为自动布局。如果您使用自动布局,则应通过修改其约束来更改视图的大小或位置,而不是直接更改其框架。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
相关资源
最近更新 更多