ios - Ocultar puntos de UIPageViewController
cocoa-touch ios7 (4)
En mi situación, tengo varios UIPageViewControllers (creados a partir de [UITableView didSelectRowAtIndexPath]), algunos de los cuales contienen solo 1 página. En lugar de utilizar diferentes controladores para diferentes filas de UITableView, implementé el método delegado UIPageViewController de la siguiente manera:
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
return ([self numberOfPages] == 1 ? 0 : [self numberOfPages]);
}
Esto devuelve 0 si solo hay 1 página que parece hacer que UIPageViewController no muestre los puntos. Es un kludge pero parece funcionar (iOS SDK 7.0).
Supongo que una manera "más limpia" sería eliminar los métodos en tiempo de ejecución para aquellos UIPageControllers que tengan solo 1 página, pero esto implicaría una manipulación de tiempo de ejecución de objC sofisticada.
Comentarios sobre este enfoque?
Me gustaría hacer algo bastante simple. Simplemente elimine todos los puntos y la barra en la parte inferior del UIPageViewController.
Esta es la configuración: tengo un controlador de vista personalizado que tiene UIPageViewController * pageController. Lo visualizo así:
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];
¿Alguna idea sobre cómo elimino los puntos?
El control de página solo se muestra si el origen de datos implementa estos métodos:
presentationCountForPageViewController:
presentationIndexForPageViewController:
Simplemente elimine su implementación de estos y no se mostrará el control de página. De los documentos de fuente de datos :
Si se implementan ambos métodos en "Compatibilidad con un indicador de página" y el estilo de transición del controlador de vista de página es UIPageViewControllerTransitionStyleScroll, un indicador de página estará visible.
Si desea ocultar esos puntos dinámicamente en el tiempo de ejecución, devuelva -1 desde el delegado presentationIndexForPageViewController:
func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
return yourPageVCs.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
return yourPageVCs.count > 1 ? 0 : -1
}
En este caso, si tiene solo 1 página (un solo lado), los puntos se ocultarán.
Las correcciones anteriores funcionan bien con un número fijo de páginas al principio.
Probé diferentes enfoques para resolver el problema cuando las páginas se pueden aumentar o disminuir dinámicamente .
Así que utilicé el siguiente método que ocultará manualmente el componente en sí.
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
}
}
}
Y esto debería ser llamado desde
public func presentationCount(for pageViewController: UIPageViewController) -> Int {
togglePageControl(pageCount: pages.count)
// or togglePageControl(pageCount: pages.count, threshold: 5)
return pages.count
}