2012-12-24 28 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; 
    } 
} 
相关问题