4

はじめに、これは私が間違った変換を行ったために画面外のビューを失ったのではなく、もっと奇妙です。

問題は、必要なパースペクティブを実現するために .m34 変換を使用すると、ビュー階層が壊れますが、変換を削除すると、すべてが正しく描画されます。

これが例です。

背景画像 (subviewOne)、メニュー (subviewTwo)、および CATransform3D を適用するすべての上にあるオブジェクト (subviewThree) があります。

簡単なコード:

CALayer *layer = subviewThree.layer;
CATransform3D perspectiveTransform = CATransform3DIdentity;
perspectiveTransform.m34 = -1.0 / 500;
layer.transform = perspectiveTransform;

このコードを適用する前は、ビュー階層は iOS 5 にありました。

(bottom to top)
subviewOne->subviewTwo->subviewThree

それを適用した後、私は次のようになります:

(bottom to top still)
subviewTwo->subviewOne->subviewThree

現在、subviewThree にはまだ透視変換が適用されており、iOS5 と同様に、他のすべての上にある正しい場所にあります。ただし、Menu/subviewTwo は現在、背景イメージ/subviewOne によって隠されているため、subviewOne の上に描画されることはありません。insertSubviewAtIndex:、bringSubviewToFront、sendSubviewToBack などをいくら使用しても、ビューが正しく描画されません。

これは特に、順不同で描画されるビューにはCATransform3Dが適用されていないため、非常に奇妙です。

これは、2 つの異なるアプリと複数のデバイス 6 デバイスで個別に確認しました。iOS5 はすべてを正しく描画し、これらの 4 行を削除するとすべてが正しく描画されますが、iOS 6 で試したことはありませんが、.m34 がビューの順序を壊すのを防ぎます。私が提供した例ほど単純ではありませんが、これは私が目撃した中で最も実証的なケースです。

他の誰かがこれを経験し、これを解決しましたか?

編集:コメントの詳細情報。

ええ、余分な * のタイプミス。

Imageview、QuadCurve Menu、および Textview があるとします。

私はviewDidLoadで.m34を使用してメソッドを呼び出していましたが、それをviewDidAppearにすばやく交換して確認しました。

関係ない。誤解しないでください。呼び出すと、サブビューは正しい順序でリストされます

NSLog(@"%@", [self.view.subviews description]); 

画面に正しく描画されないだけです。

必死になって、クレイジーで奇妙なコードを書いたところ、次のことがわかりました。

メニューを描画するメソッドを 10 秒の遅延で呼び出すことができます。

[self performSelector:@selector(createQuadCurveMenu) withObject:nil afterDelay:10];

で終わる

[self.view addSubview:menu] 

だけでなく、完全に余分な

[self.view bringSubviewToFront:menu]

.xib で最下位のサブビューとして設定されている imageView の背後にまだ描画されています。

私はこの2つの方法を確認しました。.xib に移動して imageView を非表示に設定し、再度実行すると、imageView がメニューをカバーしていないため、メニューが表示されます。.m34 変換を textView に適用するコードをコメント アウトすることもできます。これにより、メニューが imageView の上に正しく表示されます。繰り返しますが、これは iOS5 および iOS4 では発生しません。

この時点で、私はそれが iOS6 自体のバグであると考え始めており、NDA が期限切れになるのを待っていたので、他の誰かがそれを経験したかどうかここで尋ねることができます.

4

1 に答える 1

3

これは iOS 6 のバグであることは間違いありません。ここでブログを書きました: iOS 6 Rendering Bug: 3D-Rotation Causes Layers to Render Without Respect for View Hierarchy

朗報: 影響を受けるレイヤーに zPositions を設定することで、バグを回避できます。ビュー階層の昇順で zPositions を設定します。したがって、私が正しく理解していれば、次のことが必要です。

subviewOne.layer.zPosition = 0;
subviewTwo.layer.zPosition = 1000;
subviewThree.layer.zPosition = 2000;

Apple に記録したバグの Open Radar バージョンへのリンクなど、詳細についてはブログをチェックしてください。

また、これはこの投稿の複製と見なされる可能性があります: iOS 6 ビュー階層の悪夢. どちらも説明する症状は異なりますが、バグのソースと解決策は同じです。

于 2012-09-26T17:58:10.767 に答える