我想做一件非常简单的事情。只需删除所有点,以及UIPageViewController底部的栏。
这是设置:我有一个自定义视图控制器,它有UIPageViewController * pageController 我这样显示:
self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageController.dataSource = self;
[[self.pageController view] setFrame:[self.view bounds]];
BSItemPageViewController *initialViewController = [self viewControllerAtIndex:selectedIndex];
NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];
[self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
[self addChildViewController:self.pageController];
[[self view] addSubview:[self.pageController view]];
[self.pageController didMoveToParentViewController:self];
关于如何删除点的任何想法?
答案 0 :(得分:194)
仅当数据源实现这些方法时才显示页面控件:
presentationCountForPageViewController:
presentationIndexForPageViewController:
只需删除这些实现,就不会显示页面控件。来自the datasource docs:
如果实现了“支持页面指示符”中的两个方法,并且页面视图控制器的转换样式为UIPageViewControllerTransitionStyleScroll,则页面指示符可见。
答案 1 :(得分:11)
在我的情况下,我有多个UIPageViewControllers(从 - [UITableView didSelectRowAtIndexPath]创建),其中一些只包含1页。我没有为不同的UITableView行使用不同的控制器,而是按如下方式实现了UIPageViewController委托方法:
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
return ([self numberOfPages] == 1 ? 0 : [self numberOfPages]);
}
如果只有1页似乎使UIPageViewController不显示点,则返回0。它是一个kludge但它似乎工作(iOS SDK 7.0)。
我认为一种“更干净”的方法是在运行时为那些只有1页的UIPageControllers删除方法,但这会涉及一些花哨的objC运行时操作。
关于这种方法的评论?
答案 2 :(得分:4)
如果要在运行时动态隐藏这些点,则从presentationIndexForPageViewController委托返回-1:
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return yourPageVCs.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return yourPageVCs.count > 1 ? 0 : -1
}
在这种情况下,如果您只有1个(单面)页面,则会隐藏点。
答案 3 :(得分:1)
以上修复程序在开头的固定页数下工作正常。
当页面可以动态增加或减少时,我尝试了不同的方法来解决问题。
所以我使用下面的方法手动隐藏组件本身。
func togglePageControl(pageCount: Int, threshold: Int = 1) {
var hidden = true
if pageCount > threshold {
hidden = false
}
for subView in self.view.subviews {
if subView is UIScrollView {
subView.frame = self.view.bounds
} else if subView is UIPageControl {
subView.isHidden = hidden
}
}
}
这应该从
调用public func presentationCount(for pageViewController: UIPageViewController) -> Int {
togglePageControl(pageCount: pages.count)
// or togglePageControl(pageCount: pages.count, threshold: 5)
return pages.count
}
答案 4 :(得分:1)
正如Lee所指出的,简单地不实现方法 presentationCountForPageViewController 和 presentationCountForPageViewController 在画外音期间会遇到可访问性问题,即它无法读出页码(第1页5、2、5等)。支持访问性的解决方案是:
// Swift
let proxy = UIPageControl.appearance()
proxy.isHidden = true
// Objective-C
UIPageControl *proxy = [UIPageControl appearance];
[proxy setHidden:YES];
这具有在数据源与其表示之间保持更清晰分隔的另一个好处。
更新: 不幸的是,这不是一个完美的解决方案,因为它隐藏了控件但没有将其删除(仍然存在与隐藏控件相同高度的空白空间)。我还没有找到一种方法来配置现有控件来解决此问题。