更改iPhone上子视图的z顺序

时间:2009-09-16 11:43:22

标签: iphone exchange-server subview z-order

我正在开发一款游戏。我正在使用大约150个UIImageView来保存图形。我正在模拟3D环境,所以我想改变z顺序(物体与相机的距离有多近)。

我知道存在: [superWindow exchangeSubviewAtIndex:i withSubviewAtIndex:j];

但由于某种原因,它不起作用,一些子视图消失了重新出现。

现在我只删除所有子视图并以正确的z顺序再次添加它,这可以使用50个子视图(在2G iphone上),但是120需要半秒,所以游戏很糟糕(我没有和3GS所以我没有尝试过。)

我使用了很多子视图,因为每个子视图都是正方形,然后我将其着色,调整大小并将其移动到屏幕中的某个位置。我在NSMutableArray下持有子视图...

5 个答案:

答案 0 :(得分:5)

iPhone文档经常警告多个UIViews嵌套,因为它在某一点之后有很大的性能影响。如果你开始遇到问题,一个选项就是将你的UIViews渲染成一个图像并使用它来降低屏幕视图的数量,但是如果你正在模拟3D可能不会有太大的帮助,因为你的复合视图会需要经常重新渲染。

iPhone完全支持OpenGL ES,它允许真正的 3D环境。看看一些样本和/或关于该主题的好书,你会发现简单地使用OpenGL要容易得多。

答案 1 :(得分:4)

Z-order是您的视图出现在superview的子视图列表中的工件。添加到superview的最后一个子视图是“在顶部”。

因此,要将视图移动到“在顶部”,您将其从超级视图中删除,然后重新添加它 - 使其成为最后一个,因此,在顶部。

在这里,视图将自己移动到z顺序的顶部。

// move to the to in the z-order
UIView* superview = [self superview];
[self retain];
[self removeFromSuperview];
[superview addSubview:self];
[self release];

如果您的超级视图是您的唯一参考,请注意[自我保留]以防止您的dealloc。

答案 2 :(得分:2)

如果你不想像Timothy所说的那样倾向于使用OpenGL ES,你可能想看看用CALayers替换UIViews并将它们放在CATransformLayer内。 CATransformLayer是iPhone OS 3.0中的新功能,它可以让您对CALayers进行真正的3-D布局。然后,您可以在CALayers上设置zPosition属性,以便在CATransformLayer的Z平面中找到它们。有关CALayers三维布局的更多信息,我将引导您this article

您甚至可以在应用于该层的CATransform3D中通过setting the m34 element为整体CATransformLayer添加一个很好的透视效果。

从UIViews更改为CALayers非常简单,因为它们的结构有很多共同之处。

答案 3 :(得分:1)

考虑使用像Cocos2D这样的2D游戏库。我很确定它支持Z排序,性能将远远优于使用UIViews。

答案 4 :(得分:1)

我知道这是旧的,但您可以使用bringSubViewToFront更改z顺序。

请参阅此答案:How to set iPhone UI View z index?