前言,这并不是因为我做错了变换而失去了屏幕外的视野,这更奇怪。
问题是,如果我使用 .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。
我已经在两个不同的应用程序和多个设备 6 个设备中独立验证了这一点。iOS5 正确绘制了所有内容,如果我删除这四行,则所有内容都正确绘制,但我在 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 后面。
我已经验证了这两种方法。我可以进入 .xib 并将 imageView 设置为隐藏,然后再次运行我可以看到菜单,现在 imageView 没有覆盖它。我也可以只注释掉将 .m34 转换应用于 textView 的代码,然后菜单再次正确显示在 imageView 的顶部。同样,这一切都不会发生在 iOS5 和 iOS4 上。
在这一点上,我开始认为这是 iOS6 本身内部的一个错误,并且一直在等待 NDA 到期,所以我可以在这里询问其他人是否经历过它。