Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.05k stars 1.37k forks source link

自动跟随系统主题时,切换前后台UITraitCollection会回调两次 #1492

Closed PeiYanDong closed 1 year ago

PeiYanDong commented 1 year ago

例如: APP换肤选择跟随系统,当前是白皮肤,切换前后台时,UITraitCollection分类会先返回黑皮肤,在返回白皮肤,实际并没有切换皮肤,不应该有回调

预期的表现 跟随系统皮肤时,切换前后台,不切换皮肤,不应该回调皮肤变化

代码定位: UITraitCollection分类的_qmui_overrideTraitCollectionMethodIfNeeded方法

建议: 建议和 [UITraitCollection currentTraitCollection].userInterfaceStyle比对后再返回

MoLice commented 1 year ago

https://github.com/Tencent/QMUI_iOS/wiki/%E4%BD%BF%E7%94%A8-QMUITheme-%E5%AE%9E%E7%8E%B0%E6%8D%A2%E8%82%A4%E5%B9%B6%E9%80%82%E9%85%8D-iOS-13-Dark-Mode

Wiki 文档里已有说明,这是系统行为:

在 App 回到后台的时候,系统会分别使用 Light Mode 和 Dark Mode 为 App 当前界面截两张图,从而保证你切换了主题后再唤醒 App,不会看到颜色跳变的过程

PeiYanDong commented 1 year ago

https://github.com/Tencent/QMUI_iOS/wiki/%E4%BD%BF%E7%94%A8-QMUITheme-%E5%AE%9E%E7%8E%B0%E6%8D%A2%E8%82%A4%E5%B9%B6%E9%80%82%E9%85%8D-iOS-13-Dark-Mode

Wiki 文档里已有说明,这是系统行为:

在 App 回到后台的时候,系统会分别使用 Light Mode 和 Dark Mode 为 App 当前界面截两张图,从而保证你切换了主题后再唤醒 App,不会看到颜色跳变的过程

这会有个问题,外部调用的地方不知道是否真的在切换皮肤,会导致外部的方法,无意义的走两遍,有的涉及到UI的地方也会重新渲染两边,我们这边webview会调用reload方法导致页面产生位移偏差,可以通过是否在后台来屏蔽回调的,进入后台的通知回调,是在皮肤回调之前的,我测试先进入后台,在切换皮肤,进入前台时仍会有皮肤更改的回调的

MoLice commented 1 year ago

通常来说,调用n次都不应该会有问题,因为业务必须保证每一次调用都不会产生副作用。建议从业务角度去解决这个问题。 因为 theme 切换可以认为是随时可能频繁发生的事情,这是业务需要去适配它的,而不是 theme 实现原理去兼容业务(也兼容不了,因为这是系统行为,不是 QMUI 控制的)。