1

iOS8とiOS7に対応したアプリを開発中です。

コレクションのビューヘッダーをサブクラスUICollectionReusableView化して作成し、UI は Interface Builder で作成しました。ヘッダーのインターフェースのスキーマは次のとおりです。

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

問題

ABおよびCビューは、スーパー ビュー ( UICollectionReusableView) の Leading と Trailing によってリンクされ、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>

そして、コンソールで呼び出してlayoutSubviewsin myをオーバーライドすると、次のようになります。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これらのビューを呼び出して呼び出した後です。しかし、予想どおり、アプリがクラッシュしました。BC[super layoutSubviews]setNeedLayout

質問

A内部のサブビューBCビューがスーパービューを拡張しようとしないため、なぜこれが起こっているのかを見つけるのに苦労しています。

このバグの原因を特定するのに役立つデバッグ手法はありますか??

ご協力ありがとうございました !

4

1 に答える 1

1

数時間後、たまたまバグの原因を見つけました。

すべてがモデルオブジェクトで満たされた後にUICollectionReusableView呼び出し[self layoutIfNeeded]ていました。データが設定された後、コントローラーで再度呼び出していました。そのため、内部で行われた呼び出しを削除しましたが、UICollectionReusableViewiOS7 で正常に動作するようになりました。しかし、なぜそれが複数回の呼び出しで行われるのか、まだわかりませんlayoutIfNeeded...

于 2015-01-09T15:44:50.710 に答える