UICollectionReusableView 中的自动布局不适用于 iOS7 但适用于 iOS8
Auto Layout in UICollectionReusableView not working on iOS7 but working on iOS8
我正在开发与 iOS8 和 iOS7 兼容的应用程序。
我通过子类化 UICollectionReusableView
创建了一个 collection 视图 header,UI 是使用 Interface Builder 创建的。这里是 header 界面的架构:
----------------------------
| |
| A |
| |
|---------------------------|
| |
| B |
| |
|---------------------------|
| |
| C |
| |
----------------------------
问题
A
、B
和 C
视图在超级视图 (UICollectionReusableView
) 上由前导和尾随 link,它在 iOS8。但是在 iOS7 上,当视图布局为具有参考大小(宽度为 768pt)时,子视图的宽度为 1216pt(它应该与父视图的宽度相同: 768pt)...
我发现了什么
这里是 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>
下面是通过在控制台中调用 [self recursiveDescription]
在我的 UICollectionReusableView
中覆盖 layoutSubviews
时发生的情况:
调用前[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>>
| | ...
尝试次数
我尝试设置相对于边距的前导和尾随常量,但没有帮助。
我也尝试在 [super layoutSubviews]
调用后手动更改 A
、B
和 C
的帧,并在这些意见。但正如我所料,它使应用程序崩溃。
问题
我很难找到为什么会发生这种情况,因为 A
、B
和 C
视图中的子视图没有试图扩展它们的父视图。
是否有一些调试技巧可以帮助我确定此错误的来源??
感谢您的帮助!
几个小时后,我偶然发现了错误的来源。
我的 UICollectionReusableView
在用我的模型对象填充所有内容后调用 [self layoutIfNeeded]
,并且在设置数据后我在 Controller 中再次调用它。所以我删除了在 UICollectionReusableView
中进行的调用,它现在在 iOS7 上工作正常。但我仍然不明白为什么它会多次调用 layoutIfNeeded
...
我正在开发与 iOS8 和 iOS7 兼容的应用程序。
我通过子类化 UICollectionReusableView
创建了一个 collection 视图 header,UI 是使用 Interface Builder 创建的。这里是 header 界面的架构:
----------------------------
| |
| A |
| |
|---------------------------|
| |
| B |
| |
|---------------------------|
| |
| C |
| |
----------------------------
问题
A
、B
和 C
视图在超级视图 (UICollectionReusableView
) 上由前导和尾随 link,它在 iOS8。但是在 iOS7 上,当视图布局为具有参考大小(宽度为 768pt)时,子视图的宽度为 1216pt(它应该与父视图的宽度相同: 768pt)...
我发现了什么
这里是 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>
下面是通过在控制台中调用 [self recursiveDescription]
在我的 UICollectionReusableView
中覆盖 layoutSubviews
时发生的情况:
调用前[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>>
| | ...
尝试次数
我尝试设置相对于边距的前导和尾随常量,但没有帮助。
我也尝试在 [super layoutSubviews]
调用后手动更改 A
、B
和 C
的帧,并在这些意见。但正如我所料,它使应用程序崩溃。
问题
我很难找到为什么会发生这种情况,因为 A
、B
和 C
视图中的子视图没有试图扩展它们的父视图。
是否有一些调试技巧可以帮助我确定此错误的来源??
感谢您的帮助!
几个小时后,我偶然发现了错误的来源。
我的 UICollectionReusableView
在用我的模型对象填充所有内容后调用 [self layoutIfNeeded]
,并且在设置数据后我在 Controller 中再次调用它。所以我删除了在 UICollectionReusableView
中进行的调用,它现在在 iOS7 上工作正常。但我仍然不明白为什么它会多次调用 layoutIfNeeded
...