web-dev-qa-db-ja.com

UIPageViewControllerからドットを非表示

とてもシンプルなことをしたいと思います。 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];

ドットを削除する方法についてのアイデアはありますか?

55
Stefan Salatic

ページコントロールは、データソースが次のメソッドを実装している場合にのみ表示されます。

presentationCountForPageViewController:
presentationIndexForPageViewController:

これらの実装を単に削除すると、ページコントロールは表示されません。から データソースドキュメント

「ページインジケーターのサポート」の両方のメソッドが実装され、ページビューコントローラーの遷移スタイルがUIPageViewControllerTransitionStyleScrollである場合、ページインジケーターが表示されます。

197
jrturton

私の状況では、複数のUIPageViewControllers(-[UITableView didSelectRowAtIndexPath]から作成)があり、そのうちのいくつかには1ページしか含まれていません。 UITableViewの行ごとに異なるコントローラーを使用する代わりに、次のようにUIPageViewControllerデリゲートメソッドを実装しました。

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
    return ([self numberOfPages] == 1 ? 0 : [self numberOfPages]);
}

UIPageViewControllerがドットを表示しないように思われるページが1ページしかない場合、これは0を返します。それは手ごわいですが、動作するようです(iOS SDK 7.0)。

「よりクリーンな」方法は、1ページしかないUIPageControllersの実行時にメソッドを削除することだと思いますが、これにはいくつかの豪華なobjCランタイム操作が含まれます。

このアプローチについてのコメントは?

11
mts

実行時にこれらのドットを動的に非表示にする場合は、presentationIndexForPageViewControllerデリゲートから-1を返します。

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count
}

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return yourPageVCs.count > 1 ? 0 : -1
}

この場合、1ページ(片面)しかない場合、ドットは非表示になります。

4
iOSergey

上記の修正は、最初のページ数が固定されていても問題なく機能します。

ページを動的に増減させるにできる場合、問題を解決するためにさまざまなアプローチを試しました。

そこで、コンポーネント自体を手動で非表示にする以下のメソッドを使用しました。

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
}
1
muhammed basil