Как я могу изменить цвет фона pageViewController?

#swiftui #background-color #uipageviewcontroller

#swiftui #background-color #uipageviewcontroller

Вопрос:

Как я могу изменить цвет фона области, которая является белой?

Я использовал UIViewControllerRepresentable, но я не знаю, как изменить цвет UIViewControllers.

Я думаю, мне нужно изменить цвет фона в функции makeUIViewController?

Я не очень хорошо знаю английский, надеюсь, я мог бы объяснить свою проблему.

съемка экрана

OnboardingView:

     struct OnboardingView: View {
        
        @State var currentPageIndex = 0
        
        let timer = Timer.publish(every: 2, on: .main, in: .common).autoconnect()
        var subviews = [
            UIHostingController(rootView: SubView(imageString: "1")),
            UIHostingController(rootView: SubView(imageString: "1")),
            UIHostingController(rootView: SubView(imageString: "1"))
        ]
        var titles = ["Take some time out", "Conquer personal hindrances", "Create a peaceful mind"]
        var captions =  ["Take your time out and bring awareness into your everyday life", "Meditating helps you dealing with anxiety and other psychic problems", "Regular medidation sessions creates a peaceful inner mind"]
        
        var body: some View {
            VStack(alignment: .leading) {
                Group {
                    Text(titles[currentPageIndex])
                        .font(.title)
                    Text(captions[currentPageIndex])
                        .font(.subheadline)
                        .frame(width: 300, height: 50, alignment: .center)
                        .lineLimit(nil)
                }
                .padding()
                
                PageViewController(currentPageIndex: $currentPageIndex, viewControllers: subviews)
                    .frame(height: 600)
                    .background(Color.yellow)
             ...
          }
     }
}
       
  

pageViewController:

 struct PageViewController: UIViewControllerRepresentable {
    
    @Binding var currentPageIndex: Int
    
    var viewControllers: [UIViewController]
    
    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(
            [viewControllers[currentPageIndex]], direction: .forward, animated: true)
    }
    
    class Coordinator: NSObject, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
        
        var parent: PageViewController

        init(_ pageViewController: PageViewController) {
            self.parent = pageViewController
        }
        
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
            
            guard let index = parent.viewControllers.firstIndex(of: viewController) else {
                 return nil
             }
            
            if index == 0 {
                return parent.viewControllers.last
            }
 
            return parent.viewControllers[index - 1]
            
        }
        
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
            
            guard let index = parent.viewControllers.firstIndex(of: viewController) else {
                return nil
            }
            
            if index   1 == parent.viewControllers.count {
                return parent.viewControllers.first
            }
            
            return parent.viewControllers[index   1]
        }
        
        func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
            if completed,
                let visibleViewController = pageViewController.viewControllers?.first,
                let index = parent.viewControllers.firstIndex(of: visibleViewController)
            {
                parent.currentPageIndex = index
            }
        }
    }
}
 
  

Ответ №1:

Вам нужно установить backgroundColor ваши подвиды.

Вы можете сделать это либо в OnboardingView , либо в PageViewController :

 func makeUIViewController(context: Context) -> UIPageViewController {
    ...
    // make the subviews transparent
    viewControllers.forEach {
        $0.view.backgroundColor = .clear
    }
    ...
}