2015-01-13 2 views
6

UIPageViewControllerDataSourceviewControllerBeforeViewControllerviewControllerAfterViewController은 스 와이프 방향을 말하지 않습니다.UIPageViewController에서 사용자가 직접 스 와이프 방향을 지정하십시오.

UIPageViewController 대표의 transitionCompleted도 도움이되지 않습니다. 페이지가 완전히 스 와이프되었는지 여부 만 알려줍니다.

사용자 방향 (왼쪽 또는 오른쪽)을 정확히 감지하려면 어떤 방법을 사용해야합니까?

은 아마이 두 속성은 도움이 될 수

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))를 선언하십시오.가

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가

본에서 운동

편집 : willTransitionToViewControllers 방법에

는 계류중인 뷰 컨트롤러 itemIndex 같게 nextIndex 세트 전환이 앞으로 또는 뒤로 가는지 여부를 가리킨다. nextIndex>일 경우, 그 다음 앞으로; 이 경우 nextIndex < currentIndex입니다. 그런 다음 completed에 해당하는 경우 didFinishAnimating에, (그래서 다음 뷰 컨트롤러로의 전환을 완료) 당신은 화면에 현재있는 페이지를 표시 할 필요가 어디 그래서 당신은 currentIndex을 사용할 수 있습니다 nextIndex에 동일한 currentIndex을 설정

편집 이러한 방법의 첫 번째 인수는 pageViewController (UIPageViewController의 예), 아니 당신이 당신의 현재 코드가 pageItemController 것을

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 

    } 
} 

참고.

마지막으로, 사용자가 참조한 열거 형 (UIPageViewControllerNavigationDirection)은 setViewControllers(_, direction:) 메서드에서만 사용됩니다.

최종 편집

+0

내 질문에 정확하게 답변 해 주셔서 대단히 감사합니다. 보류중인 viewController의 인덱스를 얻는 방법을 설명해 주시겠습니까? "... 보류중인보기 컨트롤러의 itemIndex와 같습니다."라고 말하지만, 어떻게해야하는지에 대한 단서가 있습니다. 대답의 나머지 부분은 분명하고 멋지게 놓여 있습니다 - 다시 한번 감사드립니다! – Cesare

+0

@CeceXX 일부 샘플 코드로 답변을 업데이트했습니다. – pbasdf

+0

나는 단지 당신을 충분히 감사 할 수 없다! – Cesare

0

는 확인할 방법이 없습니다, pbasdf 한 말에 따르면, 사용자가 앞으로 또는 뒤로 스 와이프했는지 여부

pageViewController : viewControllerBeforeViewController :

pageViewController : viewControllerAfterViewController :

당신의 의견 전후를 제공하기 위해 이러한 두 가지 방법을 사용할 필요가

당신은 속성을 추가하여 인덱스를 추적 할 수 viewController에 전달한 다음 pageIndexes를 비교할 수 있습니다.

+0

내가 정확히 어떻게 할 것인가? "viewControllers에 속성을 추가 한 다음 페이지 인덱스를 비교하여 인덱스를 추적 할 수 있습니다." 감사! – Cesare

+0

@CeceXX이 튜토리얼과 같이 뷰 컨트롤러에는 pageIndex라는 속성이 있습니다. http://www.makemegeek.com/uipageviewcontroller-example-ios/ –

관련 문제