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

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

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

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

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

谢谢!

【问题讨论】:

    标签: ios ios6 uipageviewcontroller uipagecontrol


    【解决方案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;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2013-03-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多