Tencent / QMUI_iOS

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

使用QMUIModalPresentationViewController后,push一个新页面的问题 #1359

Closed DevWhan closed 2 years ago

DevWhan commented 2 years ago

业务上有个诉求, 弹出一个半屏的浮层, 在浮层的内容区域可以通过点击按钮push到一个新的全屏的页面 我通过contentViewController=navi, 尝试了使用showWithAnimated和presentViewController, 最终都是push到了一个新的半屏页面. 翻看了下源码, 目前没有找到一种可行的方案, 请问下目前QMUIModalPresentationViewController有没有什么使用方式可以实现这个诉求? 感谢

MoLice commented 2 years ago

这个跟你的 modal.contentViewController 是否要用一个 UINavigationController 类型的 vc 好像没什么关系?

  1. 半屏 modal 用系统 present 的方式显示出来
  2. modal 里的某个按钮 touch 后,用 modal 背后那个主体的 vc 的 navigationController 去 push 你要展示的新界面。
DevWhan commented 2 years ago

这个跟你的 modal.contentViewController 是否要用一个 UINavigationController 类型的 vc 好像没什么关系?

  1. 半屏 modal 用系统 present 的方式显示出来
  2. modal 里的某个按钮 touch 后,用 modal 背后那个主体的 vc 的 navigationController 去 push 你要展示的新界面。

感谢你的回答 我在描述一下背景, 其实我考虑的也是项目内统一使用的浮层方案(无论是全屏还是半屏), 因为此前使用QMUIMP大多数是那种打断操作或者一些表单输入项(不会再跳转新页面), 最近业务调整时, 会有继续跳转新页面的诉求(原页面不会关闭), 技术上我是希望能统一一套实现方案. 所以我问了这个问题. present通过定制确实可以实现,但是不如QMUIMP来的灵活, 所以还是想请教下

  1. present和QMUIMP在业务使用上有什么不同的侧重吗
  2. QMUIMP能否在实现上支持新开一个navi来支持全屏push呢(例如:keywindow的rootvc为navi. navi的rootvc为modelpresent等等其他方案?)
MoLice commented 2 years ago

我说的第1点的系统 present 不是指让你自己用 present 去实现一个半屏浮层,而是指 modal 本身就支持以 present 的方式来显示,注释和 Demo 里都有写。 image

DevWhan commented 2 years ago

我说的第1点的系统 present 不是指让你自己用 present 去实现一个半屏浮层,而是指 modal 本身就支持以 present 的方式来显示,注释和 Demo 里都有写。 image

感谢你的回答 这个我最开始有试过通过presentViewController, 后面的navi也会push一个新页面. 但是用户能看到的最上层页面还是模态弹出的那个页面. 为了避免理解偏差, 我写了个demo, 麻烦有时间指点一下 代码 TestPresent.zip 视频 https://user-images.githubusercontent.com/13635764/147742198-3622e5e0-a9bd-4d18-93a2-cb8e8cb841d5.mov

MoLice commented 2 years ago

但是用户能看到的最上层页面还是模态弹出的那个页面.

哦也是...那你可以选择注释里的第三种,add view 的形式试试

DevWhan commented 2 years ago

但是用户能看到的最上层页面还是模态弹出的那个页面. 哦也是...那你可以选择注释里的第三种,add view 的形式试试

add view肯定是可以的, 但是受super view的大小限制. 想着浮层最好设计上就是全屏的, 以此来满足后面业务的不同需要. 所以前面我会问1和2两个问题. 如果按照苹果present后push的推荐, 应该是present一个root为vc的navi, 但是QMUIMP限制了present必须是QMUIMP实例, 而QMUIMP本身继承于UIViewController, 又不支持包一个navi(试了一下不行), 那按照这个思路的话, 我就在想QMUIMP本身能否扩展支持这种场景, 因为我又想使用QMUIMP带来的灵活性, 又想像系统present那样可以支持push.

当然这主要是在于QMUIMP理念上是一个纯"浮层"还是一个可以支持跳转的浮层(像present一样), 想听下你们是怎么考虑这个的

MoLice commented 2 years ago

原理上是做不到你要的效果的。

你希望的就是 vcA 弹出 modal,modal 里是 UINavigationController,UINavigationController.rootViewController 是一个半屏样式的 vcB,此时你要在 UINavigationController 里直接打开 vcC,那你就会看到 push 动画过程中 vcB 和 vcC 重叠了一部分,而且导航栏一个要显示一个要隐藏,这些你都无法处理的,或者说你要处理的话成本还不如我完全用纯 UIView 来实现各种复杂界面效果。要考虑性价比。

DevWhan commented 2 years ago

原理上是做不到你要的效果的。

你希望的就是 vcA 弹出 modal,modal 里是 UINavigationController,UINavigationController.rootViewController 是一个半屏样式的 vcB,此时你要在 UINavigationController 里直接打开 vcC,那你就会看到 push 动画过程中 vcB 和 vcC 重叠了一部分,而且导航栏一个要显示一个要隐藏,这些你都无法处理的,或者说你要处理的话成本还不如我完全用纯 UIView 来实现各种复杂界面效果。要考虑性价比。

如果是add view的话, 直接add view会受父容器大小的限制. 我想了一个比较曲线的方案, 有一些弊端, 但是可以满足诉求. 先present一个自定义的nav,和自定义的rootvc. 在rootvc viewDidLoad时, 使用QMUIMP add view的方式来进行展示. 使用上可能没有那么丰富的回调了, 但是跳转和浮层应该没啥大问题感觉. 如果你有时间麻烦再帮我看看有无大的问题,非常感谢 demo TestPresent.zip