2015-05-27 30 views
8

Sayfaları açmak için sola veya sağa kaydırdığımızda iyi çalışan bir UIPageViewController var.iOS Swift: UIPageViewController - Sayfayı programlı olarak çevirme

class ViewController: UIViewController, UIPageViewControllerDataSource { 
... 
} 

Şimdi ben sayfaları bu düğmelerin üzerine tıklayarak açılabilir, böylece çok sayfadaki Önceki/Sonraki düğme sağlamak niyetinde.

Sola kaydırma/sağ davranmayı nasıl tetikleyebilirim VEYA sayfaları programatik olarak nasıl çevirebilirim?

NOT Bu, SWIFT dili, Objective-C için bir sorudur.

+0

[? Mümkün UIPageViewController içinde programlı sayfayı çevirin mı] olası yinelenen (http://stackoverflow.com/questions/7208871/is -it-için-dönüş-sayfa-program-içinde-uipageviewcontroller) –

cevap

5

Bu işlevi kullanın ve istediğiniz animasyon için geçiş stilini ayarlayın.

private func slideToPage(index: Int, completion: (() -> Void)?) { 
    let count = //Function to get number of viewControllers 
    if index < count { 
     if index > currentPageIndex { 
      if let vc = viewControllerAtIndex(index) { 
       self.pageViewController.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: { (complete) -> Void in 
        self.currentPageIndex = index 
        completion?() 
       }) 
      } 
     } else if index < currentPageIndex { 
      if let vc = viewControllerAtIndex(index) { 
       self.pageViewController.setViewControllers([vc], direction: UIPageViewControllerNavigationDirection.Reverse, animated: true, completion: { (complete) -> Void in 
        self.currentPageIndex = index 
        completion?() 
       }) 
      } 
     } 
    } 
} 

viewControllerAtIndex(index: Int) -> UIViewController? için tokatlamak için doğru görünüm denetleyicisi almak için kendi fonksiyonudur:

enter image description here

+1

JordanC> Bir düğmeye tıklayarak sayfayı açmak gerekiyor - bu yüzden yukarıdaki işlevi nasıl kullanırım? – Jasper

+0

@Jasper UIButton oluşturun ve tıklandığında, UIPageViewController sayfanızda hangi sayfanın olduğunu anlayın ve bu sayfayı setViewControllers yöntemine aktarın. – JordanC

2

enter image description here

İşte bu bir hızla uygulanmasıdır.

30

Genelde sayfa dizinleri ve ne ile uğraşmaya gerek yok. Şanslar zaten görüntülemek için bir önceki veya sonraki ViewController almak için gereken tüm sahip olan bir dataSource: UIPageViewControllerDataSource uygularsınız.

Swift 2.2 Örnek:

extension UIPageViewController { 

    func goToNextPage(){ 

     guard let currentViewController = self.viewControllers?.first else { return } 

     guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfterViewController: currentViewController) else { return } 

     setViewControllers([nextViewController], direction: .Forward, animated: false, completion: nil) 

    } 


    func goToPreviousPage(){ 

     guard let currentViewController = self.viewControllers?.first else { return } 

     guard let previousViewController = dataSource?.pageViewController(self, viewControllerBeforeViewController: currentViewController) else { return } 

     setViewControllers([previousViewController], direction: .Reverse, animated: false, completion: nil) 

    } 

} 

Eğer geçiş yapıyorsanız sayfalar tam olduğunu sen garanti olsun bu yolu nedir PageViewController en tetikleyecek jestleri inşa.

+2

Bu sizin fikrinizi kullanarak 'presentationIndexForPageViewController' nasıl güncelleyeceğinizi anlamaya zor bir zaman geçiriyorum. "PageItemViewController" öğesinde, "itemIndex" adlı bir değişken var. Bunu bu uzantı içinde nasıl belirlerim? – Adrian

+0

Zamanlayıcı ile func goToNextPage() kullandım - Zamanlayıcı ile bir sonraki sayfaya geçmek için bu yöntemi nasıl kullanabilirim? Burada benim sorum https://stackoverflow.com/questions/45025088/change-pages-in-uipageviewcontroller-automatically-with-timer-in-swift-3?noredirect=1#comment77027842_45025088 –

+0

Lifesaver !!! Çok teşekkürler. Swift 3 versiyonunu sadece ileride referans olarak yayınlayacağım. – Gix

2

thatjuan 'ın cevabı Swift 3 sürümü (animated parametresine küçük çimdik ile bunu gerektiği gibi varsayılan olarak animasyonlu, ama yine de işlevinde bir parametre süreceğe) durumda herkes buna ihtiyacı:

extension UIPageViewController { 

    func goToNextPage(animated: Bool = true) { 
     guard let currentViewController = self.viewControllers?.first else { return } 
     guard let nextViewController = dataSource?.pageViewController(self, viewControllerAfter: currentViewController) else { return } 
     setViewControllers([nextViewController], direction: .forward, animated: animated, completion: nil) 
    } 

    func goToPreviousPage(animated: Bool = true) { 
     guard let currentViewController = self.viewControllers?.first else { return } 
     guard let previousViewController = dataSource?.pageViewController(self, viewControllerBefore: currentViewController) else { return } 
     setViewControllers([previousViewController], direction: .reverse, animated: animated, completion: nil) 
    } 

} 
0

Buradan çıkmak, tanımlı bir protokolü kullanmak ve görüntüleme denetleyicilerini programlı olarak değiştirmek isteyen herhangi biri kullanmak isteyebilir.

@objc protocol AppWalkThroughDelegate { 
    @objc optional func goNextPage(forwardTo position: Int) 
    @objc optional func goPreviousPage(fowardTo position: Int) 
} 

yukarıdaki protokolünü kullanın ve görünümü denetleyicileri arasındaki navigasyonu yönetmek için kök UIPageViewController için onaylayın.

aşağıda Örnek:

class AppWalkThroughViewController: UIPageViewController, UIPageViewControllerDataSource, AppWalkThroughDelegate { 

    // Add list of view controllers you want to load 

    var viewControllerList : [UIViewControllers] = { 
     let firstViewController = FirstViewController() 
     let secondViewController = SecondViewController() 
     // Assign root view controller as first responder 
     secondViewController.delegate = self 

     let thirdViewController = ThirdViewController() 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.dataSource = self 
    } 

    // Navigate to next page 
    func goNextPage(fowardTo position: Int) { 
     let viewController = self.viewControllerList[position] 
     setViewControllers([viewController], direction: 
     UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil) 
    } 

    } 

kez bütün bu elde, temsilci emlak üzerine belirli sayıda geçirerek AppWalkThroughDelegate yöntemlerini kullanabilirsiniz sonraki veya önceki sayfaya UIPageViewController hamle yapmak gerekir çocuk görünümü denetleyicileri.

Örnek altında : düğmesi

class SecondViewController: UIViewController { 

     var delegate: AppWalkThroughDelegate! 

     override func viewDidLoad() { 
      super.viewDidLoad() 
      self.dataSource = self 
     } 

     @IBAction func goNextPage(_ sender: Any) { 
      // Can be any number but not outside viewControllerList bounds 
      delegate.goNextPage!(fowardTo: 2) 
     } 
    } 
preslenmiş kez Delege yöntem çağrıldığında