访问由iOS6的UIPageViewController创建的UIPageControl?

问题描述 投票:7回答:8

我使用的是UIPageViewController与导航设置为横向,过渡样式设置为滚动(InterfaceBuilder下),且无脊椎。这给了我一个综合可爱UIPageControl。现在,我希望能够切换无论是显示(因为有它下面的作品)。

我试过设置presentationCountForPageViewControllerpresentationIndexForPageViewController时应该在UIPageControl被隐藏返回0,但这些方法都不会被调用时,我想。

暂停了堆栈跟踪,我看到他们通过[UIPageViewController _updatePageControlViaDataSourceIfNecessary]被称为......我想如果我试图用这种方法我的应用程序将被拒绝。

我应该通过子视图打猎,或推出自己的,所以我拥有控制权,或者是有一些更好的方法来切换其知名度?

谢谢!

ios ios6 uipageviewcontroller uipagecontrol
8个回答
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];
    }
}

我使用这个自定义点的颜色,我想你可以做同样的阿尔法值或将其发送到后面什么的。

苹果公司没有提供直接接口,通过UIPageViewController类UIPageControl,但也有为了得到它不需要任何非法的方法调用......我不明白为什么这会导致应用程序拒绝。


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

3
投票

斯威夫特3扩展名:

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

2
投票

我实现了一个类来处理这对我来说它得到了惹出来的我的代码,并允许我通过“pageController.pageControl”访问的PageControl

Objective-C的

// Header
@interface UIPageViewController (PageControl)

@property (nonatomic, readonly) UIPageControl *pageControl;

@end

我还用递归(按块处理)的情况下,苹果决定改变导致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

这可能是矫枉过正满足您的需求,但它运作良好矿


2
投票

您可以访问此通过使用appearance所有的PageControl对象(见UIAppearance protocol),而是让你不得不使用递归特定的实例。 SWIFT代码:

let pageControl = UIPageControl.appearance()

1
投票

对于斯威夫特

为了得到点在我们可以使用页面控制

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

0
投票

怎么样一个不错的,最新的雨燕1班轮?

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

如果你喜欢一个扩展:

extension UIPageViewController {
    var pageControl: UIPageControl? {
        return view.subviews.first { $0 is UIPageControl } as? UIPageControl
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.