在UIPageViewController中获取用户滑动方向
viewControllerBeforeViewController
和viewControllerAfterViewController
这两个方法不会告诉滑动的方向。
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) } } } }
根据pbasdf的说法,
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? }
您应该同时使用willTransitionToViewControllers:
和didFinishAnimating:
delegate方法来确定过渡是向前还是向后。 在你的类的开始声明几个索引variables,比如currentIndex
和nextIndex
(都是Int
)。
在willTransitionToViewControllers
方法中,将nextIndex
设置为等于未决视图控制器的itemIndex
:
编辑
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 } }
结束编辑
您可以在此处计算转换是向前还是向后:如果nextIndex
> currentIndex
,则转发; 如果nextIndex
< currentIndex
则向后。 然后在didFinishAnimating
,如果completed
是真的(所以它完成了转换到下一个视图控制器),设置currentIndex
等于nextIndex
所以你可以使用currentIndex
无论你需要指出哪个页面当前在屏幕上:
编辑
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
。
最后要注意的是:你引用的enum( UIPageViewControllerNavigationDirection
)只能在setViewControllers(_, direction:)
方法中使用。
结束编辑
无法确定用户是向前还是向后滑动。
您需要使用这两种方法来提供前后的视图:
pageViewController:viewControllerBeforeViewController:
pageViewController:viewControllerAfterViewController:
您可以通过向viewControllers添加属性来跟踪索引,然后可以比较pageIndexes。