Swiftui 迅捷+;UIPageViewController,多种视图类型
我想在我的SwiftUI应用程序中使用UIPageViewController,如中所示。但是,本教程传递的视图类型与页面相同,我希望传递任何类型的视图Swiftui 迅捷+;UIPageViewController,多种视图类型,swiftui,uikit,uipageviewcontroller,uiviewcontrollerrepresentable,Swiftui,Uikit,Uipageviewcontroller,Uiviewcontrollerrepresentable,我想在我的SwiftUI应用程序中使用UIPageViewController,如中所示。但是,本教程传递的视图类型与页面相同,我希望传递任何类型的视图 struct PageViewController<Page: View>: UIViewControllerRepresentable { var pages: [Page] @Binding var currentPage: Int func makeCoordinator() -> Co
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.delegate = context.coordinator
return pageViewController
}
func updateUIViewController(_ pageViewController: UIPageViewController, context: Context) {
pageViewController.setViewControllers(
[context.coordinator.controllers[currentPage]], direction: .forward, animated: true)
}
class Coordinator: NSObject, UIPageViewControllerDelegate {
var parent: PageViewController
var controllers = [UIViewController]()
init(_ pageViewController: PageViewController) {
parent = pageViewController
controllers = parent.pages.map { UIHostingController(rootView: $0) }
}
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
}
}
}
}
struct PageView<Page: View>: View {
var pages: [Page]
@State var currentPage = 0
var body: some View {
ZStack {
PageViewController(pages: pages, currentPage: $currentPage)
}
}
}
struct PageView_Previews: PreviewProvider {
static var previews: some View {
PageView(pages: [
Color.red,
Color.blue
// I want to add other view types here
])
}
}
struct PageViewController:UIViewControllerRepresentable{
变量页面:[第页]
@绑定变量currentPage:Int
func makeCoordinator()->Coordinator{
协调员(自我)
}
func makeUIViewController(上下文:context)->UIPageViewController{
让pageViewController=UIPageViewController(
transitionStyle:。滚动,
导航方向:。水平)
pageViewController.delegate=context.coordinator
返回页面视图控制器
}
func updateUIViewController(uPageViewController:UIPageViewController,上下文:上下文){
pageViewController.SetViewController(
[context.coordinator.controllers[currentPage]],方向:。前进,动画:true)
}
类协调器:NSObject,UIPageViewControllerDelegate{
var父级:PageViewController
变量控制器=[UIViewController]()
初始化(uPageViewController:pageViewController){
父项=页面视图控制器
controllers=parent.pages.map{UIHostingController(rootView:$0)}
}
页视图控制器(
_pageViewController:UIPageViewController,
完成了:布尔,
PreviousViewController:[UIViewController],
过渡已完成:Bool){
如果完成,
让visibleViewController=pageViewController.ViewController?。首先,
让index=controllers.firstIndex(of:visibleViewController){
parent.currentPage=索引
}
}
}
}
结构页面视图:视图{
变量页面:[第页]
@状态变量currentPage=0
var body:一些观点{
ZStack{
PageViewController(页面:页面,当前页面:$currentPage)
}
}
}
结构页面视图\u预览:PreviewProvider{
静态var预览:一些视图{
页面视图(页面:[
颜色,红色,
蓝色
//我想在这里添加其他视图类型
])
}
}
如果我将PageView_预览中的页面数组更改为类似于[Color.red,Text(“abc”)]的内容,则会出现错误,因为它们的类型不同。如何让SwiftUI在这里允许异构视图类型
我无法将TabView与PageTabViewStyle结合使用(有很多错误),因此我需要使用此UIKit方法。您可以将页面包装在
任意视图中:
PageView(pages: [
AnyView(Color.red),
AnyView(Color.blue),
AnyView(Text("Hi"))
])
我发现这个SwiftUIPager是PageTabViewStyle的一个很好的替代品: