访问由iOS6 UIPageViewController创build的UIPageControl?
我使用UIPageViewController
与导航设置为水平,过渡样式设置为滚动(在InterfaceBuilder中),并没有脊柱。 这给了我一个可爱的UIPageControl集成。 现在我想能够切换是否显示(因为它下面有艺术作品)。
我已经尝试设置presentationCountForPageViewController
和presentationIndexForPageViewController
返回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