Динамически изменить цвет фона точек UIPageControl.appearance - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть UIPagevViewController, который используется, чтобы показать 4 ViewControllers.Я хочу, чтобы цвет фона точек менялся в зависимости от цвета фона представления, которым я сейчас занят.Хотя мне удалось получить одинаковый цвет фона для точек и первой страницы, я не смог сделать это для всех остальных.Другими словами, я хочу динамически изменить фон точек на основе отображаемого вида

           import UIKit

            class PageViewController: UIPageViewController,UIPageViewControllerDelegate, UIPageViewControllerDataSource {

            //my 4 viewControllers used in the UIPageViewController
            fileprivate lazy var pages : [UIViewController] = {
                return [
                    self.getViewController(withIdentifier: "firstViewControllerID"),
                    self.getViewController(withIdentifier: "secondViewControllerID"),
                    self.getViewController(withIdentifier: "thirdViewControllerID"),
                    self.getViewController(withIdentifier: "differentViewController")

                ]
            }()

         //function that accesses those view controllers used above from the storyboard
            fileprivate func getViewController(withIdentifier identifier: String) -> UIViewController
                {
                    return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: identifier)
                }
         /* needed function for the UIPageViewControllerDelegate, UIPageViewControllerDataSource protocols 
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
                  //Some Code. Unnecessary for the question
                }

            func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
                 {
                       //Some Code. Unnecessary for the question
                 }
          */
        //function where the dots colours are set
        private func setupPageControl() {
        let appearance = UIPageControl.appearance(whenContainedInInstancesOf: [UIPageViewController.self])
        appearance.pageIndicatorTintColor = UIColor.gray
        appearance.currentPageIndicatorTintColor = UIColor.red
        appearance.backgroundColor = pages[appearance.currentPage].view.backgroundColor
    }

    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        setupPageControl()
        return pages.count
    }


    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return 0
    }




    override func viewDidLoad() {
        super.viewDidLoad()


       self.dataSource = self
       delegate = self
        if let firstVC = pages.first {
            setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
            setupPageControl()

        }
    }



}

enter image description here

enter image description here

Первое изображение-> Первая страница.Второе изображение-> вторая страница.Посмотрите на цвет фона точек

1 Ответ

0 голосов
/ 27 ноября 2018

К сожалению, у вас нет прямого доступа к элементу управления страницей, встроенному в UIPageViewController.Поэтому вы должны использовать внешний прокси-сервер, чтобы изменить его внешний вид (как вы уже делаете).Но внешний вид прокси влияет только на будущие экземпляры вещи;когда элемент управления страницей уже присутствует, настройка прокси внешнего вида не окажет никакого влияния (как вы обнаружили).

Поэтому самое простое решение - отказаться от элемента управления страницей, встроенного в UIPageViewController, и просто использоватьваш собственный UIPageControl, чьи точки вы можете изменить напрямую.Вам придется согласовать его с контроллером просмотра страниц, но это не сложно.

Другая возможность - попытаться получить прямой доступ к UIPageControl UIPageViewController.Это хрупко, потому что нет официального доступа, но этот метод обсуждался здесь, как, например, в этот ответ .

...