Swift:如何通过UIPageViewController实现统一顶部设计及初始页面配置
解决方案
一、设置初始显示MainSegPageViewController
- 打开Storyboard,选中
MainSegPageViewController。 - 在右侧属性面板勾选Is Initial View Controller,或通过菜单栏
Editor->Set as Initial View Controller设置。 - 确保
MainSegPageViewController的视图包含你设计的顶部区域,同时给子控制器(ViewController1/2)的视图添加约束:顶部对齐到顶部区域的底部,左右及底部对齐到父视图边缘,保证顶部设计始终显示,子控制器仅占据下方白色区域。
二、确保初始加载时顶部设计与子控制器正常显示
你的MainSegPageViewController代码中,viewDidLoad已默认加载ViewController1,这部分逻辑没问题。如果顶部设计被子控制器视图覆盖,可添加以下代码调整安全区域:
override func viewDidLoad() { super.viewDidLoad() dataSource = self modalPresentationStyle = .formSheet // 假设顶部设计高度为60pt,根据实际值修改 let topBarHeight: CGFloat = 60 additionalSafeAreaInsets = UIEdgeInsets(top: topBarHeight, left: 0, bottom: 0, right: 0) if let firstViewController = subViewcontrollers.first { setViewControllers([firstViewController], direction: .forward, animated: true, completion: nil) } setUpNavigationBar(with: "Pagination vc", isBackNeed: true) navigationController?.navigationBar.isHidden = false }
三、实现点击“STEP 2”切换到ViewController1
场景1:按钮在MainSegPageViewController的顶部设计中
在MainSegPageViewController类中添加按钮点击事件:
@IBAction func step2ButtonTapped(_ sender: UIButton) { // 切换到数组第一个元素(ViewController1) setViewControllers([subViewcontrollers[0]], direction: .forward, animated: true, completion: nil) }
完成后在Storyboard中把“STEP 2”按钮与该IBAction关联。
场景2:按钮在侧边栏或外部控制器中
修改侧边栏跳转代码,实例化后直接指定显示ViewController1:
let vc = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "MainSegPageViewController") as! MainSegPageViewController // 跳转时直接设置显示ViewController1,关闭子控制器切换动画避免冲突 vc.setViewControllers([vc.subViewcontrollers[0]], direction: .forward, animated: false, completion: nil) navigationController?.pushViewController(vc, animated: true)
额外优化:简化UIPageViewControllerDataSource代码
原代码中存在冗余判断,可简化为:
extension MainSegPageViewController: UIPageViewControllerDataSource { func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { guard let index = subViewcontrollers.firstIndex(of: viewController), index > 0 else { return nil } return subViewcontrollers[index - 1] } func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { guard let index = subViewcontrollers.firstIndex(of: viewController), index < subViewcontrollers.count - 1 else { return nil } return subViewcontrollers[index + 1] } func presentationCount(for pageViewController: UIPageViewController) -> Int { return subViewcontrollers.count } func presentationIndex(for pageViewController: UIPageViewController) -> Int { guard let firstViewController = viewControllers?.first, let index = subViewcontrollers.firstIndex(of: firstViewController) else { return 0 } return index } }
内容的提问来源于stack exchange,提问作者Swift
相关产品推荐
相关产品推荐

