2012-12-24 16 views
6

Utilizzo un UIPageViewController con Navigazione impostata su Orizzontale, Stile transizione impostato su Scorrimento (in Interfaccia generatore) e nessuna colonna vertebrale. Che mi dà un bel UIPageControl integrato. Ora voglio essere in grado di alternare se sta visualizzando (perché c'è l'opera d'arte al di sotto di esso).Accedi a UIPageControl creato da iOS6 UIPageViewController?

Ho provato a impostare presentationCountForPageViewController e presentationIndexForPageViewController per restituire 0 quando si suppone che sia nascosto il UIPageControl, ma quei metodi non vengono chiamati quando voglio.

Pausa per stacktrace, vedo che vengono chiamati da [UIPageViewController _updatePageControlViaDataSourceIfNecessary] ... Presumo che la mia app verrebbe respinta se provassi ad usare quel metodo.

Devo cacciare attraverso le sottoview per questo o rollare il mio in modo da avere il controllo su di esso, o c'è un modo migliore per attivare la sua visibilità?

Grazie!

risposta

12

Direi, cacciare attraverso le sottoview. Questo codice rileva correttamente l'UIPageControl nella gerarchia subviews:

NSArray *subviews = pageController.view.subviews; 
UIPageControl *thisControl = nil; 
for (int i=0; i<[subviews count]; i++) { 
    if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) { 
     thisControl = (UIPageControl *)[subviews objectAtIndex:i]; 
    } 
} 

Sto usando questo per personalizzare il colore dei punti, immagino che si possa fare lo stesso con il valore alfa o inviarla alla parte posteriore o qualcosa .

Apple non fornisce un'interfaccia diretta a UIPageControl tramite la classe UIPageViewController, ma non ci sono chiamate di metodo illegali necessarie per raggiungerlo ... Non vedo perché ciò comporterebbe il rifiuto di un'app.

+0

Grazie. Questo rispecchia la risposta che ho postato a me stesso, che a quanto pare è stato cancellato a maggio .... Sebbene nella mia soluzione, se fosse una classe UIPageControl, ho impostatoHidden: navhidden; e se non lo fosse, ho setClipsToBounds:! navhidden. Dove navhidden ha attivato la chiamata .... –

+1

Non funziona per me, avendo Xcode 7.0.1, con iOS 9.0. – turingtested

3

In Swift:

let subviews: Array = self.pageViewController.view.subviews 
    var pageControl: UIPageControl! = nil 

    for (var i = 0; i < subviews.count; i++) { 
     if (subviews[i] is UIPageControl) { 
      pageControl = subviews[i] as! UIPageControl 
      break 
     } 
    } 
+0

questo è patetico, ma fino a quando non scoprirò un altro modo, +1. –

+0

Lascerò il +1, ma ho trovato un altro modo (sotto). –

2

ho implementato una categoria per gestire questo per me che ottiene il caos fuori del mio codice e mi permette di accedere alla PageControl tramite "pageController.pageControl"

Objective-C

// Header 
@interface UIPageViewController (PageControl) 

@property (nonatomic, readonly) UIPageControl *pageControl; 

@end 

ho anche utilizzato ricorsione (gestito dai blocchi) nel caso in cui Apple decide di cambiare l'implementazione causin g UIPageControl non deve essere nel primo livello di sotto-visualizzazioni.

// Implementation 
#import "UIPageViewController+PageControl.h" 

@implementation UIPageViewController (PageControl) 

- (UIPageControl *)pageControl 
{ 
    __block UIPageControl *pageControl = nil; 
    void (^pageControlAssignBlock)(UIPageControl *) = ^void(UIPageControl *blockPageControl) { 
     pageControl = blockPageControl; 
    }; 

    [self recurseForPageControlFromSubViews:self.view.subviews withAssignBlock:pageControlAssignBlock]; 

    return pageControl; 
} 

- (void)recurseForPageControlFromSubViews:(NSArray *)subViews withAssignBlock:(void (^)(UIPageControl *))assignBlock 
{ 
    for (UIView *subView in subViews) { 
     if ([subView isKindOfClass:[UIPageControl class]]) { 
      assignBlock((UIPageControl *)subView); 
      break; 
     } else { 
      [self recurseForPageControlFromSubViews:subView.subviews withAssignBlock:assignBlock]; 
     } 
    } 
} 

@end 

Questo può essere eccessivo per le vostre esigenze, ma ha funzionato bene per la mia

1

È possibile accedere a questo per tutti gli oggetti PageControl utilizzando appearance (vedere la UIAppearance protocol), ma per ottenere una specifica istanza faresti usare la ricorsione.Codice Swift:

let pageControl = UIPageControl.appearance() 
+2

Per un'istanza specifica utilizzare 'UIPageControl.appearanceWhenContainedInInstanceOfClasses ([MyClass.self])'. iOS 9 solo se si utilizza Swift. – Jon

2

Swift 3 Estensione:

extension UIPageViewController { 
    var pageControl: UIPageControl? { 
     for view in view.subviews { 
      if view is UIPageControl { 
       return view as? UIPageControl 
      } 
     } 
    return nil 
    } 
} 
0

Per Swift

Per ottenere i punti nel controllo pagina possiamo usare

//dots will be an array of the dots views 
let dots = pageControl.subviews 

per ottenere la vista punto corrente

let currentDot = dots[pageControl.currentPage] 

Per ottenere gli altri punti di vista

for i in 0..<dots.count { 

    let dot = dots[i] 

    if i == pageControl.currentPage { 
     //dot => current dot 



    } else { 
     //dot => other dot 

    } 
} 

Dopo aver ottenuto la vista dot possiamo cambiare tutto ciò che vogliamo come

dot.layer.borderColor = .green 
dot.layer.borderWidth = 1 
0

Estensione C#:

public static class PageViewControllerExtension{ 
    public static UIPageControl GetPageControl(this UIPageViewController pageViewController){ 
     foreach (var view in pageViewController.View.Subviews){ 
      var subView = view as UIPageControl; 
      if (subView != null){ 
       return subView; 
      } 
     } 
     return null; 
    } 
} 
Problemi correlati