2012-12-24 13 views
6

Używam UIPageViewController z Nawigacją ustawioną na poziomą, styl przejścia ustawiony na przewijanie (w InterfaceBuilder) i bez grzbietu. Co daje mi piękny zintegrowany UIPageControl. Teraz chcę móc przełączać wyświetlanie (ponieważ pod nim jest grafika).Dostęp do UIPageControl utworzonego przez iOS6 UIPageViewController?

Próbowałem ustawienie presentationCountForPageViewController i presentationIndexForPageViewController powrócić 0, gdy UIPageControl ma być ukryty, ale te metody nie są wezwani, kiedy chcę.

Wstrzymywanie śledzenia stosu, widzę, że są wywoływane przez [UIPageViewController _updatePageControlViaDataSourceIfNecessary] ... Zakładam, że moja aplikacja zostanie odrzucona, jeśli spróbuję użyć tej metody.

Czy powinienem zaglądać do niego za pośrednictwem subviews, czy też przetaczać własne, aby mieć nad nim kontrolę, czy jest jakiś lepszy sposób na zmianę jego widoczności?

Dzięki!

Odpowiedz

12

Powiedziałbym, polowanie na subviews. Ten kod powodzeniem odnajduje UIPageControl w hierarchii 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]; 
    } 
} 

Używam tego dostosować kolor kropki, wyobrażam sobie, można zrobić to samo z wartością alfa lub wysłać go do tyłu lub czegoś .

Apple nie zapewnia bezpośredniego interfejsu do UIPageControl za pośrednictwem klasy UIPageViewController, ale nie ma żadnych nielegalnych wywołań metod, aby się do niego dostać ... Nie rozumiem, dlaczego spowodowałoby to odrzucenie aplikacji.

+0

Dzięki. Odzwierciedla to odpowiedź, którą napisałem do siebie, która najwyraźniej została usunięta w maju .... Chociaż w moim rozwiązaniu, jeśli była to klasa UIPageControl, ustawiłem Ukryty: navhidden; a jeśli tak nie było, ustawię ClipsToBounds:! navhidden. Gdzie navhidden przełączane w wywołaniu .... –

+1

To nie działa dla mnie, mając Xcode 7.0.1, z systemem iOS 9.0. – turingtested

3

W 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

to jest żałosne, ale dopóki nie dowiem się o innej drodze, +1. –

+0

Zostawię +1, ale znalazłem inny sposób (poniżej). –

2

I wdrożone kategorię do obsługi to dla mnie, który dostaje bałagan z mojego kodu i pozwala mi wejść do pageControl poprzez "pageController.pageControl"

Objective-C

// Header 
@interface UIPageViewController (PageControl) 

@property (nonatomic, readonly) UIPageControl *pageControl; 

@end 

Użyłem również rekurencji (obsługiwanej przez bloki) w przypadku, gdy Apple postanowi zmienić implementację causin g UIPageControl, aby nie być w pierwszej warstwie subviews.

// 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 

To może być przesadą dla swoich potrzeb, ale to działało dobrze dla kopalni

1

można uzyskać dostęp to wszystkich obiektów PageControl za pomocą appearance (patrz UIAppearance protocol), ale aby dostać konkretną instancję dalszy używać rekursji.Kod Swift:

let pageControl = UIPageControl.appearance() 
+2

Dla określonej instancji użyj 'UIPageControl.appearanceWhenContainedInInstancesOfClasses ([MyClass.self])'. iOS 9 tylko wtedy, gdy używasz szybkiego. – Jon

2

Swift 3 Rozszerzenie:

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

Dla Swift

Aby uzyskać punkty w kontroli widoku możemy użyć

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

Aby uzyskać aktualny pogląd dot

let currentDot = dots[pageControl.currentPage] 

aby uzyskać inne punkty widoki

for i in 0..<dots.count { 

    let dot = dots[i] 

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



    } else { 
     //dot => other dot 

    } 
} 

Po otrzymujemy pogląd dot możemy zmienić cokolwiek chcemy jak

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

Rozszerzenie 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; 
    } 
} 
Powiązane problemy