Скрыть точки из 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 ответов
элемент управления 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).
Я полагаю, a "более чистый" способ-удалить методы во время выполнения для тех 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
}