前后台切换时闪屏处理

时间:2023-01-13 17:43:15

这两天做一个collectionView的视图用来实现一个日历遇到一个问题。
问题1.是我在加载日历的时候因为collectionview所需要加载的东西比较多,能看出来有些卡顿,所以我就在其他视图加载成功后延迟了0.5s后对collectionview进行加载,这样能感觉出来有一定的层次感,但是不至于卡顿的现象出现;
问题2.也是在这个页面,我在双机home键的时候,监听程序的生命周期变化,在appDelegate中做程序进入后台添加默认图片进行遮罩动作。从前台进入后台程序显示正常,无卡顿现象;但从后台变换到前天的时候,我将原来添加的图片从appDelegate中的keyWindow上移出,此时能够看到程序闪屏的现象,给人一种很不友好的感觉。我尝试用了几种方式效果都不好,最后找到一种基本能不闪屏的方式,但是也不够好,记录一下。
尝试1.查看代码,在加载日历的时候为类中的每个方法打断点,去查看有木有在返回前台时做消耗cpu的地方,断点结果是没有。
尝试2.依然是查看代码,查看子类,结果有一个地方写错了,我将视图的加载全部放在了drawRect:方法中,Apple有一句是这样的:

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.

也就是说在这个方法中只需操作绘制图画的动作,不能进行视图加载的动作,所以需将视图的创建加载放在init相关方法中;
尝试3.在尝试调整代码顺序,以及优化逻辑取得的效果甚微时,想到了在前后台切换做了一些操作,所以将重点转向了前后台切换时的操作优化。结果看了切换时的操作后,明白了闪屏的原因:程序在重新启动的时候需要重新渲染屏幕,此时我又将遮罩层移除,此时两种效果叠加在一起才产生了闪屏的现象。
尝试4.在后台切换至前台的过程中将遮罩层的透明度进行改变,用动画效果1s内将透明度降至0.0,但是效果不好,依然有闪屏现象;
尝试5.延长动画效果时间到3s,这种可以避免闪屏现象,但是会给用户一种不好的体念;
尝试6.比较能接受的方式,将遮罩层的位置进行改变,在0.3s的时间内将遮罩从左向右移除屏幕,用户能感知到图层的移动,但是可以避免闪屏的现象;

希望有遇到过的大神能给一个更加完美的方案!