はじめに、これは私が間違った変換を行ったために画面外のビューを失ったのではなく、もっと奇妙です。
問題は、必要なパースペクティブを実現するために .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 が期限切れになるのを待っていたので、他の誰かがそれを経験したかどうかここで尋ねることができます.