8

Ich habe ein großes Problem mit meinem UIPageViewController. Ich möchte Inhalte in meiner App mithilfe von Abschnitten und Unterabschnitten darstellen. Also, ich habe „zwei“ Instanzen UIPageViewController erstellt - horizontal (rot) und vertikal (blau):Verschachteln eines (vertikalen) UIPageViewControllers in einem anderen (horizontalen) UIPageViewcontroller

scheme

Früher sagte ich mir geschaffen habe „zwei“ Instanzen - es ist nicht ganz richtig ist - Es kann Dutzende von Instanzen geben, aber nur 2 werden zur gleichen Zeit präsentiert, Sie wissen, was ich meine. Beide Controller haben transitionStyle auf UIPageViewControllerTransitionStyleScroll festgelegt.

Die rote UIPageViewController ist für das horizontale Scrollen zwischen den Sektionen verantwortlich und die blaue für das vertikale Scrollen.

Sie beide funktionieren, wenn getrennt, aber wenn ich vertikal UIPageViewController in die horizontale setzen, die vertikale hört auf zu arbeiten.

Mein Code ist unten dargestellt:


Horizontal UIPageViewController Schöpfung

self.mainPageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:@{UIPageViewControllerOptionInterPageSpacingKey:[NSNumber numberWithFloat:0]}]; 
self.mainPageViewController.dataSource = self; 
self.mainPageViewController.delegate = self; 

self.pdfDocsURLs = @[ @{@"v":[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1v" ofType:@"pdf"]], 
         @"h":[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"1h" ofType:@"pdf"]]}, 

         @{@"v":[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"2v" ofType:@"pdf"]], 
         @"h":[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"2h" ofType:@"pdf"]]}, 

         @{@"v":[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"3v" ofType:@"pdf"]], 
         @"h":[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"3h" ofType:@"pdf"]]}]; 

UIIndexedPageViewController *pvc = [[UIIndexedPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:@{UIPageViewControllerOptionInterPageSpacingKey:[NSNumber numberWithFloat:0]}]; 
pvc.index = 1; 
PDFDocument *vdoc = [[PDFDocument alloc] initWithPDFFileURL:self.pdfDocsURLs[0][@"v"] password:nil]; 
PDFDocument *hdoc = [[PDFDocument alloc] initWithPDFFileURL:self.pdfDocsURLs[0][@"h"] password:nil]; 
PDFSinglePageViewController *svc = [[PDFSinglePageViewController alloc] initWithVerticalPDF:vdoc horizontalPDF:hdoc page:1]; 
[pvc setViewControllers:@[svc] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

[self.mainPageViewController setViewControllers:@[pvc] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

Nur klar zu sein, ist UIIndexedPageViewController eine Unterklasse von UIPVC mit extra NSUInteger index Eigenschaft. Seine Implementierung ist leer - es überschreibt keine Methoden.


UIPageViewController Datasource Methoden

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    if(pageViewController == self.mainPageViewController) { // if horizontal 
     UIIndexedPageViewController *ivc = (UIIndexedPageViewController *)viewController; 
     if(ivc.index == self.pdfDocsURLs.count) return nil; 
     UIIndexedPageViewController *pvc = [[UIIndexedPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:@{UIPageViewControllerOptionInterPageSpacingKey:[NSNumber numberWithFloat:0]}]; 
     pvc.index = ivc.index+1; 
     PDFDocument *vdoc = [[PDFDocument alloc] initWithPDFFileURL:self.pdfDocsURLs[ivc.index][@"v"] password:nil]; 
     PDFDocument *hdoc = [[PDFDocument alloc] initWithPDFFileURL:self.pdfDocsURLs[ivc.index][@"h"] password:nil]; 
     PDFSinglePageViewController *svc = [[PDFSinglePageViewController alloc] initWithVerticalPDF:vdoc horizontalPDF:hdoc page:1]; 
     [pvc setViewControllers:@[svc] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
     return pvc; 
    } else { // if vertical - THE CODE BELOW IS NEVER EXECUTED 
     PDFSinglePageViewController *ovc = (PDFSinglePageViewController *)viewController; 
     NSUInteger nop = 0; 
     if(UIInterfaceOrientationIsPortrait(ovc.interfaceOrientation)) nop = ovc.verticalDoc.numberOfPages; 
     else if(UIInterfaceOrientationIsLandscape(ovc.interfaceOrientation)) nop = ovc.horizontalDoc.numberOfPages; 
     if(ovc.page == nop) return nil; 
     PDFSinglePageViewController *svc = [[PDFSinglePageViewController alloc] initWithVerticalPDF:ovc.verticalDoc horizontalPDF:ovc.horizontalDoc page:ovc.page+1]; 
     return svc; 
    } 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    if(pageViewController == self.mainPageViewController) { // if horizontal 
     UIIndexedPageViewController *ivc = (UIIndexedPageViewController *)viewController; 
     if(ivc.index == 1) return nil; 
     UIIndexedPageViewController *pvc = [[UIIndexedPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:@{UIPageViewControllerOptionInterPageSpacingKey:[NSNumber numberWithFloat:0]}]; 
     pvc.index = ivc.index-1; 
     PDFDocument *vdoc = [[PDFDocument alloc] initWithPDFFileURL:self.pdfDocsURLs[ivc.index-2][@"v"] password:nil]; 
     PDFDocument *hdoc = [[PDFDocument alloc] initWithPDFFileURL:self.pdfDocsURLs[ivc.index-2][@"h"] password:nil]; 
     PDFSinglePageViewController *svc = [[PDFSinglePageViewController alloc] initWithVerticalPDF:vdoc horizontalPDF:hdoc page:1]; 
     [pvc setViewControllers:@[svc] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 
     return pvc; 
    } else { // is vertical - THE CODE BELOW IS NEVER EXECUTED 
     PDFSinglePageViewController *ovc = (PDFSinglePageViewController *)viewController; 
     NSUInteger nop = 0; 
     if(UIInterfaceOrientationIsPortrait(ovc.interfaceOrientation)) nop = ovc.verticalDoc.numberOfPages; 
     else if(UIInterfaceOrientationIsLandscape(ovc.interfaceOrientation)) nop = ovc.horizontalDoc.numberOfPages; 
     if(ovc.page == 1) return nil; 
     PDFSinglePageViewController *svc = [[PDFSinglePageViewController alloc] initWithVerticalPDF:ovc.verticalDoc horizontalPDF:ovc.horizontalDoc page:ovc.page-1]; 
     return svc; 
    } 
} 

So scheint es, dass horizontale UIPageViewController nicht die vertikale zulässt. Sogar pan Geste Erkenner empfangen


Meine Frage ist ... Gibt es eine Möglichkeit der vertikalen UIPageViewController zu ermöglichen, berührt zu empfangen und in beiden Richtungen bewegen?

Jede Hilfe wäre willkommen.

+0

danke für die richtung in ihrer nützlichen frage. Ähnliches tun. – san

Antwort

3

Ich habe vergessen, in

  • -pageViewController:viewControllerBeforeViewController:
  • -pageViewController:viewControllerAfterViewController:

Problem gelöst, funktioniert alles wunderbar dataSource und delegate Eigenschaften meiner vertikalen Seite View-Controller zugewiesen werden.

Verwandte Themen