UICollectionReusableView中的自动布局无法在iOS7上运行,但在iOS8上运行

时间:2015-01-09 11:52:54

标签: objective-c ios7 uicollectionview autolayout uicollectionreusableview

我正在使用与iOS8和iOS7兼容的应用。

我通过继承UICollectionReusableView创建了一个集合视图标头,并且已经使用Interface Builder创建了UI。这是标题界面的模式:

---------------------------- | | | A | | | |---------------------------| | | | B | | | |---------------------------| | | | C | | | ----------------------------

问题

ABC次观看是通过超级视图(UICollectionReusableView)上的前导和尾随链接,并且在iOS8上运行正常。但是在 iOS7 上,当视图布局具有参考大小(宽度为768pt)时,子视图的宽度为1216pt(它应该与superview的宽度相同:768pt)... < / p>

我发现了什么

以下是UICollectionReusableView的约束:

<NSLayoutConstraint:0x7c4196c0 UIView:A.top == HEADER:0x7be52ff0.top>,
<NSLayoutConstraint:0x7c4196f0 HEADER:0x7be52ff0.trailing == UIView:A.trailing>,
<NSLayoutConstraint:0x7c419720 UIView:A.leading == HEADER:0x7be52ff0.leading>,
<NSLayoutConstraint:0x7c4197b0 HEADER:0x7be52ff0.trailing == UIView:B.trailing>,
<NSLayoutConstraint:0x7c419810 UIView:B.top == UIView:A.bottom>,
<NSLayoutConstraint:0x7c419840 UIView:B.leading == HEADER:0x7be52ff0.leading>,
<NSLayoutConstraint:0x7c419870 UIView:C.top == UIView:B.bottom>,
<NSLayoutConstraint:0x7c4198a0 UIView:C.leading == HEADER:0x7be52ff0.leading>,
<NSLayoutConstraint:0x7c4198d0 HEADER:0x7be52ff0.trailing == UIView:C.trailing>,
<NSLayoutConstraint:0x7c419900 HEADER:0x7be52ff0.bottom == UIView:C.bottom>,
<NSLayoutConstraint:0x7be98df0 HEADER:0x7be52ff0.width == 768>,
<NSLayoutConstraint:0x7be98e20 HEADER:0x7be52ff0.height == 512>

以下是通过在控制台中调用layoutSubviews来覆盖UICollectionReusableView [self recursiveDescription]中的[super layoutSubviews]

在致电<HEADER: 0x7be52ff0; baseClass = UICollectionReusableView; frame = (0 0; 768 512); clipsToBounds = YES; layer = <CALayer: 0x7be87300>> | <UIView: A; frame = (0 0; 320 360); autoresize = RM+BM; layer = <CALayer: 0x7be53190>> | | ... | <UIView: B; frame = (0 360; 320 96); autoresize = RM+BM; layer = <CALayer: 0x7be6bc50>> | | ... | <UIView: C; frame = (0 456; 320 56); autoresize = RM+BM; layer = <CALayer: 0x7c417360>> | | ...

之前
[super layoutSubviews]

致电<HEADER: 0x7be52ff0; baseClass = UICollectionReusableView; frame = (0 0; 768 512); clipsToBounds = YES; layer = <CALayer: 0x7be87300>> | <UIView: A; frame = (0 0; 1216 360); autoresize = RM+BM; layer = <CALayer: 0x7be53190>> | | ... | <UIView: B; frame = (0 360; 1216 96); autoresize = RM+BM; layer = <CALayer: 0x7be6bc50>> | | ... | <UIView: C; frame = (0 456; 1216 56); autoresize = RM+BM; layer = <CALayer: 0x7c417360>> | | ...

A

尝试

我试图设置前导和尾随常量相对于没有帮助的保证金。

B致电C并致电[super layoutSubviews]之后,我还尝试手动更改setNeedLayoutAB的相框这些观点。但正如我预期的那样,应用程序崩溃了。

问题

我很难找到原因,因为C,{{1}}和{{1}}次点视图中的子视图并未尝试消费他们的超级视图。

是否有一些调试技术可以帮助我找出这个bug的来源?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

几个小时后,我偶然发现了这个虫子的起源。

我的UICollectionReusableView在我的模型对象填满所有内容后调用[self layoutIfNeeded],并且在设置数据后我在Controller中再次调用它。所以我删除了UICollectionReusableView内的调用,现在在iOS7上运行正常。但我仍然不明白为什么通过多次调用layoutIfNeeded ...

来实现这一点