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