如何解决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 举报,一经查实,本站将立刻删除。