如何设置iPhone UIView z索引?

Tat*_*tat 246 position z-index uiview ios

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

dan*_*pen 325

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

theView.layer.zPosition = 1;
Run Code Online (Sandbox Code Playgroud)

正如Viktor Nordling所补充的那样,"重要的是价值观.你可以使用你想要的任何值,包括负值." 默认值为0.

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

#import "QuartzCore/QuartzCore.h"
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚了解到图层的zPosition和UIView的输入处理程序在两个不同的Z顺序上.点击"通过"时真的很奇怪 (26认同)
  • 如果您希望视图始终位于顶部,则此解决方案更好.只需将zPosition设置为MAXFLOAT即可 (11认同)
  • 就像一个帮手一样,重要的价值观也是"最重要的".您可以使用任何所需的值,包括负值. (7认同)
  • 我注意到,即使视图在顶部,点击也会通过它到达下面的对象.这应该算是一个bug.我试图找到一种避免该问题的一般方法,而不必明确禁用碰巧在下面的任何视图的用户交互. (3认同)

Nat*_*ror 276

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;
Run Code Online (Sandbox Code Playgroud)

兄弟视图在subviews阵列中排在前面.所以最顶层的视图将是:

[parentView.subviews lastObject];
Run Code Online (Sandbox Code Playgroud)

和底部视图将是:

[parentView.subviews objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

就像Kolin Krewinkel所说的那样,[parentView bringSubviewToFront:view]将视图置于顶端,但只有在视图是层次结构中的所有兄弟姐妹的情况下才会出现这种情况.


Sur*_*gch 97

IB和斯威夫特

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

视图 - 顶部的红色视图

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

视图 - 顶部的绿色视图

在Interface Builder中

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

Interface Builder中的视图顺序

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

在斯威夫特

有几种不同的方法可以以编程方式执行此操作.

方法1

yellowView.bringSubviewToFront(greenView)
Run Code Online (Sandbox Code Playgroud)
  • 这种方法是上述IB答案的程序化等价物.
  • 它只适用于子视图是彼此的兄弟姐妹.
  • 子视图的数组包含在yellowView.subviews.在这里,从索引bringSubviewToFront移动到.这可以用来观察greenView02

    print(yellowView.subviews.indexOf(greenView))
    
    Run Code Online (Sandbox Code Playgroud)

方法2

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


Kol*_*kel 75

[parentView bringSubviewToFront:view] ;
Run Code Online (Sandbox Code Playgroud)


lar*_*ars 19

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


Car*_*lin 9

在视图中你想要带到顶部......(在swift中)

superview?.bringSubviewToFront(self)
Run Code Online (Sandbox Code Playgroud)


小智 5

我们可以在ios中使用zPosition

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

就我而言,请参见图片

并为GMSMapView提供 UIView 例如:@IBOutlet weak var mapViewUI: GMSMapView!

显示mapViewUI上方的ViewsalonDetailView

使用 zPosition 如下

salonDetailView.layer.zPosition = 1
Run Code Online (Sandbox Code Playgroud)