访问iOS6 UIPageViewController 创建的UIPageControl?
Posted
技术标签:
【中文标题】访问iOS6 UIPageViewController 创建的UIPageControl?【英文标题】:Access the UIPageControl created by iOS6 UIPageViewController? 【发布时间】:2012-12-24 00:42:59 【问题描述】:我正在使用UIPageViewController
,导航设置为水平,过渡样式设置为滚动(在 InterfaceBuilder 中),并且没有脊椎。这给了我一个可爱的 UIPageControl 集成。现在我希望能够切换它是否正在显示(因为它下面有艺术品)。
我尝试将 presentationCountForPageViewController
和 presentationIndexForPageViewController
设置为在应该隐藏 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?
PhoneGap 3.x / iOs6 iOs7 / AngularJs - 插件对象不适用于自定义 www/index.html 位置