Скрыть точки от 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];

любые идеи о том, как удалить точки?

4 51

4 ответа:

элемент управления page отображается только в том случае, если источник данных реализует следующие методы:

presentationCountForPageViewController:
presentationIndexForPageViewController:

просто удалите их реализацию, и элемент управления страницей не будет отображаться. От источник данных docs:

Если реализованы оба метода в разделе "Поддержка индикатора страницы", а стиль перехода контроллера представления страницы-UIPageViewControllerTransitionStylescroll, отображается индикатор страницы.

в моей ситуации у меня есть несколько UIPageViewControllers (созданных из -[UITableView didSelectRowAtIndexPath]), некоторые из которых содержат только 1 страницу. Вместо использования разных контроллеров для разных строк UITableView я реализовал метод делегата UIPageViewController следующим образом:

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

Это возвращает 0, если есть только 1 страница, которая, кажется, делает UIPageViewController не показывать точки. Это kludge, но он, похоже, работает (iOS SDK 7.0).

Я полагаю "более чистым" способом было бы удалить методы во время выполнения для тех UIPageControllers, которые имеют только 1 страницу, но это будет связано с некоторыми причудливыми манипуляциями во время выполнения objC.

комментарии к этому подходу?

Если вы хотите скрыть эти точки динамически во время выполнения, то верните -1 из делегата presentationIndexForPageViewController:

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

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

в этом случае, если у вас есть только 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
}