2

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

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

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

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

我使用了这么多子视图,因为每个子视图都是一个正方形,然后我给它上色,调整它的大小并将它移动到屏幕的某个位置。我持有 NSMutableArray 下的子视图...

4

5 回答 5

5

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

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

于 2009-09-16T11:55:44.057 回答
4

Z 顺序是您的视图出现在您的超级视图的子视图列表中的位置的工件。添加到超级视图的最后一个子视图是“在顶部”。

因此,要将视图移动到“顶部”,请将其从其父视图中删除,然后重新添加 - 使其成为最后一个,因此位于顶部。

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

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

如果您的 superview 是对您的唯一引用,请注意 [self retain] 以防止您的 dealloc。

于 2010-11-25T20:11:06.087 回答
2

如果您不想像 Timothy 建议的那样尝试使用 OpenGL ES,您可能需要考虑用 CALayers 替换 UIViews 并将它们放在CATransformLayer中。CATransformLayer 是 iPhone OS 3.0 中的新功能,它可以让您对 CALayers 进行真正的 3-D 布局。然后,您可以在 CALayer 上设置zPosition属性以将它们定位在 CATransformLayer 的 Z 平面中。有关 CALayers 的 3-D 布局的更多信息,请参阅本文

您甚至可以通过设置应用于该层的 CATransform3D 中的 m34 元素,在整个 CATransformLayer 上添加一个很好的透视效果。

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

于 2009-09-16T13:01:59.760 回答
1

考虑使用像Cocos2D这样的 2D 游戏库。我很确定它支持 Z 排序,并且性能会比使用 UIViews 好得多。

于 2009-09-16T17:53:07.697 回答
1

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

看到这个答案:如何设置 iPhone UI View z index?

于 2012-05-05T01:27:52.737 回答