【问题标题】:Hide dots on final page of UIPageViewController swift在 UIPageViewController swift 的最后一页上隐藏点
【发布时间】:2016-07-23 07:55:53
【问题描述】:

我在 UIPageViewController 中有四个页面,我想隐藏最后一页上的点。我成功地制作了一个在 UIPageViewController 的最后一页上调用的函数。基本上,如果当前视图是最后一个视图,则调用它。但是我应该在那个函数中添加什么来暂时隐藏这些点呢?

我找到了这个https://stackoverflow.com/a/32016614/5700898,但它对那个函数内部的内容没有帮助。普通方法(在所有页面上隐藏页面点)不是我需要的。

如何仅在 UIPageViewController 的最后一页隐藏页面指示点?

编辑:这是我要求的代码。

import UIKit

class TutorialController: UIPageViewController {

    let pageControl = UIPageControl.appearanceWhenContainedInInstancesOfClasses([])

    var currentview = "0"

    private func stylePageControl() {

        pageControl.currentPageIndicatorTintColor = UIColor.lightGrayColor()
        pageControl.pageIndicatorTintColor = UIColor.darkGrayColor()
        pageControl.backgroundColor = UIColor.whiteColor()
    }

    private func hidePageControl() { // this should let us hide the dots on the fourth view, by changing color.

        pageControl.backgroundColor = UIColor(red: 0.2980392157, green: 0.2980392157, blue: 0.2980392157, alpha: 1.0)
        pageControl.currentPageIndicatorTintColor = UIColor(red: 0.2980392157, green: 0.2980392157, blue: 0.2980392157, alpha: 1.0)
        pageControl.pageIndicatorTintColor = UIColor(red: 0.2980392157, green: 0.2980392157, blue: 0.2980392157, alpha: 1.0)
    }


    private(set) lazy var orderedViewControllers: [UIViewController] = {
        return [self.newViewController("1"),
                self.newViewController("2"),
                self.newViewController("3"),
                self.newViewController("4")]
    }()

    private func newViewController(number: String) -> UIViewController {
        return UIStoryboard(name: "Main", bundle: nil) .
            instantiateViewControllerWithIdentifier("Tutorial\(number)") // calls the next view controller.
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        stylePageControl() // just changing the color, this works.
        dataSource = self

        if let firstViewController = orderedViewControllers.first {
            setViewControllers([firstViewController],
                               direction: .Forward,
                               animated: true,
                               completion: nil)
        }

    }
}

// MARK: UIPageViewControllerDataSource

extension TutorialController: UIPageViewControllerDataSource {

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
        return orderedViewControllers.count

    }

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
        guard let firstViewController = viewControllers?.first,
            firstViewControllerIndex = orderedViewControllers.indexOf(firstViewController) else {
                return 0
        }

        return firstViewControllerIndex
    }


    func pageViewController(pageViewController: UIPageViewController,
                            viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
            return nil
        }

        let previousIndex = viewControllerIndex - 1


        guard previousIndex >= 0 else {
            return nil
        }

        guard orderedViewControllers.count > previousIndex else {
            return nil
        }

        return orderedViewControllers[previousIndex]
    }

    func pageViewController(pageViewController: UIPageViewController,
                            viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        guard let viewControllerIndex = orderedViewControllers.indexOf(viewController) else {
            return nil
        }

        let nextIndex = viewControllerIndex + 1
        currentview = "\(nextIndex)"
        print("now on tutorial slide \(currentview)")
        if currentview == "4" { // this is called successfully when the fourth page comes into view.
            print("we are now on the fourth slide; hiding the page dots...") // this successfully prints.


      UIPageControl.appearanceWhenContainedInInstancesOfClasses([TutorialController.s‌​elf]).hidden = true // this should hide the all page controller dots, but it just doesn't work.
        pageControl.hidden = true // also should hide page controller dots, also doesn't work.
        hidePageControl() // this should change the color of the page controller dots, but doesn't (note that this function works to change color when I call it on viewDidLoad, but that's not where I want it; it doesn't work here).

        print(pageControl.hidden) // always prints false, even though I am trying to set it to true.

        }

        let orderedViewControllersCount = orderedViewControllers.count

        guard orderedViewControllersCount != nextIndex else {
            return nil
        }

        guard orderedViewControllersCount > nextIndex else {
            return nil
        }

        return orderedViewControllers[nextIndex]
    }

}

