我正在开发一款游戏。我正在使用大约150个UIImageView来保存图形。我正在模拟3D环境,所以我想改变z顺序(物体与相机的距离有多近)。
我知道存在: [superWindow exchangeSubviewAtIndex:i withSubviewAtIndex:j];
但由于某种原因,它不起作用,一些子视图消失了重新出现。
现在我只删除所有子视图并以正确的z顺序再次添加它,这可以使用50个子视图(在2G iphone上),但是120需要半秒,所以游戏很糟糕(我没有和3GS所以我没有尝试过。)
我使用了很多子视图,因为每个子视图都是正方形,然后我将其着色,调整大小并将其移动到屏幕中的某个位置。我在NSMutableArray下持有子视图...
答案 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顺序。