我正在使用UIPageViewController
,导航设置为水平,过渡样式设置为Scroll(在InterfaceBuilder中),没有脊椎。这给了我一个可爱的UIPageControl集成。现在我希望能够切换它是否正在显示(因为它下面有艺术品)。
我已尝试将presentationCountForPageViewController
和presentationIndexForPageViewController
设置为在UIPageControl
被隐藏时返回0,但这些方法在我想要的时候没有被调用。
暂停堆栈跟踪,我看到它们被[UIPageViewController _updatePageControlViaDataSourceIfNecessary]
调用...我认为如果我尝试使用该方法,我的应用会被拒绝。
我应该通过子视图搜索它,还是自己滚动,以便控制它,或者有更好的方法来切换它的可见性?
谢谢!
答案 0 :(得分:16)
我想说,通过子视图进行搜索。此代码在子视图层次结构中成功找到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的直接接口,但是没有非法的方法调用才能到达它...我不明白为什么这会导致应用程序被拒绝。
答案 1 :(得分:3)
在 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
}
}
答案 2 :(得分:3)
Swift 3扩展:
extension UIPageViewController {
var pageControl: UIPageControl? {
for view in view.subviews {
if view is UIPageControl {
return view as? UIPageControl
}
}
return nil
}
}
答案 3 :(得分:2)
我实现了一个类别来为我处理这个问题,它让我的代码变得混乱,并允许我通过&#34; pageController.pageControl访问pageControl&#34;
目标-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
这对你的需求来说可能有点过分,但对我来说效果很好
答案 4 :(得分:2)
您可以使用appearance
访问所有PageControl对象(请参阅UIAppearance protocol),但要获取特定实例,您必须使用递归。 Swift代码:
let pageControl = UIPageControl.appearance()
答案 5 :(得分:1)
对于Swift
要获取页面控件中的点,我们可以使用
//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
答案 6 :(得分: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;
}
}
答案 7 :(得分:0)
一个好的,最新的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
}
}