2012-12-24 26 views
6

我使用UIPageViewController,導航設置爲水平,轉換樣式設置爲滾動(在InterfaceBuilder中),沒有脊柱。這給了我一個可愛的UIPageControl集成。現在我希望能夠切換它是否顯示(因爲它下面有藝術作品)。訪問由iOS6 UIPageViewController創建的UIPageControl?

我試過設置presentationCountForPageViewControllerpresentationIndexForPageViewController返回0當UIPageControl應該被隱藏,但這些方法沒有被調用時,我想。

暫停堆棧跟蹤,我看到他們被[UIPageViewController _updatePageControlViaDataSourceIfNecessary]調用...我假設我的應用程序將被拒絕,如果我試圖使用該方法。

我是否應該通過子視圖來追蹤它,或者滾動我自己以便控制它,或者是否有一些更好的方法來切換其可見性?

謝謝!

回答

12

我會說,通過子視圖尋找。此代碼成功地找到了UIPageControl在子視圖層次結構:

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

我使用這個自定義點的顏色,我想你可以做同樣的阿爾法值或將其發送到後面什麼。

Apple通過UIPageViewController類沒有提供與UIPageControl的直接接口,但是沒有任何非法的方法調用來實現它...我不明白爲什麼會導致應用程序拒絕。

+0

謝謝。這反映了我發佈給自己的答案,這個答案在5月份顯然被刪除了......儘管在我的解決方案中,如果它是UIPageControl類,我設置隱藏:navhidden;如果不是,我設置ClipsToBounds:!navhidden。哪裏navhidden在通話中切換.... –

+1

它不適用於我,運行iOS 9.0的Xcode 7.0.1。 – turingtested

3

斯威夫特

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

這是可悲的,但直到我找到另一種方式,+1。 –

+0

我會離開+1,但我找到了另一種方式(下圖)。 –

2

我實現了一個類來處理這對我來說它得到了惹出來的我的代碼,並允許我通過「pageController.pageControl」

訪問的PageControl Objective-C

// Header 
@interface UIPageViewController (PageControl) 

@property (nonatomic, readonly) UIPageControl *pageControl; 

@end 

我還使用了遞歸(由塊處理),以防蘋果決定更改實現causin g UIPageControl不在第一層子視圖中。

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

這可能是矯枉過正滿足您的需求,但它運作良好,爲我

1

您可以通過使用appearance訪問此對所有的PageControl對象(見UIAppearance protocol),但要獲得一個特定的情況下,你會必須使用遞歸。SWIFT代碼:

let pageControl = UIPageControl.appearance() 
+2

對於特定的實例,使用'UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClass.self])''。僅當您使用swift時才適用於iOS 9。 – Jon

2

斯威夫特3擴展名:

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

對於斯威夫特

要得到點在頁面的控制,我們可以使用

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

爲了得到當前點視圖

let currentDot = dots[pageControl.currentPage] 

要得到其他點意見

for i in 0..<dots.count { 

    let dot = dots[i] 

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



    } else { 
     //dot => other dot 

    } 
} 

我們得到的點視圖之後,我們可以改變一切,我們要像

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

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; 
    } 
} 
相關問題