Tencent / QMUI_iOS

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

titleViewTintColor 在 iOS 12 下手势返回又取消后可能出错 #1210

Closed MoLice closed 3 years ago

MoLice commented 3 years ago

Bug 表现 QMUINavigationControllerDelegate 提供 titleViewTintColor 用于控制界面的顶部标题颜色,对系统原生的标题也生效。经测试,iOS 12 下,如果前后两个界面的标题颜色不同,在手势返回一半又取消后,当前界面的标题颜色错误地被前一个界面的标题颜色覆盖。

正确的标题颜色:

手势返回取消后的标题颜色:

如何重现

  1. iOS 12,使用系统默认的标题,也即不要为 navigationItem.titleView 赋值。
  2. 前后两个界面的 titleViewTintColor 返回不一样的颜色。
  3. 手势返回又取消,即可重现 bug。

录屏如下:

其他信息

MoLice commented 3 years ago

Bug 原因:

如截图所示,当手势返回触发时,UINavigationController 会执行一次普通的 pop,于是会走到标注1的位置,此时 appearingViewController 也即前一个界面(标题白色)。

在标注2里,会将当前的 navigationBar 标题颜色按照 appearingViewController 的要求来渲染,标题颜色变为白色,只是目前尚处于手势动画过程中,这个颜色变化不会立马体现出来。

等到手势结束(不管是成功返回,还是半途取消),就会走到标注3的 completion 里,QMUI 4.2.2 的代码里会重新应用一次 appearingViewController 的标题颜色,这在正常手势返回到前一个界面时是没问题的,因为手势结束后,可视的界面确实是 appearingViewController。

但当手势返回中途又取消时,可视界面会停留在旧界面,此时如果还应用 appearingViewController 的标题颜色,就会导致当前界面错误地显示了前一个界面的标题颜色。所以标注3的代码应该把 appearingViewController 换成 topViewController,也即最终真正可视的那个界面才正确。

MoLice commented 3 years ago

已发布 4.2.3 修复该问题。