Tencent / QMUI_iOS

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

开启 QMUINavigationControllerDelegate customNavigationBarTransition 功能后,在 pop 时 vc.qmui_navigationBarMaxYInViewCoordinator 为 0 导致布局跳动 #268

Closed MoLice closed 6 years ago

MoLice commented 6 years ago

请填写运行环境

请描述具体问题

  1. 在某个 vc 的 viewDidLayoutSubviews 方法里布局的时候使用 self.qmui_navigationBarMaxYInViewCoordinator 获取导航栏的位置并相对它布局。
  2. 开启 QMUINavigationControllerDelegate 里优化 push/pop 时的 navigationBar 效果的相关方法,例如 shouldCustomNavigationBarTransitionWhenPopDisappearing
  3. 将该 vc pop 掉。
  4. 会发现布局往上跳动。

相关截图

image

image

MoLice commented 6 years ago

原因分析

当开启了 customNavigationBarTransition 功能后,在 UINavigationController (NavigationBarTransition) 里会在 vc 被 pop 的时候将一条 transitionNavigationBar 添加到 vc.view 上,因此触发 vc 的 viewDidLayoutSubviews。而由于 vc 被 pop 了,此时在 viewDidLayoutSubviews 里获取到的 self.navigationController 为 nil,导致 self.qmui_navigationBarMaxYInViewCoordinator 的值为 0,从而表现出布局上的错误跳动。 image

我们尝试通过某些方式避免将 transitionNavigationBar 添加到 vc.view 上时触发的那一次 viewDidLayoutSubviews,但目前仍未找到理想的方法,因此暂时兼容 qmui_navigationBarMaxYInViewCoordinator 方法,令其在获取不到 navigationBar 时试图拿 transitionNavigationBar 来代替,这样能解决目前的问题。但那一次多余的 viewDidLayoutSubviews 依然是多余的,并且也存在其他风险,例如你自己访问 self.navigationController.navigationBar.frame(而不是通过 QMUI 的 qmui_navigationBarMaxYInViewCoordinator 方法),也会出现相同的问题。

待优化。

MoLice commented 5 years ago

这个问题将会在 3.2.0 优化,以后使用时没有这种烦恼了