访问iOS6 UIPageViewController创建的UIPageControl?

时间:2012-12-24 00:42:59

标签: ios ios6 uipageviewcontroller uipagecontrol

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

我已尝试将presentationCountForPageViewControllerpresentationIndexForPageViewController设置为在UIPageControl被隐藏时返回0,但这些方法在我想要的时候没有被调用。

暂停堆栈跟踪,我看到它们被[UIPageViewController _updatePageControlViaDataSourceIfNecessary]调用...我认为如果我尝试使用该方法,我的应用会被拒绝。

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

谢谢!

8 个答案:

答案 0 :(得分:16)

我想说,通过子视图进行搜索。此代码在子视图层次结构中成功找到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的直接接口,但是没有非法的方法调用才能到达它...我不明白为什么这会导致应用程序被拒绝。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

Swift 3扩展:

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

答案 3 :(得分:2)

我实现了一个类别来为我处理这个问题,它让我的代码变得混乱,并允许我通过&#34; pageController.pageControl访问pageControl&#34;

目标-C

// Header
@interface UIPageViewController (PageControl)

@property (nonatomic, readonly) UIPageControl *pageControl;

@end

我还使用了递归(由块处理),以防Apple决定更改实现,导致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

这对你的需求来说可能有点过分,但对我来说效果很好

答案 4 :(得分:2)

您可以使用appearance访问所有PageControl对象(请参阅UIAppearance protocol),但要获取特定实例,您必须使用递归。 Swift代码:

let pageControl = UIPageControl.appearance()

答案 5 :(得分:1)

对于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

答案 6 :(得分: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;
    }
}

答案 7 :(得分:0)

一个好的,最新的Swift 1-liner怎么样?

let pageControl = view.subviews.first { $0 is UIPageControl } as? UIPageControl

或者,如果您喜欢扩展程序:

extension UIPageViewController {
    var pageControl: UIPageControl? {
        return view.subviews.first { $0 is UIPageControl } as? UIPageControl
    }
}