iOS 8 GM 不更新集合视图的约束

Posted

技术标签:

【中文标题】iOS 8 GM 不更新集合视图的约束【英文标题】:iOS 8 GM does not update constraints on collection views 【发布时间】:2014-09-09 20:52:56 【问题描述】:

在 Xcode 6 Beta 7 和之前的所有版本中,我有一个集合视图,当 iPad 在横向和纵向之间旋转时,它会更新其对单元格的约束。现在,它根本没有更新,实际上它看起来就像我将它留在 XIB 中的样子,这对我来说意味着它根本没有更新。看来我正在使用的可重用视图正在正确更新,但单元格肯定不是。

还有其他人遇到过这个问题吗?有人对如何克服它有任何想法吗?

我使用的是 ios 7.1 模拟器。

【问题讨论】:

这似乎在 8GM sim 上运行良好,因此问题似乎仅限于 7.1。我会检查 7.0 的 sim。 我也在 7.1 设备和模拟器上看到它。 ios8模拟器正常工作 已确认,这不适用于 iOS 7.1 或 7.0.3 SIM。它也无法在装有 iOS 7.1.2 的 iPad Air 上运行。 【参考方案1】:

您需要创建 UICollectionViewCell 的子类,并将该子类作为所有单元格的超类。

例子:

@interface MDTCollectionViewCell : UICollectionViewCell
@end

@implementation MDTCollectionViewCell

- (void)setBounds:(CGRect)bounds 
    [super setBounds:bounds];
    self.contentView.frame = bounds;


@end

【讨论】:

如果不想继承 UICollectionViewCell 也可以在返回单元格之前在方法 cellForItemAtIndexPath 上设置 contentView 框架 @pablobart 是的,这实际上是 Apple Dev Forums 中 cyphers72 建议的原始修复,但这个解决方案更适合我的用例 :) 感谢您的解决方案。我有完全相同的问题。我现在临时使用 XCode 6 Beta 7。 感谢您的解决方案...我遇到了同样的问题,并且试图弄清楚为什么仅在 iOS 7.1 上会发生这种情况感到沮丧。 谢谢!你拯救了我的一天!【参考方案2】:

覆盖自定义单元格的 layoutSubviews 作为临时修复:

override func layoutSubviews() 
    contentView.frame = bounds
    super.layoutSubviews()

【讨论】:

这在 Xcode 6 上对我有用,使用 swift...有什么想法不使用它时会出现什么问题? 当与 dispatch_async 混合并在 reloadData() 之后调用它时,这个对我来说实际上是有用的(我使用 CollectionView)【参考方案3】:

我想出的解决方法是使用 8.0 模拟器在 sim 中进行测试,并使用 Xcode Beta 7 构建可部署。当我使用 Beta 7 构建时,应用程序在使用 iOS 7 的设备上运行时没有此问题。但是,这对部署到应用商店的任何人都没有帮助,因此如果此解决方法不适用于您的情况,我深表歉意。

【讨论】:

【参考方案4】:

在我添加的 UICollectionViewCell 类中

override func layoutSubviews() 
    contentView.frame = bounds
    super.layoutSubviews()

我用这段代码刷新

dispatch_async(dispatch_get_main_queue(),  () -> Void in
    // in this case vController is UICollectionView
    self.vController.reloadData()
    self.vController.layoutSubviews()
)

【讨论】:

以上是关于iOS 8 GM 不更新集合视图的约束的主要内容,如果未能解决你的问题,请参考以下文章

自动布局 UICollectionView iOS 8

在 iOS 上创建 Nx2 集合视图

如何在 swift 3.0 中制作 5*8 集合视图 [关闭]

iOS中的自定大小集合视图单元格

另一个集合视图中集合视图单元格的约束

在 ios 8 中将集合或表格视图或自定义视图添加到滚动视图