访问iOS6 UIPageViewController 创建的UIPageControl?

Posted

技术标签:

【中文标题】访问iOS6 UIPageViewController 创建的UIPageControl?【英文标题】:Access the UIPageControl created by iOS6 UIPageViewController? 【发布时间】:2012-12-24 00:42:59 【问题描述】:

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

我尝试将 presentationCountForPageViewControllerpresentationIndexForPageViewController 设置为在应该隐藏 UIPageControl 时返回 0,但是当我需要时不会调用这些方法。

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢。这反映了我发布给自己的答案,该答案显然在 5 月被删除了......虽然在我的解决方案中,如果它是一个 UIPageControl 类,我 setHidden:navhidden;如果不是,我设置ClipsToBounds:!navhidden。 navhidden 在通话中切换的位置...... 它对我不起作用,我有 Xcode 7.0.1,运行 ios 9.0。【参考方案2】:

您可以使用appearance(参见UIAppearance protocol)访问所有PageControl 对象,但要获得特定实例,您必须使用递归。斯威夫特代码:

let pageControl = UIPageControl.appearance()

【讨论】:

对于特定实例,请使用UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClass.self])。仅当您使用 swift 时才使用 iOS 9。【参考方案3】:

Swift 3 扩展:

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

【讨论】:

【参考方案4】:

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
        
    

【讨论】:

这很可悲,但在我发现另一种方式之前,+1。 我会留下 +1,但我找到了另一种方式(如下)。【参考方案5】:

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

目标-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

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

【讨论】:

【参考方案6】:

一个不错的、最新的 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
    

【讨论】:

【参考方案7】:

对于斯威夫特

要获取页面控件中的点,我们可以使用

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

【讨论】:

【参考方案8】:

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;
    

【讨论】:

以上是关于访问iOS6 UIPageViewController 创建的UIPageControl?的主要内容,如果未能解决你的问题,请参考以下文章

访问由iOS6的UIPageViewController创建的UIPageControl?

开发人员的 iOS6 差异 [关闭]

iOS 6 Facebook登录不刷新访问令牌

ios6中的自动旋转没有按预期工作

访问 iPhone 数据之前的用户权限 [重复]

PhoneGap 3.x / iOs6 iOs7 / AngularJs - 插件对象不适用于自定义 www/index.html 位置