2016-06-11 9 views
1

Ich habe eine Anwendung, die den UIPageViewController schön verwendet, um eine Reihe von (fast Vollbild) Karten für den Benutzer zu zeigen. Einige Benutzer erhalten jedoch (zunächst) nicht, dass sie nach links/rechts wischen können, um alle Karten zu durchlaufen (selbst wenn die Punkte auf dem Bildschirm vorhanden sind, gehen Sie das :).UIPageViewController Animation um anzuzeigen, Swipe ist möglich

Meine Idee ist, eine kleine einmalige Animation zu machen, die teilweise zur Hälfte der nächsten Karte wischt und dann zurückspringt, um dem Benutzer sehr intuitiv zu zeigen, dass das Wischen möglich ist.

Ich schaute auf die API UIPageViewController, aber ich sehe keine Funktionen, die mir dies standardmäßig ermöglichen.

Was wäre der beste Weg, dies zu implementieren (aber immer noch den Standard UIPageViewController verwenden)? Wäre es möglich, gefälschte Gesten in den UIPageViewController zu senden?

+0

Fake it. Richten Sie eine Ansicht ein, die wie der Seitenaufruf-Controller aussieht, und animieren Sie sie. – matt

+0

Ich könnte das tun, aber das würde bedeuten, dass ich genau das gleiche Layout wie die Seitenansicht erstellen muss, und das fühlt sich für mich nicht als eine nette Lösung an. Vielleicht könnte ich Zugang zu dem darunterliegenden Scrollview bekommen und etwas damit tun, das ich gerade gefragt habe ... – HixField

+0

Recreate, no. Mach einfach einen Schnappschuss. – matt

Antwort

2

Ich habe einen Weg gefunden, der die Standardverhalten von UIPageViewController verwendet. Grundsätzlich ist es einfach, ich warte, bis die Ansicht geladen ist, und im viewDidAppear NACH 0,5 Sekunden gehe ich zur nächsten Seite (programmatisch), fast unmittelbar nach (0,25 Sekunden) - bevor die erste Animation beendet ist - gehe ich zurück zum vorherige Seite.

Im Folgenden finden Sie meinen Code sehen können, beachten Sie, dass ich eine Verzögerungsfunktion zum Objekt Verzögerungen in meinem Code verwende, seine ebenfalls enthalten:

///executes the supplied closure after x seconds on the main queue 
public func delay(delay:Double, closure:()->()) { 
    dispatch_after(
     dispatch_time(
      DISPATCH_TIME_NOW, 
      Int64(delay * Double(NSEC_PER_SEC)) 
     ), 
     dispatch_get_main_queue(), closure) 
} 



class VCPager: VCPagBase, ProtocolVCScanResult, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

    var product    : Product? 
    var productMatch  : ProductMatch? 
    var disableAlternatives : Bool = false 

    //the loadView is a proprietary function that just loads the view from the storyboard, nothing special 
    lazy var vcPage1 = VCPage1.loadView() 
    lazy var vcPage2 = VCPage2.loadView() 

    var currentPageIndex : Int = 0 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     dataSource=self 
     delegate=self 
     setViewControllers([pageForindex(0)!], direction: .Forward, animated: false, completion: nil) 
    } 


    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     hintSwipe() 
    } 

    //MARK: - helper functions 

    func hintSwipe() { 
     delay(0.5) { 
      self.carrouselJumpForward() 
     } 
     delay(0.75) { 
      self.carrouselJumpBack() 
     } 
    } 

    func pageForindex(pageIndex : Int) -> UIViewController? { 
     let vc : VCScanResultPageRoot? 
     switch(pageIndex) { 
     case -1 : vc = vcPage2 
     case 0 : vc = vcPage1 
     case 1 : vc = vcPage2 
     case 2 : vc = vcPage1 
     default : vc = nil 
     } 
     vc?.passAlongModelFrom(self) 
     return vc 
    } 

    func indexForPage(vc : UIViewController) -> Int { 
     if vc == vcPage1 { return 0 } 
     if vc == vcPage2 { return 1 } 
     //not found = 0 
     return 0 
    } 

    func carrouselJumpForward() { 
     currentPageIndex += 1 
     setViewControllers([self.pageForindex(currentPageIndex)!], direction: .Forward, animated: true, completion: nil) 
    } 

    func carrouselJumpBack() { 
     currentPageIndex += -1 
     setViewControllers([self.pageForindex(currentPageIndex)!], direction: .Reverse, animated: true, completion: nil) 
    } 

    //MARK: - UIPageView 


    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
     let currentPageIndex = indexForPage(viewController) 
     return pageForindex(currentPageIndex+1) 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
     let currentPageIndex = indexForPage(viewController) 
     return pageForindex(currentPageIndex-1) 
    } 

    func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
     guard let vcCurrentPage = previousViewControllers.first where finished else { 
      return 
     } 
     currentPageIndex = indexForPage(vcCurrentPage) 
    } 

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
     return 2 
    } 

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
     return currentPageIndex 
    } 


} 
Verwandte Themen