UIModalPresentationFullScreen 导致渐变图层异常


iOS 13 之前模态弹出一个页面默认是全屏展示,从 iOS 13 开始,如果不特意指定控制器的 modalPresentationStyle 属性,模态出的页面会是卡片式、非全屏,全屏的话需要指定:

1
vc.modalPresentationStyle = UIModalPresentationFullScreen;

这一点相信很多年年做适配的同行早就知道了,所以这不是小咪要说的重点。

小咪要说的是今天修改一个极老的项目,L 页面是模态弹出的,所以用新的编译环境打包的话是一定要适配上面这一项的。然后又出现新的问题了…客户要求 L 页的背景是渐变色,当时采用的是下面的方式绘制一层渐变图层,加到 L 页的 View 上。

1
2
3
4
5
6
CAGradientLayer *gl = [CAGradientLayer layer];
gl.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
gl.colors = @[(__bridge id)RGBA(246, 135, 72, .9f).CGColor, (__bridge id)RGBA(230, 69, 90, .9f).CGColor];
gl.startPoint = CGPointMake(0, 0);
gl.endPoint = CGPointMake(0, 1.0);
[self.view.layer addSublayer:gl];

但是修改 modalPresentationStyle 以后,渐变图层跑到了最上面,也就是遮挡住了 L.view 的所有子控件,子控件的事件响应也被阻断了…临时的解决办法是手动把它往后挪了一层:

1
2
CALayer *temp = [self.view.layer.sublayers lastObject];
[self.view.layer insertSublayer:gl below:temp];

视觉效果和响应上倒是恢复了,但是什么原因导致的图层顺序变化呢…小咪晕了…有遇到同样问题的小伙伴吗?