8

Ho un grosso problema con il mio UIPageViewController. Voglio presentare i contenuti nella mia app utilizzando sezioni e sottosezioni. Così, ho creato "due" istanze di UIPageViewController - orizzontali (rosso) e verticale (blu):Nidificazione di un (verticale) UIPageViewController all'interno di un altro (orizzontale) UIPageViewcontroller

scheme

In precedenza ho detto che ho creato "due" casi - non è del tutto vero - ci possono essere decine di istanze, ma solo 2 sono presentate allo stesso tempo, sai cosa intendo. Entrambi i controller hanno transitionStyle impostato su UIPageViewControllerTransitionStyleScroll.

Il rosso UIPageViewController è responsabile dello scorrimento orizzontale tra le sezioni e il blu è responsabile dello scorrimento verticale.

Entrambi funzionano quando separati ma quando inserisco verticale UIPageViewController in orizzontale, quello verticale smette di funzionare.

Il mio codice è la seguente:


orizzontale UIPageViewController creazione

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]; 

Giusto per essere chiari, UIIndexedPageViewController è una sottoclasse di UIPVC con olio extra NSUInteger index proprietà. La sua implementazione è vuota: non sovrascrive alcun metodo.


UIPageViewController metodi dataSource

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

così sembra che orizzontale UIPageViewController non permette quella verticale per ricevere anche riconoscitori gesto pan.


La mia domanda è ... C'è un modo per consentire alla verticale UIPageViewController per ricevere tocchi e scorrere in entrambe le direzioni?

Qualsiasi aiuto sarebbe apprezzato.

+0

grazie per la direzione nella tua domanda utile. fare qualcosa di simile. – san

risposta

3

ho dimenticato di assegnare dataSource e delegate proprietà dei miei regolatori verticali Visualizza la pagina in

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

Problema risolto, tutto funziona a meraviglia.