Ios 如何设置iPhone UIView z索引?

Ios 如何设置iPhone UIView z索引?,ios,uiview,position,z-index,Ios,Uiview,Position,Z Index,我想将一个视图移动到另一个视图的顶部,如何知道视图的z索引,以及如何移动到顶部?您可以使用视图层(它是CALayer对象)的zPosition属性来更改视图的z索引 theView.layer.zPosition = 1; 如前所述,“大值在顶部。您可以使用任何想要的值,包括负值。”默认值为0 您需要导入QuartzCore框架才能访问该层。只需在实现文件的顶部添加这行代码 #import "QuartzCore/QuartzCore.h" UIView同级按添加到superview的顺序堆

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

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

theView.layer.zPosition = 1;
如前所述,“大值在顶部。您可以使用任何想要的值,包括负值。”默认值为0

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

#import "QuartzCore/QuartzCore.h"

UIView
同级按添加到superview的顺序堆叠。
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;
同级视图在
子视图
数组中从后向前排序。因此,最上面的视图将是:

[parentView.subviews lastObject];
[parentView.subviews objectAtIndex:0];
底部视图将是:

[parentView.subviews lastObject];
[parentView.subviews objectAtIndex:0];

正如Kolin Krevinkel所说,
[parentView-bringSubviewToFront:view]
会将视图置于顶部,但只有当视图都是层次结构中的同级视图时才会出现这种情况。

如果您想通过XCode的界面生成器实现这一点,可以使用编辑器->排列下的菜单选项。在这里您可以找到“发送到前端”、“发送到后端”等。如果您使用的是cocos2d,您可能会看到[parentView bringSubviewToFront:view]存在问题,至少它对我不起作用。我没有将我想要的视图放在前面,而是将其他视图发回,这就成功了

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

IB和Swift

在流动布局中,黄色是超级视图,红色、绿色和蓝色是黄色的兄弟子视图

目标是将子视图(比如绿色)移动到顶部

在界面生成器中 在Interface Builder中,只需将要显示在文档大纲列表顶部的视图拖动到底部即可

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

迅速地 有两种不同的方法可以通过编程实现这一点

方法1

yellowView.bringSubviewToFront(greenView)
  • 此方法是上述IB答案的编程等效方法

  • 仅当子视图是彼此的兄弟视图时,它才起作用

  • 子视图的数组包含在
    yellowView.subview
    中。在这里,
    将子视图移动到前面
    绿色视图
    从索引
    0
    移动到
    2
    。这一点可以通过以下方式观察到:

      print(yellowView.subviews.indexOf(greenView))
    
方法2

greenView.layer.zPosition = 1
  • 此方法只是将层的三维位置在z轴上移动得更高(更靠近用户)。由于所有其他视图的默认值为
    0
    ,因此结果是
    greenView
    看起来像是在顶部。但是,它仍然保留在
    yellowView.subviews
    数组的索引
    0
    。但是,这可能会导致一些意外的结果,因为像点击事件这样的事件仍然会首先进入索引号最高的视图。因此,使用上面的方法1可能更好
  • 可以将
    zPosition
    设置为
    CGFloat.greatestfinitemagnity
    CGFloat(FLT_MAX)
    ,以确保其位于顶部

在您希望显示在顶部的视图中。。。 (以swift格式)


我们可以在ios中使用zPosition

如果我们有一个名为salonDetailView的视图 例如:
@ibdetailview:UIView

并具有用于GMSMapView的UIView 例如:
@IBOutlet弱var映射视图ui:GMSMapView

显示mapViewUI上方的视图的步骤

使用下面的zPosition

salonDetailView.layer.zPosition = 1
还是用这个

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

正如

所说,作为一个助手,大的值是“在顶部”。您可以使用任何想要的值,包括负值。如果您希望视图始终位于顶部,则此解决方案会更好。只需将zPosition设置为MaxFloat我刚刚了解到层的zPosition和UIView的输入处理程序位于两个不同的Z顺序上。当你点击“通过”时真的很奇怪视图的superview必须相同才能使
zPosition
工作吗?我注意到,即使视图在顶部,点击也会通过它到达下面的对象。这应该被认为是一个bug。我正试图找到一个通用的方法来避免这个问题,而不必显式地禁用任何发生在下面的视图的用户交互。。。我花了8个小时想弄明白。yellowView。bringSubviewToFront(greenView)工作得很好。有趣的是,容器视图并不尊重这一点!似乎你必须在代码中手动移动它们。感谢你解释移动实际索引和更改z索引的区别,这似乎更像是一个表面性的更改。btnDOWN.superview?.bringSubview(toFront:btnDOWN)请在你的答案中直接在这里发布照片和代码,为了让OP更容易得到它。作为一个初学者,StackOverflow不允许我这么做。对不起。您可以检查问题图像如果Arrange中的选项被禁用怎么办?