8

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

我已经尝试设置presentationCountForPageViewController并在应该隐藏presentationIndexForPageViewController时返回 0 ,但是当我想要时不会调用这些方法。UIPageControl

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

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

谢谢!

4

8 回答 8

17

我会说,通过子视图寻找。此代码在子视图层次结构中成功找到 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 的直接接口,但不需要非法方法调用即可访问它……我不明白为什么这会导致应用程序被拒绝。

于 2013-08-03T04:28:25.777 回答
4

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

let pageControl = UIPageControl.appearance()
于 2015-06-07T21:13:03.683 回答
4

Swift 3 扩展:

extension UIPageViewController {
    var pageControl: UIPageControl? {
        for view in view.subviews {
            if view is UIPageControl {
                return view as? UIPageControl
            }
        }
    return nil
    }
}
于 2016-12-02T11:17:14.683 回答
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
        }
    }
于 2015-05-23T15:54:39.900 回答
2

我实现了一个类别来为我处理这个问题,它让我的代码变得一团糟,并允许我通过“pageController.pageControl”访问 pageControl

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

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

于 2015-05-29T05:51:56.710 回答
2

一个漂亮的、最新的 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
    }
}
于 2019-02-11T09:51:43.837 回答
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
于 2017-01-17T06:46:19.733 回答
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;
    }
}
于 2018-03-01T17:12:55.970 回答