2015-01-13 18 views
6

'daki kullanıcı kaydırma yönünü alma viewControllerBeforeViewController ve viewControllerAfterViewController numaralı viewControllerAfterViewController numaralı bu iki yöntem kaydırma işleminin yönünü belirtmez.UIPageViewController

UIPageViewController temsilcisinin transitionCompleted yönteminin yöntemi bize ya çok yardımcı olmaz. Sadece sayfa tamamen kaydırılmışsa söyler.

Tam olarak kullanıcı yönünü (sol veya sağ) algılamak için hangi yöntemi kullanmalıyım?

Muhtemelen bu iki özellik yardımcı olabilir:

let directionForward = UIPageViewControllerNavigationDirection.Forward 
let directionReverse = UIPageViewControllerNavigationDirection.Reverse 

Benim kod şöyle görünür:

import UIKit 

class ProView: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

var pageViewController: UIPageViewController? 

let characterImages = ["character1", "character2", "character1", "character2", "character1", "character2", "character1", "character2"] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    createPageViewController() 
    setupPageControl() 

    character = 1 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

// Forward, check if this IS NOT the last controller 
func pageViewController(pageViewController: UIPageViewController, 
    viewControllerAfterViewController ProView: UIViewController) -> UIViewController? { 

     let itemController = ProView as PageItemController 

     // Check if there is another view 
     if itemController.itemIndex+1 < characterImages.count { 

      return getItemController(itemController.itemIndex+1) 
     } 

     return nil 
} 


// Check if this IS NOT the first controller 
func pageViewController(pageViewController: UIPageViewController, 
    viewControllerBeforeViewController ProView: UIViewController) -> UIViewController? { 

    let itemController = ProView as PageItemController 

     if itemController.itemIndex < 0 { 

      return getItemController(itemController.itemIndex-1) 
     } 

     return nil 
} 

private func getItemController(itemIndex: Int) -> PageItemController? { 

    if itemIndex < characterImages.count { 
     let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as PageItemController 
     pageItemController.itemIndex = itemIndex 
     pageItemController.imageName = characterImages[itemIndex] 
     return pageItemController 
} 

    return nil 
} 

func createPageViewController() { 

    let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as UIPageViewController 
    pageController.dataSource = self 
    pageController.delegate = self 

    if characterImages.count > 0 { 
     let firstController = getItemController(0)! 
     let startingViewControllers: NSArray = [firstController] 
     pageController.setViewControllers(startingViewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil) 
    } 

    pageViewController = pageController 
    addChildViewController(pageViewController!) 
    self.view.addSubview(pageViewController!.view) 
    pageViewController?.didMoveToParentViewController(self) 
} 

func setupPageControl() { 
    let appearance = UIPageControl.appearance() 
    appearance.pageIndicatorTintColor = UIColor.grayColor() 
    appearance.currentPageIndicatorTintColor = UIColor.whiteColor() 
} 

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

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 


} 

// BETA 

func pageViewController(PageItemController: UIPageViewController, 
    didFinishAnimating finished: Bool, 
    previousViewControllers pageViewController: [AnyObject], 
    transitionCompleted completed: Bool) 
{ 

    if (!completed) 
    { 
     // You do nothing because whatever page you thought 
     // the book was on before the gesture started is still the correct page 
     return; 
    } 

    // This is where you would know the page number changed and handle it appropriately 

    character = workaround 

    } 


} 

class PageItemController: UIViewController { 

@IBOutlet weak var imageCharacterChoose: UIImageView! 

var itemIndex: Int = 0 
var imageName: String = "" { 
    didSet { 

     if let imageView = imageCharacterChoose {imageCharacterChoose.image = UIImage(named: imageName) 
     } 

    } 
} 
} 

var currentIndex: Int = 0 
var nextIndex: Int = 0 

func pageViewController(PageItemController: UIPageViewController, 
    willTransitionToViewControllers pageViewController: [AnyObject]) { 

     //       pageViewController is the pending View Controller 
     nextIndex = currentIndex 

     // pageViewController...... how do I get its index? 
} 

cevap

16

Geçişin ileri veya geri olup olmadığını belirlemek için hem willTransitionToViewControllers: hem de didFinishAnimating: temsilci yöntemlerini kullanmalısınız. Sınıfınızın başlangıcında birkaç dizin değişkenini bildirin, örneğin currentIndex ve nextIndex (her ikisi de Int).

func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [AnyObject]) { 
    // the page view controller is about to transition to a new page, so take note 
    // of the index of the page it will display. (We can't update our currentIndex 
    // yet, because the transition might not be completed - we will check in didFinishAnimating:) 
    if let itemController = pendingViewControllers[0] as? PageItemController { 
     nextIndex = itemController.itemIndex 
    } 
} 

SON DÜZENLEME

Bu işte çalışabilir

DÜZENLEME: willTransitionToViewControllers yöntemde

bekleyen görünümü denetleyicisi itemIndex eşit nextIndex ayarlamak Geçişin ileriye mi yoksa geriye mi olacağına dikkat edin: nextIndex>currentIndex, daha sonra ileri; nextIndex < currentIndex sonra geri. Sonra completed doğruysa didFinishAnimating yılında, (yani bir sonraki görünüm denetleyicisi geçiş tamamlandı) ekranda şu anda hangi sayfada olduğunu belirtmek gerekir yerde böylece currentIndex kullanabilirsiniz nextIndex eşit currentIndex ayarlayın:

DÜZENLEME bu yöntemlerden ilk argüman pageViewController (UIPageViewController örneği) değil, size mevcut kodu var pageItemController olduğunu

func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [AnyObject], transitionCompleted completed: Bool) { 
    if (completed) { 
     // the page view controller has successfully transitioned to the next view 
     // controller, so we can update our currentIndex to the value we obtained 
     // in the willTransitionToViewControllers method: 
     currentIndex = nextIndex 

    } 
} 

Not.

Son olarak, dikkat etmeniz gereken nokta: (UIPageViewControllerNavigationDirection) 'a atıfta bulunduğunuz enum, yalnızca setViewControllers(_, direction:) yönteminde kullanılır.

SON DÜZENLEME

+0

tam soruma cevap için çok teşekkür ederim. Bekleyen viewController'ın dizinini nasıl alacağımı açıklar mısınız lütfen. "... bekleyen denetleyicinin itemIndex'ine eşit" diyorsunuz, ama bunun nasıl yapılacağına dair ipucum var. Cevabın geri kalanı açık ve güzel koydu - Tekrar teşekkürler! – Cesare

+0

@CeceXX Cevabımı bazı örnek kodlarla güncelledim. – pbasdf

+0

Yeterince TEŞEKKÜR EDemem! – Cesare

0

belirlemenin bir yolu yoktur, pbasdf söylediklerine göre Kullanıcının ileriye veya geriye doğru çekip çekmediği.

pageViewController: viewControllerBeforeViewController:

pageViewController: viewControllerAfterViewController:

Sen görüşlerini öncesi ve sonrası sağlamak amacıyla bu iki yöntem kullanmak gerekir

Bir özelliğe ekleyerek bir dizin takip edebilirsiniz viewControllers için ve sonra pageIndexes karşılaştırabilirsiniz.

+0

ben buna pek de nasıl yapardın? "ViewControllers'a bir özellik ekleyerek bir dizinin kaydını tutabilir ve daha sonra pageIndexes ile karşılaştırabilirsiniz." Teşekkürler! görünüm denetleyicisi Bu eğitimde gibi pageIndex adlı bir özellik olurdu @CeceXX – Cesare

+0

: http://www.makemegeek.com/uipageviewcontroller-example-ios/ –

İlgili konular