gpt4 book ai didi

iphone - 修改后的 .m34 的 CATransform3D 破坏了 iOS 6 中的 View 层次结构/排序,但没有破坏它所应用的 View

转载 作者:可可西里 更新时间:2023-11-01 05:46:17 25 4
gpt4 key购买 nike

前言,这不是我在屏幕外丢失 View ,因为我做错了转换,这更奇怪。

问题是,如果我使用 .m34 转换来实现我需要的透视图, View 层次结构会中断,但删除转换后它会正确绘制所有内容。

这是一个例子。

我有一个背景图像 (subviewOne)、一个菜单 (subviewTwo) 和一个位于我将 CATransform3D 应用于 (subviewThree) 的所有对象之上的对象。

简单代码:

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

在应用此代码之前, View 层次结构在 iOS 5 上仍然存在:

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

应用后,我得到:

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

现在,subviewThree 仍然应用了透视变换,并且位于正确的位置,位于其他所有内容之上,与 iOS5 相同。但是,Menu/subviewTwo 现在被背景图像/subviewOne 隐藏了,我做任何事情都无法将其绘制在 subviewOne 之上。再多的 insertSubviewAtIndex:、bringSubviewToFront、sendSubviewToBack 等,也无法使 View 正确绘制。

这非常奇特,尤其是因为乱序绘制的 View 没有应用了任何类型的 CATransform3D。

我已经在两个不同的应用程序和多个设备 6 台设备中独立验证了这一点。 iOS5 可以正确绘制所有内容,如果我删除那四行,则可以正确绘制所有内容,但我在 iOS 6 上尝试过的任何内容都无法阻止 .m34 破坏 View 顺序。它并不总是像我提供的示例那样简单,但这是我见过的最明显的案例。

有没有其他人遇到过这个问题,解决过这个问题?

编辑:评论的更多信息。

是的,额外的 * 打字错误。

图中有一个 Imageview、QuadCurve Menu 和 Textview。

我在 viewDidLoad 中使用 .m34 调用该方法,但很快就将其交换到 viewDidAppear 以供您检查。

没关系。不要误会我的意思, subview 在您调用时以正确的顺序列出

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

它们只是没有正确地绘制在屏幕上。

无奈之下,我写了一些疯狂的怪异代码,我发现了以下内容。

我可以延迟 10 秒调用绘制菜单的方法,

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

结束于

[self.view addSubview:menu] 

还有一个完全多余的

[self.view bringSubviewToFront:menu]

它仍然绘制在 imageView 后面,该 imageView 被设置为 .xib 中的最低 subview 。

我已经通过两种方式验证了这一点。我可以进入 .xib 并将 imageView 设置为隐藏,然后再次运行我可以看到菜单,现在 imageView 没有覆盖它。我也可以只注释掉将 .m34 转换应用于 textView 的代码,然后菜单再次正确显示在 imageView 的顶部。同样,这一切都不会发生在 iOS5 和 iOS4 上。

此时,我开始认为这是 iOS6 本身的一个错误,一直在等待 NDA 到期,所以我可以在这里问一下是否有其他人遇到过。

最佳答案

很确定这是一个 iOS 6 错误:我在这里写了一篇关于它的博客:iOS 6 Rendering Bug: 3D-Rotation Causes Layers to Render Without Respect for View Hierarchy .

好消息:您可以通过在受影响的图层上设置 zPositions 来解决该错误:按 View 层次结构的递增顺序设置 zPositions。所以如果我没理解错的话,你想要:

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

查看博客了解更多信息,包括指向我在 Apple 记录的漏洞的 Open Radar 版本的链接。

此外,这可能被认为是这篇文章的重复:iOS 6 view hierarchy nightmare .它具有相同的错误源和解决方案,尽管你们描述的症状不同。

关于iphone - 修改后的 .m34 的 CATransform3D 破坏了 iOS 6 中的 View 层次结构/排序,但没有破坏它所应用的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12546308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com