更改 iPhone 上子视图的 z 顺序

Posted

技术标签:

【中文标题】更改 iPhone 上子视图的 z 顺序【英文标题】:Change the z-order of subviews on the iPhone 【发布时间】:2009-09-16 11:43:21 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

Z-order 是您的视图出现在您的父视图的子视图列表中的位置的产物。添加到超级视图的最后一个子视图是“在顶部”。

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

在这里,视图将自己移动到 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。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

看到这个答案:How to set iPhone UI View z index?

【讨论】:

以上是关于更改 iPhone 上子视图的 z 顺序的主要内容,如果未能解决你的问题,请参考以下文章

更改 Iphone 中的垂直约束

iPhone 的啥代码,以便用户可以通过单击某些按钮来更改文本视图中的字体大小?

在 didSelectRowAtIndexPath 上更改 iPhone 表格视图单元格标签文本

如何在iphone中更改下一个视图之前突出显示按钮?

如何在 iPhone 中更改 UIPickerView 的背景颜色

iPhone:使用尺寸类旋转设备时更改背景图像