如何设置iPhone UIView z索引?

时间:2011-01-08 01:46:57

标签: ios uiview position z-index

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

9 个答案:

答案 0 :(得分:317)

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

theView.layer.zPosition = 1;

正如Viktor Nordling添加的那样,“大值是最重要的。您可以使用您想要的任何值,包括负值。”默认值为0.

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

#import "QuartzCore/QuartzCore.h"

答案 1 :(得分:272)

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]会将视图置于顶部,但只有视图是层次结构中的所有兄弟姐妹才会出现这种情况。

答案 2 :(得分:84)

IB和Swift

鉴于流动的布局,黄色是超视图,红色,绿色和蓝色是兄弟的黄色子视图,

views - red view on top

目标是将子视图(让我们说绿色)移到顶部。

views - green view on top

在Interface Builder

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

order of views in Interface Builder

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

在Swift中

有几种不同的方式可以通过编程方式执行此操作。

方法1

yellowView.bringSubviewToFront(greenView)
  • 此方法与上述IB答案的程序化等效。
  • 仅当子视图是彼此的兄弟姐妹时才有效。
  • 子视图的数组包含在yellowView.subviews中。在此处,bringSubviewToFrontgreenView从索引0移至2

    可以观察到这一点
    print(yellowView.subviews.indexOf(greenView))
    

方法2

greenView.layer.zPosition = 1
  • 此方法只是在z轴上将图层的3D位置移动得更高(更靠近用户)。由于所有其他视图的默认值均为0,因此结果是greenView看起来像在顶部。但是,它仍然保留在0数组的索引yellowView.subviews处。但是,这可能会导致一些意想不到的结果,因为点击事件之类的内容仍将首先进入索引编号最高的视图。出于这个原因,最好采用上面的方法1。
  • zPosition可以设置为CGFloat.greatestFiniteMagnitude(旧版Swift中为CGFloat(FLT_MAX)),以确保它位于最佳状态。

答案 3 :(得分:72)

[parentView bringSubviewToFront:view] ;

答案 4 :(得分:19)

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

答案 5 :(得分:9)

在视图中,您希望将其带到顶部... (快速)

superview?.bringSubviewToFront(self)

答案 6 :(得分:4)

如果您使用的是cocos2d,您可能会看到[parentView bringSubviewToFront:view]出现问题,至少它不适用于我。

,而不是将我想要的视图带到前面,我将其他视图发回去
[[[CCDirector sharedDirector] view] sendSubviewToBack:((UIButton *) button)]; 

答案 7 :(得分:1)

我们可以在ios中使用zPosition

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

In my case see the image

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

显示 mapViewUI

的View salonDetailView 上部

按如下所述使用zPosition

salonDetailView.layer.zPosition = 1

答案 8 :(得分:0)

或使用此

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

按照here