微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UIPageViewController 中的动态页数

如何解决UIPageViewController 中的动态页数

我正在开发一个高度依赖页面浏览量的应用。简而言之,该应用程序为一年中的每周显示一页。您可以通过滑动页面或选择特定的周数来更改周。我一直在测试许多不同的页面视图解决方案,包括TabView(PageTabViewStyle),但在大多数情况下,性能确实很糟糕。因此,我决定尝试使用 Apple 描述的 here UIKit 解决方案。

这个解决方案在各个方面都非常有用,除了一个。在我的应用程序中,您还可以选择年份。这意味着周的范围可以是 1-52 或 1-53,当我更改年份时,我似乎无法让 UIPageViewController 更新页面数(周)。

简而言之,我当前的代码如下所示:
我有一个状态,它将当前年份的最初几周保留在一个数组中:

@State var weeks: [Int] = Array(0..<Date.lastWeekOfYear(year: Date.currentYear(date: Date())))

页面视图设置如下:

PageView(page: self.$page,pages: weeks.map {
  ListView(year: self.$year,week: $0 )
})

当年份发生变化时,我会使用 .onChange 中的新数组更新周状态。但正如我提到的,页数不会更新。

我在 SO 上看到了很多建议,但似乎没有一个可行。如果您知道如何解决这个问题,请注意,我对 SwiftUI 还很陌生,而且我以前从未使用过 UIKit,所以请在您的回答中详细说明。

Apples 指南中的 PageViewController 代码如下所示:

import SwiftUI
import UIKit

struct PageViewController<Page: View>: UIViewControllerRepresentable {
    var pages: [Page]
    @Binding var currentPage: Int

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: Context) -> UIPageViewController {
        let pageViewController = UIPageViewController(
            transitionStyle: .scroll,navigationorientation: .horizontal)
        pageViewController.dataSource = context.coordinator
        pageViewController.delegate = context.coordinator

        return pageViewController
    }

    func updateUIViewController(_ pageViewController: UIPageViewController,context: Context) {
        pageViewController.setViewControllers(
            [context.coordinator.controllers[currentPage]],direction: .forward,animated: true)
    }

    class Coordinator: NSObject,UIPageViewControllerDataSource,UIPageViewControllerDelegate {
        var parent: PageViewController
        var controllers = [UIViewController]()

        init(_ pageViewController: PageViewController) {
            parent = pageViewController
            controllers = parent.pages.map { UIHostingController(rootView: $0) }
        }

        func pageViewController(
            _ pageViewController: UIPageViewController,viewControllerBefore viewController: UIViewController) -> UIViewController? {
            guard let index = controllers.firstIndex(of: viewController) else {
                return nil
            }
            if index == 0 {
                return controllers.last
            }
            return controllers[index - 1]
        }

        func pageViewController(
            _ pageViewController: UIPageViewController,viewControllerAfter viewController: UIViewController) -> UIViewController? {
            guard let index = controllers.firstIndex(of: viewController) else {
                return nil
            }
            if index + 1 == controllers.count {
                return controllers.first
            }
            return controllers[index + 1]
        }

        func pageViewController(
            _ pageViewController: UIPageViewController,didFinishAnimating finished: Bool,prevIoUsViewControllers: [UIViewController],transitionCompleted completed: Bool) {
            if completed,let visibleViewController = pageViewController.viewControllers?.first,let index = controllers.firstIndex(of: visibleViewController) {
                parent.currentPage = index
            }
        }
    }
}

非常感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。