tutorial page control ios ios6 uipageviewcontroller uipagecontrol

ios - swift page control tutorial



¿Acceder al UIPageControl creado por iOS6 UIPageViewController? (6)

En Swift :

let subviews: Array = self.pageViewController.view.subviews var pageControl: UIPageControl! = nil for (var i = 0; i < subviews.count; i++) { if (subviews[i] is UIPageControl) { pageControl = subviews[i] as! UIPageControl break } }

Estoy usando un UIPageViewController con la navegación establecida en Horizontal, Estilo de transición establecido en Desplazamiento (en InterfaceBuilder) y sin columna vertebral. Lo que me da un encantador UIPageControl integrado. Ahora quiero poder alternar si se muestra (porque hay ilustraciones debajo).

He intentado configurar presentationCountForPageViewController y presentationIndexForPageViewController para devolver 0 cuando se supone que UIPageControl está oculto, pero esos métodos no se llaman cuando yo quiero.

Haciendo una pausa para stacktrace, veo que [UIPageViewController _updatePageControlViaDataSourceIfNecessary] ... [UIPageViewController _updatePageControlViaDataSourceIfNecessary] Supongo que mi aplicación se rechazaría si traté de usar ese método.

¿Debo buscar en ellas las subvistas, o hacer las mías para que tenga control sobre ellas, o hay alguna forma mejor de alternar su visibilidad?

¡Gracias!


Implementé una categoría para manejar esto, que me quita el código y me permite acceder a pageControl a través de "pageController.pageControl"

C objetivo

// Header @interface UIPageViewController (PageControl) @property (nonatomic, readonly) UIPageControl *pageControl; @end

También usé la recursión (manejada por bloques) en caso de que Apple decida cambiar la implementación haciendo que UIPageControl no esté en la primera capa de subvistas.

// Implementation #import "UIPageViewController+PageControl.h" @implementation UIPageViewController (PageControl) - (UIPageControl *)pageControl { __block UIPageControl *pageControl = nil; void (^pageControlAssignBlock)(UIPageControl *) = ^void(UIPageControl *blockPageControl) { pageControl = blockPageControl; }; [self recurseForPageControlFromSubViews:self.view.subviews withAssignBlock:pageControlAssignBlock]; return pageControl; } - (void)recurseForPageControlFromSubViews:(NSArray *)subViews withAssignBlock:(void (^)(UIPageControl *))assignBlock { for (UIView *subView in subViews) { if ([subView isKindOfClass:[UIPageControl class]]) { assignBlock((UIPageControl *)subView); break; } else { [self recurseForPageControlFromSubViews:subView.subviews withAssignBlock:assignBlock]; } } } @end

Esto puede ser excesivo para sus necesidades, pero funcionó bien para el mío


Puede acceder a esto para todos los objetos de PageControl mediante el appearance (consulte el protocolo UIAppearance ), pero para obtener una instancia específica, debe usar la recursión. Código SWIFT:

let pageControl = UIPageControl.appearance()


Swift 3 Extension:

extension UIPageViewController { var pageControl: UIPageControl? { for view in view.subviews { if view is UIPageControl { return view as? UIPageControl } } return nil } }


Yo diría que cazar a través de las subvistas. Este código encuentra exitosamente UIPageControl en la jerarquía de subvistas:

NSArray *subviews = pageController.view.subviews; UIPageControl *thisControl = nil; for (int i=0; i<[subviews count]; i++) { if ([[subviews objectAtIndex:i] isKindOfClass:[UIPageControl class]]) { thisControl = (UIPageControl *)[subviews objectAtIndex:i]; } }

Estoy usando esto para personalizar el color de los puntos, imagino que podrías hacer lo mismo con el valor alfa o enviarlo a la parte posterior o algo así.

Apple no proporciona una interfaz directa con UIPageControl a través de la clase UIPageViewController, pero no se requieren llamadas a métodos ilegales para llegar a ella ... No veo por qué esto daría lugar a un rechazo de la aplicación.


Para Swift

Para obtener los puntos en el control de página, podemos usar

//dots will be an array of the dots views let dots = pageControl.subviews

Para obtener la vista actual de puntos

let currentDot = dots[pageControl.currentPage]

Para obtener las vistas de los otros puntos

for i in 0..<dots.count { let dot = dots[i] if i == pageControl.currentPage { //dot => current dot } else { //dot => other dot } }

Después de obtener la vista de puntos podemos cambiar lo que queramos como

dot.layer.borderColor = .green dot.layer.borderWidth = 1