2015-01-13 11 views
6

UIPageViewControllerDataSourceviewControllerBeforeViewControllerviewControllerAfterViewControllerは、スワイプの方向を知らせません。UIPageViewControllerでスワイプ方向を取得する

UIPageViewController代理人のtransitionCompletedもお役に立てません。ページが完全にスワイプされたかどうかを確認するだけです。

ユーザーの方向(左または右)を正確に検出するにはどのような方法を使用する必要がありますか?

はおそらく、これらの2つのプロパティが役立つことがあります。

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

私のコードは次のようになります。

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

答えて

16

トランジションが順方向であるか逆方向であるかを確認するには、willTransitionToViewControllers:didFinishAnimating:の両方の代理メソッドを使用する必要があります。クラスの先頭にいくつかのインデックス変数、例えばcurrentIndexnextIndex(どちらもInt)を宣言してください。 willTransitionToViewControllers方法において

は、保留中のビューコントローラのitemIndexに等しいnextIndexを設定します。あなたがこれをうまくでき

EDIT

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

ENDのEDIT

を移行が前進か後退かを指示する:nextIndex>currentIndex、次に進む。 nextIndex < currentIndexの場合は後方に移動します。その後completedがtrueの場合didFinishAnimatingに、(それは、次のビューコントローラへの移行を完了した)あなたは、画面上で現在どのページを示すために、必要な場所ので、あなたはcurrentIndexを使用することができますnextIndexに等しいcurrentIndexを設定します。

EDIT

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 

    } 
} 

、あなたの現在のコードを持っているこれらのメソッドの最初の引数はpageViewController(UIPageViewControllerのインスタンス)であることに注意してください、ではないpageItemController

最後に、あなたが参照する列挙型(UIPageViewControllerNavigationDirection)がsetViewControllers(_, direction:)メソッドでのみ使用されていることに注意してください。

のEND EDIT

+0

私の質問に正確に答えてくれてありがとう。保留中のviewControllerのインデックスを取得する方法を説明してください。あなたは "...保留中のView ControllerのitemIndexと等しい"と言っていますが、私はそれを行う方法について手がかりを得ています。答えの残りの部分は明確できちんと入れられています - もう一度ありがとう! – Cesare

+0

@CeceXX私はいくつかのサンプルコードで私の答えを更新しました。 – pbasdf

+0

私はちょうど十分にあなたを感謝することはできません! – Cesare

0

を決定する方法はありません、pbasdfが言ったことによりますユーザーが前方または後方にスワイプしたかどうか。

あなたは前と後のビューを提供するために、これらの2つのメソッドを使用する必要があります。

pageViewController:viewControllerBeforeViewController:

pageViewController:viewControllerAfterViewController:

をあなたがプロパティを追加することで、インデックスを追跡することができますviewControllerに渡してから、pageIndexesを比較することができます。

+0

私はまさにそれをどのように行うのでしょうか? "viewControllersにプロパティを追加することでインデックスを追跡し、pageIndexesを比較することができます。"ありがとう! – Cesare

+0

@CeceXXこのチュートリアルのように、View ControllerにはpageIndexというプロパティがあります。http://www.makemegeek.com/uipageviewcontroller-example-ios/ –

関連する問題