如何设置iPhone UIView z索引?

问题描述 投票:236回答:8

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

ios uiview position z-index
8个回答
273
投票

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]会把视图带到顶端,但只有在视图是层次结构中的所有兄弟姐妹时才会出现这种情况。


318
投票

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

theView.layer.zPosition = 1;

正如Viktor Nordling所补充的那样,“大值是最重要的。你可以使用你想要的任何值,包括负值。”默认值为0。

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

#import "QuartzCore/QuartzCore.h"

91
投票

IB和斯威夫特

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

views - red view on top

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

views - green view on top

In Interface Builder

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

order of views in Interface Builder

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

In 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))以确保它位于顶部。

72
投票
[parentView bringSubviewToFront:view] ;

19
投票

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


9
投票

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

superview?.bringSubviewToFront(self)

4
投票

如果你使用cocos2d,你可能会看到[parentView bringSubviewToFront:view]的问题,至少它不适合我。我没有将我想要的视图带到前面,而是将其他视图发回去,这就是诀窍。

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

1
投票

我们可以在ios中使用zPosition

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

In my case see the image

并为GMSMapView设置UIView,例如:@IBOutlet weak var mapViewUI: GMSMapView!

显示mapView UI的View沙龙DetailView上方

使用zPosition如下

salonDetailView.layer.zPosition = 1
© www.soinside.com 2019 - 2024. All rights reserved.