隐藏UIPageViewController中的点

时间:2013-12-23 18:09:39

标签: ios cocoa-touch ios7 uipageviewcontroller uipagecontrol

我想做一件非常简单的事情。只需删除所有点,以及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];

关于如何删除点的任何想法?

5 个答案:

答案 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];

这具有在数据源与其表示之间保持更清晰分隔的另一个好处。

更新: 不幸的是,这不是一个完美的解决方案,因为它隐藏了控件但没有将其删除(仍然存在与隐藏控件相同高度的空白空间)。我还没有找到一种方法来配置现有控件来解决此问题。