2016-04-03 6 views
1

Ich habe vier Seiten in einem UIPageViewController, und ich möchte die Punkte auf der letzten Seite ausblenden. Ich habe erfolgreich eine Funktion erstellt, die auf der letzten Seite des UIPageViewControllers aufgerufen wird. Wenn die aktuelle Ansicht die letzte ist, wird sie aufgerufen. Aber was stelle ich in diese Funktion, um die Punkte vorübergehend zu verstecken?Verstecken Punkte auf der letzten Seite von UIPageViewController swift

Ich fand diese https://stackoverflow.com/a/32016614/5700898, aber es hilft nicht mit, was in dieser Funktion geht. Die normale Methode (Seitenpunkte auf allen Seiten ausblenden) ist nicht das, was ich brauche.

Wie kann ich die Seitenindikatorpunkte nur auf der letzten Seite eines UIPageViewControllers ausblenden?

Bearbeiten: Hier ist mein Code wie gefragt.

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] 
    } 

} 

Antwort

-1
override func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
    if /*current index is the last one*/ { 
     return 0 
    } else { 
     /*return number of pages*/ 
    } 
} 
+0

Also nur, dass in meinem Code setzt automatisch die Seitenpunkte ausblenden? – owlswipe

0

Überprüfen Sie die akzeptierte Antwort hier aus die UIPageControl (die Ansicht mit den Punkten) zu erhalten:

Access the UIPageControl created by iOS6 UIPageViewController?

Dann, sobald Sie die Pagecontrol haben, in pageViewController: didFinishAnimating: können Sie überprüfen, Wenn es die letzte Seite ist, und wenn ja, setzen Sie pageControl.hidden = true.

+0

Also ich bin ganz in der Nähe: Ich habe die Funktion, die erfolgreich aufgerufen wurde, wenn es die letzte Seite ist. In dieser Funktion habe ich 'pageControl.hidden = true'. Das sollte also funktionieren! Aber das tut es nicht, weil sich pageControl aus irgendeinem Grund nicht versteckt. Sogar das Drucken von 'print (pageControl.hidden)' gibt false zurück. Also, was ist hier los? – owlswipe

+0

Hmm. Vielleicht bekommst du nicht die richtige Seitenkontrolle. Haben Sie mehr als eine Seitenkontrolle? Sie können auch 'UIPageControl.apparanceWhenContainedInInstancesOfClasses ([MyClass.self]). Hidden = true 'versuchen. Dies wirkt sich auf alle Instanzen von UIPageControl aus, die sich innerhalb der von Ihnen angegebenen Klasse befinden. – Hash88

+0

Ich versuchte dies, aber keine Würfel noch: 'UIPageControl.AppearanceWhenContainedInInstancesOfClasses ([TutorialController.self]). Hidden = true' – owlswipe

1

die Methode UIPageViewControllerDelegate verwenden:

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 
    } 
} 
1

Ich fand, dass Sie nicht wirklich die Seitensteuerung verstecken kann, da es nur funktioniert nie. Aber ein bisschen wie ein Hack ist dies, um Ihren Code hinzuzufügen:

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 
        } 
       } 
      } 
     } 
    } 
} 

Dies ist eigentlich die Seite die Kontrolle über den Bildschirm bewegen und die gleiche, wie sie sich versteckt.

+0

Nicht vor meinem Mac für ein paar Tage, wird bald testen. Danke für die Antwort! – owlswipe

1

hier ist der vollständige Code von UIPageViewController Punkten von den letzten Seite zu verstecken ist es gut funktionieren

zuerst für UIViewController-Klasse erstellen und fügen Sie UIPageViewControllerDelegate, UIPageViewControllerDataSource

Auslass für Pagecontrol

@IBOutlet schwach var erstellen pageControl: UIPageControl!

erstellen Variable für uipagecontroller

var pageControllerContainer : UIPageViewController! 

var pages = [UIViewController]() 

var currentIndex : Int? 

private var pendingIndex : Int? 
private var lastIndex : Int? 

in ViewDidLoad: in folgenden Zeilen:

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 

nun folgenden Delegierten Verfahren zur pageviewcontroller erstellen:

 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] 
} 

nach, dass folgende Datenquelle Methoden erstellen

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 
    } 
} 

dies wird ermöglicht Seite Controller zu verstecken, wenn es zum letzten Index kommt bedeutet letzte Seite

hoffen, dass dies hilft :-) danke ...

+0

Ich werde das versuchen! Danke für die Antwort, ich werde Sie wissen lassen, ob es funktioniert. – owlswipe