Swift中如何实现UIPageViewController关闭后直接跳转至目标UIViewController
解决UIPageViewController关闭后直接跳转目标VC的问题
你的问题我太懂了——这种“闪一下起始页”的过渡确实很影响体验,核心原因就是你当前的流程是关闭引导页回到起始VC,再由起始VC触发跳转,这两步是串行的,所以必然会露出起始页。咱们可以换个思路,把跳转逻辑和引导页的关闭无缝衔接,直接跳过起始页的中间展示。
方法一:直接从引导页触发目标VC的呈现(最推荐)
既然你已经在onUIPageViewControllerRigthClosing这个回调里处理收尾,那完全可以在这里直接让起始VC后台无动画呈现目标VC,再关闭引导页,视觉上就不会看到起始页的过渡:
override func onUIPageViewControllerRigthClosing() { // 从storyboard初始化目标VC(记得替换成你的storyboard名称和VC标识符) let targetVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TargetViewController2") guard let startVC = presentingViewController as? StartPageController else { return } // 先让起始VC无动画呈现目标VC(用户看不到这个操作) startVC.present(targetVC, animated: false) { // 再关闭引导页,保留关闭动画 self.dismiss(animated: true, completion: nil) } }
这个逻辑的本质是:在后台完成起始VC到目标VC的切换(无动画),然后关闭引导页,用户看到的就是引导页关闭后直接显示目标VC,完美衔接。
方法二:直接替换应用根视图(适合目标VC是主界面的场景)
如果你的目标VC是应用的主入口,比如引导页完成后直接进入首页,那可以直接替换窗口的根视图控制器,彻底跳过起始VC:
override func onUIPageViewControllerRigthClosing() { let targetVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TargetViewController2") // 获取当前活跃的key窗口(iOS13+适配多场景) guard let window = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return } // 先关闭引导页,完成后替换根视图 dismiss(animated: true) { window.rootViewController = targetVC // 可选:给根视图添加淡入动画,让过渡更自然 UIView.transition(with: window, duration: 0.3, options: .transitionCrossDissolve, animations: nil) } }
这种方式最彻底,直接把目标VC设为应用的根,完全不会有起始VC的任何痕迹。
为啥你当前的思路会出问题?
你现在的流程是关闭引导页 → 回到起始VC → 起始VC执行segue,这三步是依次执行的,所以起始VC一定会短暂显示。要解决这个问题,核心就是把跳转逻辑和引导页的关闭合并,不让起始VC有机会出现在用户眼前。
如果你非要用segue的方式,也可以试试给起始VC加个标记:
- 在
StartPageController里加个属性:var shouldSkipToTarget = false - 引导页回调里给这个标记设为
true,然后关闭引导页 - 在起始VC的
viewWillAppear里判断,如果shouldSkipToTarget为true,就立即执行segue并设置无动画
不过这种方式还是会有极短的起始页闪屏,不如前两种方法流畅,所以优先推荐前两个方案。
内容的提问来源于stack exchange,提问作者Gabriele Picco
相关产品推荐
相关产品推荐

