iOS中设置view层级关系,Layer的zPosition属性使用

本文详细介绍了在iOS开发中如何使用不同的方法控制视图层级,包括 addSubview 的默认行为、bringSubviewToFront 和 sendSubviewToBack 方法,以及 insertSubview 方法的灵活运用。更深入地探讨了利用 UIView 的 layer 属性 zPosition 控制视图层级的高级技巧,实现更精细的 UI 控制。

正常的页面调整视图的层级关系,一般通addSubview的方式

addSubview的方式,会把最后添加的view放到最上面,一般情况下,我们按照顺序添加就可以满足要求了.

[self.view bringSubviewToFront:self.redView]  ,  会把redView放到最前面 .
[self.view sendSubviewToBack:self.redView]; 会把redView放到最底层.

- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; 把子view放到指定的index,这个index不可以超过父视图的子view数量
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;, 把view放到siblingSubview的下面
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview; 把view放到siblingSubview的上面

一般来说这样控制视图的层级就够了, 但是前段时间在看前端的知识时发现了css上有z-index这个属性可以调整视图的上下层关系,感觉比上面的方式要好的多.  心里就在想iOS上应该也有类似的机制,找了一遍UIView的头文件没有找到类似的东西, 不甘心,百度一下原来在UILayer这一层上.

zPosition属性

layer三维空间的,而不是简单的二维。而z轴的position默认值都是0.  z轴的值越大,在图层的越上方.
比如说设置了red.layer.zPosition = 10, 那么red就会始终在所有同层级的subview的最上方, 当然如果在设置一个 greenView.layer.zPosition = 20 , 那么greenView会在red的上方了.  通过zPosition可以方便的做到让某个view始终在父视图的最上层. 但是有个需要注意的地方, 这个zPositon只是改变了UI,使某个view看起来在上面, 但是对于的事件响应链并没有变化,如果需要使某个view不止在最上面,而且事件也是优先响应,那么还是需要把这个viewbringSubviewToFront:的.

zPosition 只能调整同级视图间的显示顺序。 举个例子:

    - 容器A(灰色,zPosition=0)包含 redView、greenView、blueView

    - 容器B(黄色,zPosition=0)在容器A上方,完全覆盖容器A

    - 测试:将 redView 的 zPosition 设为 1000

    实际结果:redView 无法突破容器A显示在容器B之上,✅ 验证了 zPosition 只在同一父视图内有效


zPosition作用范围限制
- zPosition 仅在同一父视图的子视图之间有效
- 无法让子视图突破父视图的层级约束
- 子视图的 zPosition 再高,也无法超越其父视图的层级限制


层级渲染规则
- 父视图的层级关系决定了最终的显示顺序
- 系统先按父视图的 zPosition 排序,再按子视图的 zPosition 排序
- 即:父视图A(zPosition=0) 的子视图永远无法显示在父视图B(zPosition=1) 之上
 

demo地址: https://github.com/guochaoshun/zPosition

Layer与UIView的关系  :  https://www.jianshu.com/p/9c7a23ea705b.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值