【问题讨论】:

    标签: ios swift swift2 uipageviewcontroller uipagecontrol


    【解决方案1】:

    这是 UIPageViewController 的完整代码,用于隐藏最后一页的点,它工作正常

    首先为 UIViewController 创建类并添加 UIPageViewControllerDelegate , UIPageViewControllerDataSource

    为 pageControl 创建出口

    @IBOutlet 弱变量 pageControl: UIPageControl!

    为 uipagecontroller 创建变量

    var pageControllerContainer : UIPageViewController!
    
    var pages = [UIViewController]()
    
    var currentIndex : Int?
    
    private var pendingIndex : Int?
    private var lastIndex : Int?
    

    在 ViewDidLoad 中:添加以下行:

     let page1 : UIViewController! = self.storyboard?.instantiateViewController(withIdentifier: "YourFirstPageViewController") as! YourFirstPageViewController
        let page2 : UIViewController! = self.storyboard?.instantiateViewController(withIdentifier: "YourSecondPageViewController") as! YourSecondPageViewController
        let page3 : UIViewController! = self.storyboard?.instantiateViewController(withIdentifier: "YourThirdPageViewController") as! YourThirdPageViewController
    
        pages.append(page1)
        pages.append(page2)
        pages.append(page3)
    
        pageControllerContainer = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
        pageControllerContainer.delegate = self
        pageControllerContainer.dataSource = self
        pageControllerContainer.setViewControllers([page1], direction: .forward, animated: true, completion: nil)
    
        view.addSubview(pageControllerContainer.view)
        view.bringSubview(toFront: pageControl)
        pageControl.numberOfPages = pages.count
        pageControl.currentPage = 0
    

    现在为 pageviewcontroller 创建以下委托方法:

         func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
    
        let currentIndex = pages.index(of: viewController)
    
        if currentIndex == 0
        {
            return nil
        }
        let previousIndex = abs((currentIndex! - 1) % pages.count)
        return pages[previousIndex]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
    
    
        let currentIndex = pages.index(of: viewController)
    
        if currentIndex == pages.count - 1
        {
            return nil
        }
    
        let nextIndex = abs((currentIndex! + 1 ) % pages.count)
        return pages[nextIndex]
    }
    

    之后创建以下数据源方法

        func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
    
        pendingIndex = pages.index(of: pendingViewControllers.first!)
    
    }
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    
        if completed
        {
    
            currentIndex = pendingIndex
            if let index = currentIndex
            {
                pageControl.currentPage = index
            }
        }
         lastIndex = pages.count - 1
          print(lastIndex as Any)
          print(currentIndex as Any)
    
        if currentIndex == lastIndex
        {
            pageControl.isHidden = true
        }
        else
        {
            pageControl.isHidden = false
        }
    }
    

    当涉及到最后一个索引意味着最后一页时,这将允许隐藏页面控制器

    希望这会有所帮助 :-) 谢谢...

    【讨论】:

    • 我会试试这个!感谢您的回答,如果它有效,我会告诉您。
    【解决方案2】:

    我发现您实际上无法隐藏页面控件,因为它永远无法正常工作。但是有点技巧是将其添加到您的代码中:

        func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) {
            if let lastVC = pendingViewControllers.last?.isKindOfClass(youLastViewController){
                if lastVC == true {
                    for view in self.view.subviews {
                        if view is UIScrollView {
                            view.frame = UIScreen.mainScreen().bounds
                        } else if view is UIPageControl {
                            view.center.y = self.view.frame.height * 1.5
                        }
                    }
                }else {
                    for view in self.view.subviews {
                        if view is UIScrollView {
                            view.frame = UIScreen.mainScreen().bounds
                        } else if view is UIPageControl {
                            view.center.y = self.view.frame.height * 0.92
                        }
                    }
                }
            }
        }
    }
    

    这实际上是移动屏幕的页面控件和隐藏它一样。

    【讨论】:

    • 几天不在我的mac前,很快就会测试。感谢您的回答!
    【解决方案3】:

    使用 UIPageViewControllerDelegate 方法:

    let pageControl = UIPageControl()
    
    func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        if (index == numberOfPages()-1){
              pageControl.hidden = true
        }else{
              pageControl.hidden = false
        }
    }
    

    【讨论】:

      【解决方案4】:

      在此处查看接受的答案以获取 UIPageControl(带点的视图):

      Access the UIPageControl created by iOS6 UIPageViewController?

      然后,一旦你有了 pageControl,你就可以在pageViewController: didFinishAnimating: 中检查它是否是最后一页,如果是,则设置pageControl.hidden = true

      【讨论】:

      • 所以我真的很接近:我有在最后一页时成功调用的函数。在那个函数中,我有pageControl.hidden = true。所以这应该工作!但它没有,因为出于某种原因 pageControl 不会隐藏。即使打印 print(pageControl.hidden) 也会返回 false。那么这里发生了什么?
      • 嗯。也许你没有得到正确的页面控制。您周围是否有多个页面控件?你也可以试试UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClass.self]).hidden = true。这将影响您指定的任何类中的所有 UIPageControl 实例。
      • 我试过了,但还是没有骰子:UIPageControl.appearanceWhenContainedInInstancesOfClasses([TutorialController.self]).hidden = true
      • 另外,请注意:我在控制所有四个页面及其分页的主 UIPageViewController 中执行所有这些操作,而不是在任何特定视图中。
      • 您可以粘贴您的代码以便我仔细查看吗?
      【解决方案5】:
      override func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
          if /*current index is the last one*/ {
              return 0
          } else {
              /*return number of pages*/
          }
      }
      

      【讨论】:

      • 所以只要把它放在我的代码中就会自动隐藏页面点?
      猜你喜欢
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多