如何设置iPhone UIView z索引?


252

我想将一个视图移到另一个视图上,如何知道该视图的z索引,以及如何移到顶部?

Answers:


279

UIView兄弟姐妹按照添加到其父视图的顺序堆叠。该UIView层次的方法和属性是有管理的视角次序。在UIView.h中:

@property(nonatomic,readonly) UIView *superview;
@property(nonatomic,readonly,copy) NSArray *subviews;

- (void)removeFromSuperview;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2;

- (void)addSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;

- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;

兄弟视图在subviews阵列中排列为从前到后。因此,最上面的视图将是:

[parentView.subviews lastObject];

底视图将是:

[parentView.subviews objectAtIndex:0];

就像科林·克雷温克尔(Kolin Krewinkel)所说的那样,[parentView bringSubviewToFront:view]将视图带到顶部,但是只有当视图都是层次结构中的所有同级对象时,情况才如此。


329

您可以使用zPosition视图图层(它是一个CALayer对象)的属性来更改视图的z索引。

theView.layer.zPosition = 1;

正如Viktor Nordling所说,“大价值放在首位。您可以使用任何想要的值,包括负值。” 默认值为0。

您需要导入QuartzCore框架才能访问该层。只需将此代码行添加到实现文件的顶部。

#import "QuartzCore/QuartzCore.h"

7
就像帮助者一样,重要的价值观是“最重要的”。您可以使用任何需要的值,包括负值。
维克多·诺丁

12
如果您希望视图始终处于最佳状态,则此解决方案更好。只需将zPosition设置为MAXFLOAT-
穆罕默德·哈桑·纳斯

27
我刚刚了解到,该图层的zPosition和UIView的输入处理程序位于两个不同的Z顺序上。当您的点击“通过”真的很奇怪
Stephen J

为了制作zPosition作品,视图的超级视图必须相同吗?
Hlung 2013年

3
我注意到,即使视图位于顶部,也可以通过单击将其单击到下面的对象。应该将其视为错误。我试图找到一种通用的方法来避免该问题,而不必显式禁用在其下方的任何视图的用户交互。
布鲁斯·帕丁

103

IB和斯威夫特

给定流动的布局,其中黄色是父视图,红色,绿色和蓝色是黄色的兄弟子视图,

视图-顶部红色视图

目的是将子视图(假设为绿色)移到顶部。

视图-顶上的绿色视图

在Interface Builder中

在Interface Builder中,您所需要做的就是将要显示在文档大纲中列表顶部的视图拖到底部。

Interface Builder中视图的顺序

或者,您可以选择视图,然后在菜单中转到“ 编辑器”>“排列”>“发送到前端”

在斯威夫特

有两种不同的方式以编程方式执行此操作。

方法一

yellowView.bringSubviewToFront(greenView)
  • 该方法与上述IB答案在程序上等效。

  • 仅当子视图彼此为同级时才有效。

  • 子视图的数组包含在中yellowView.subviews。在这里,bringSubviewToFrontgreenViewindex从0移到2。可以观察到

      print(yellowView.subviews.indexOf(greenView))

方法二

greenView.layer.zPosition = 1
  • 此方法只是将图层的3D位置在z轴上移得更高(更靠近用户)。由于默认值是0所有其他视图的结果,因此结果是greenView看起来像在顶部。然而,它仍然在指数0yellowView.subviews数组的。但是,这可能会导致一些意外的结果,因为诸如敲击事件之类的事件仍将首先进入具有最高索引号的视图。因此,最好使用上述方法1。
  • zPosition可以设置为CGFloat.greatestFiniteMagnitudeCGFloat(FLT_MAX)在旧版本的雨燕),以确保其在上面。

谢谢。。。我花了8个小时试图解决这个问题。yellowView.bringSubviewToFront(greenView)完美运行。
MizAkita'3

有趣的是,容器视图不尊重这一点!看来,您必须手动将它们移动到代码中。
Fattie


19

如果要通过XCode的Interface Builder进行此操作,则可以使用Editor-> Arrangement下的菜单选项。在那里您可以找到“发送到前面”,“发送到后面”等。


如果禁用“排列”中的选项怎么办?
mr5

9

在视图中您要显示在顶部...(快速)

superview?.bringSubviewToFront(self)

?btnDOWN.superview .bringSubview(toFront:btnDOWN)
克里斯

4

如果您使用的是cocos2d,则可能会看到[parentView BringSubviewToFront:view]有问题,至少对我来说不起作用。我没有将我想要的视图放在最前面,而是将其他视图发送回去,从而达到了目的。

[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

2

我们可以在ios中使用zPosition

如果我们有一个名为salonDetailView的视图, 例如:@IBOutlet weak var salonDetailView: UIView!

就我而言,看图片

并具有用于GMSMapView的 UIView, 例如:@IBOutlet weak var mapViewUI: GMSMapView!

要显示视图salonDetailView的上部mapViewUI

使用zPosition如下

salonDetailView.layer.zPosition = 1

请在您的答案中直接在此处发布照片和代码,以使OP更加容易获得它。
skratchi.at

作为一个初学者,StackOverflow不允许我这样做。您可以检查问题图像i.stack.imgur.com/d9Cx3.png
abhijith k

0

或使用这个

- (void)insertSubview:(UIView *)view belowSubview:(UIView*)siblingSubview;

按照这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.