User bekommen wischen Richtung, in UIPageViewController
Diese beiden Methoden viewControllerBeforeViewController
und viewControllerAfterViewController
des UIPageViewControllerDataSource
nicht sagen, die Richtung des streichen.
Die Methode transitionCompleted
des UIPageViewController
delegieren, hilft uns nicht viel. Es zeigt nur, dass wenn die Seite voll war geklaut.
Also welche Methode sollte ich verwenden, um zu erkennen, genau die Benutzer-Richtung (Links oder rechts)?
Wohl diese beiden Eigenschaften können helfen:
let directionForward = UIPageViewControllerNavigationDirection.Forward
let directionReverse = UIPageViewControllerNavigationDirection.Reverse
Mein code sieht wie folgt aus:
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)
}
}
}
}
Laut, was pbasdf sagte,
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?
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie verwenden beide die
willTransitionToViewControllers:
und diedidFinishAnimating:
delegate-Methoden, um herauszufinden, ob der übergang vorwärts oder rückwärts. Deklarieren Sie ein paar index-Variablen am Anfang der Klasse, sagencurrentIndex
undnextIndex
(beideInt
).In der
willTransitionToViewControllers
Methode, stellen Sie dennextIndex
gleich dieitemIndex
von der pending-view-controller:BEARBEITEN
ENDE BEARBEITEN
Können Sie sich an dieser Stelle, ob der übergang vorwärts oder rückwärts: wenn
nextIndex
>currentIndex
, dann vorwärts; wennnextIndex
<currentIndex
dann rückwärts. Dann indidFinishAnimating
, wenncompleted
wahr ist (also er beendet den übergang zu den next-view-controller), setcurrentIndex
gleichnextIndex
so können SiecurrentIndex
wo auch immer Sie brauchen, um anzugeben, welche Seite ist aktuell auf dem Bildschirm:BEARBEITEN
Beachten Sie, dass das erste argument für diese Methoden ist die pageViewController (Instanz von UIPageViewController), nicht
pageItemController
die Sie auf Ihren aktuellen code ein.Schließlich nur der Hinweis: das enum-Sie beziehen sich auf (
UIPageViewControllerNavigationDirection
) ist nur imsetViewControllers(_, direction:)
Methode.ENDE BEARBEITEN
Vorausgesetzt, Sie haben ein lokales array des ViewControllers können Sie mit dieser
delegate
Methode:Den
guard
Aussagen sollten nicht scheitern, aber nur für den Fall....Für meinen Fall, ich war in der Lage, um zu bestimmen, die Swipe-Richtung, indem Sie die
func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [AnyObject], transitionCompleted completed: Bool)
nur.Hier ist, wie. Angenommen, Sie haben bereits eine Möglichkeit zum verweisen auf den aktuellen index mit dem Namen
currentIndex
. In der oben genannten Methode haben Sie bereits die Informationen über diepreviousViewControllers
so, dass man den vorherigen index mit dem NamenpreviousIndex
.Grundsätzlich ist hier die Umsetzung innerhalb des Delegaten-Methode:
Erstens in Ihrem viewControllerForIndex Methode zuweisen viewcontroller.Blick.tag = index, so dass jeder viewcontroller.Blick hat einen zugewiesenen Wert
Haben eine currentIndex-Eigenschaft, die ursprünglich zugewiesen, der index von der viewcontroller, die Sie instanziiert innen pageviewcontroller
Nun in didFinishAnimating die folgenden
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating fertig: Bool, previousViewControllers: [UIViewController], transitionCompleted abgeschlossen: Bool) {
wenn !abgeschlossen {
return //zurück, wenn die animation noch nicht abgeschlossen
}
lassen Sie pCont = bottomDataContainer?.viewControllers?[0] wie? CustomVC //nehmen
aktuelle VC
Gibt es keine Möglichkeit zu bestimmen, ob der Benutzer geklaut vorwärts oder rückwärts.
Müssen Sie diese beiden Methoden, um die Ansichten vor und nach der:
pageViewController:viewControllerBeforeViewController:
pageViewController:viewControllerAfterViewController:
Können Sie verfolgen, einen index durch hinzufügen einer Eigenschaft des viewControllers und dann können Sie vergleichen die pageIndexes.