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。

我已经在两个不同的应用程序和多个设备 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 到期,所以我可以在这里询问其他人是否经历过它。

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 view hierarchy nightmare。尽管您描述的症状不同,但它具有相同的错误来源和解决方案。

于 2012-09-26T17:58:10.767 回答