我使用的是UIPageViewController
与导航设置为横向,过渡样式设置为滚动(InterfaceBuilder下),且无脊椎。 这给了我一个综合可爱UIPageControl。 现在,我希望能够切换无论是显示(因为有它下面的作品)。
我试过设置presentationCountForPageViewController
和presentationIndexForPageViewController
当返回0 UIPageControl
应该被隐藏,但是这些方法都不会被调用时,我想。
暂停了堆栈跟踪,我看到他们通过被称为[UIPageViewController _updatePageControlViaDataSourceIfNecessary]
......我想如果我试图用这种方法我的应用程序将被拒绝。
我应该通过子视图打猎,或推出自己的,所以我拥有控制权,或者是有一些更好的方法来切换其知名度?
谢谢!
Answer 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];
}
}
我使用这个自定义点的颜色,我想你可以做同样的阿尔法值或将其发送到后面什么的。
苹果公司没有提供直接接口,通过UIPageViewController类UIPageControl,但也有为了得到它不需要任何非法的方法调用......我不明白为什么这会导致应用程序拒绝。
Answer 2:
在斯威夫特 :
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
}
}
Answer 3:
斯威夫特3扩展名:
extension UIPageViewController {
var pageControl: UIPageControl? {
for view in view.subviews {
if view is UIPageControl {
return view as? UIPageControl
}
}
return nil
}
}
Answer 4:
我实现了一个类来处理这对我来说它得到了惹出来的我的代码,并允许我通过“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
这可能是矫枉过正满足您的需求,但它运作良好矿
Answer 5:
您可以访问此通过使用所有的PageControl对象appearance
(见UIAppearance协议 ),但让你不得不使用递归特定的实例。 SWIFT代码:
let pageControl = UIPageControl.appearance()
Answer 6:
对于斯威夫特
为了得到点在我们可以使用页面控制
//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
Answer 7:
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;
}
}
Answer 8:
怎么样一个不错的,最新的雨燕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
}
}
文章来源: Access the UIPageControl created by iOS6 UIPageViewController?