访问由iOS6 UIPageViewController创build的UIPageControl?

我使用UIPageViewController与导航设置为水平,过渡样式设置为滚动(在InterfaceBuilder中),并没有脊柱。 这给了我一个可爱的UIPageControl集成。 现在我想能够切换是否显示(因为它下面有艺术作品)。

我已经尝试设置presentationCountForPageViewControllerpresentationIndexForPageViewController返回0,当UIPageControl应该被隐藏,但是这些方法不会被调用,当我想要的。

暂停stacktrace,我看到它们被[UIPageViewController _updatePageControlViaDataSourceIfNecessary]调用…我假设我的应用程序将被拒绝,如果我试图使用该方法。

我是否应该通过子视图来追踪它,或者滚动我自己以便控制它,还是有一些更好的方法来切换其可见性?

谢谢!

我会说,通过子视图追捕。 此代码成功find子视图层次结构中的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]; } } 

我使用这个来定制点的颜色,我想你可以用alpha值做同样的事情,或者把它发送给后面的东西。

Apple通过UIPageViewController类没有提供与UIPageControl的直接接口,但是没有任何非法的方法调用来实现它…我不明白为什么会导致应用程序拒绝。

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

我实现了一个类来处理这个对我来说,弄乱了我的代码,并允许我通过“pageController.pageControl”访问pageControl

Objective-C的

 // Header @interface UIPageViewController (PageControl) @property (nonatomic, readonly) UIPageControl *pageControl; @end 

我也使用recursion(由块处理),以防苹果决定改变实现导致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 

这可能是你的需要矫枉过正,但它对我的工作很好

Swift 3扩展:

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

您可以通过使用appearance (请参阅UIAppearance协议 )来访问所有的PageControl对象,但要获得特定的实例,您必须使用recursion。 SWIFT代码:

 let pageControl = UIPageControl.appearance() 

对于Swift

为了获得页面控制中的点,我们可以使用

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