Xcode界面构建器:按钮、图像、UI元素等的Z-Index、Z-order是什么?

63

我正在Xcode Interface Builder Storyboard中拖动各种元素,我想指定一个图像是在按钮前面(像指示器)还是在按钮后面(像背景)。

我没有看到像其他环境中一样的z-index属性。

如果没有z-index属性,那么实现我所需的功能最好的方法是什么?

7个回答

92

我通过点击ui元素(按钮、图片、文本等)并进入布局菜单(位于屏幕顶部),然后使用“置于顶层”、“置于底层”等功能来实现了我的目标。

在Xcode 4.2中,您可以在顶部菜单中找到选项:编辑->排列。


5
对我来说很有趣,因为尽管有那么多复杂的解释,但正确答案并没有被提交。(我猜 Kendall 实际上提到了菜单项,但没有进入它们的位置。)纯属猜测,但我想 CALayer 对象一定有一些关于 z-index 的概念。 - livingtech
16
在Xcode 4.2中,您可以在顶部菜单中找到选项:编辑->排列。 - MdaG
16
尝试这样做,但是“发送到_____”菜单选项都变灰了。 - Madbreaks
9
如果你双击它,它将被选择。在侧边栏上单击只是在编辑屏幕上突出显示,以指示元素的位置 - 但是双击(侧边栏)也会选择它。 - Kendall Helmstetter Gelner
1
@mamleszK Kendall Helmstetter Gelner说得对!你应该在侧边栏中双击要查看的视图!!双击项目将被用浅灰色勾选……单击则会用蓝色突出显示! - evan
显示剩余3条评论

24

不使用子视图也可以进行Z轴排序。一方面,有“置于顶层”和“置于底层”的菜单选项。此外,如果你将视图元素看作元素树,你可以通过拖动来在那里重新排序它们(而不是在视图本身中进行)。

子视图适用于分组,但对于排序不太有用(除了整个“集合”保持在同一级别之外)。


14
在Xcode开发中,UI元素或“视图”在成为该视图的子视图时位于另一个视图前面。例如,如果视图B是背景,视图C是控件,则要将控件放置在背景上方(即更接近用户),您需要使视图C成为视图B的子视图。在Interface Builder中,通过将控件拖入背景来实现这一点。
基本上,您正在查看一棵树形结构,背景中的视图靠近树的根部,前景中的视图(更接近用户)靠近树的叶子。
苹果公司iPhone开发文档中的Windows and Views文件可能有助于澄清事情。
注意1:您几乎永远不应重叠单个控件,如按钮和文本字段。这样做违反了苹果的用户界面指南。当然,如果您想这样做,您需要知道自己正在走出安全区域。如果您只是编写“普通”的iPhone应用程序,最好遵循苹果的做法。

注2: 如果出于某种原因,您确实需要以特定方式重叠物品,则可以利用CALayer对象来保持一切正确有序。 CALayer对象是Apple的核心动画技术的一部分。


可以做到,尽管这可能比简单的拖放要困难一些。请参阅https://dev59.com/sXRB5IYBdhLWcg3w7reV - e.James
嗯,苹果需要在这个问题上做好自己的表现。z-index是一个好选择。这太原始了。不过还是谢谢你的帮助!! - Shai UI
1
感谢您的帮助,但我不会轻易地对苹果进行评判。视图的树形结构可以实现非常高效的绘图操作,因为运行时可以快速将画布分割成需要重新绘制的单独区域。 - e.James
1
在开发过程中可能需要进行一些微调,但当用户实际运行您的应用程序时,这将产生巨大的回报,而那才是真正重要的时候。 - e.James
我刚刚意识到我在第一条评论中链接的问题是我自己的,那是很久以前我第一次学习这些东西的时候!我想当我们开始学习时,我们都不得不问这些问题 :) - e.James
显示剩余2条评论

12
在 Xcode 4.6 的界面构建器中,通过菜单(Editor > Show Document Outline)或点击画布左下角的半透明按钮呼出“文档大纲”。

在 "对象" 列表下,显示了视图的 Z 顺序,并且用户可以拖动它们来改变彼此之间的顺序。屏幕底部越接近,该元素就越“靠近”用户。


6
在Xcode 4.6中,我只需要在左侧的列表中拖动元素即可上下移动。
列表中元素越靠下,就越接近用户。
例如,列表底部的元素始终可见,除非它超出了屏幕。我不确定这是何时实现的,但它似乎比其他答案更容易操作。

1
这真的很有帮助。我尝试使用“编辑器>排列>发送到前面”将两个不同的控件置于最上层,但奇怪的是它不允许同时将它们都置于最上层。因此,手动重新排序列表使我能够以简单和便捷的方式完全按照自己的意愿工作。(您还可以看到它如何影响故事板文件,在那里视图/控件被重新排序。) - Jared Updike

3

在Swift中:

要将视图置于顶层,需要在该视图内部进行操作。

superview?.bringSubviewToFront(self)

1
我的做法是在代码中进行操作:
self.view.sendSubviewToBack(imageView);

我不知道为什么,但其他答案都不能永久解决它。我将上述行放在viewDidLoad方法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接