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