Estoy desarrollando una aplicación en la que quiero cambiar el color o la imagen de los UIPageControl
puntos de paginación. ¿Cómo puedo cambiarlo? ¿Es posible personalizar UIpageControl
en el escenario anterior?
fuente
Estoy desarrollando una aplicación en la que quiero cambiar el color o la imagen de los UIPageControl
puntos de paginación. ¿Cómo puedo cambiarlo? ¿Es posible personalizar UIpageControl
en el escenario anterior?
ACTUALIZAR:
Esta respuesta tiene 6 años y está muy desactualizada, pero sigue atrayendo votos y comentarios. Desde iOS 6.0 deberías usar las propiedades pageIndicatorTintColor
y .currentPageIndicatorTintColor
UIPageControl
RESPUESTA ORIGINAL:
Me encontré con este problema hoy y decidí escribir mi propia clase de reemplazo simple.
Es una UIView subclase que usa Core Graphics para representar los puntos en los colores que especifique.
Utiliza las propiedades expuestas para personalizarlo y controlarlo.
Si lo desea, puede registrar un objeto delegado para recibir notificaciones cuando el usuario toca uno de los pequeños puntos de página. Si no hay un delegado registrado, la vista no reaccionará a la entrada táctil.
Está completamente recién salido del horno, pero parece funcionar. Avísame si tienes algún problema con él.
Mejoras futuras:
Ejemplo de uso:
CGRect f = CGRectMake(0, 0, 320, 20);
PageControl *pageControl = [[[PageControl alloc] initWithFrame:f] autorelease];
pageControl.numberOfPages = 10;
pageControl.currentPage = 5;
pageControl.delegate = self;
[self addSubview:pageControl];
Archivo de cabecera:
//
// PageControl.h
//
// Replacement for UIPageControl because that one only supports white dots.
//
// Created by Morten Heiberg <[email protected]> on November 1, 2010.
//
#import <UIKit/UIKit.h>
@protocol PageControlDelegate;
@interface PageControl : UIView
{
@private
NSInteger _currentPage;
NSInteger _numberOfPages;
UIColor *dotColorCurrentPage;
UIColor *dotColorOtherPage;
NSObject<PageControlDelegate> *delegate;
//If ARC use __unsafe_unretained id delegate;
}
// Set these to control the PageControl.
@property (nonatomic) NSInteger currentPage;
@property (nonatomic) NSInteger numberOfPages;
// Customize these as well as the backgroundColor property.
@property (nonatomic, retain) UIColor *dotColorCurrentPage;
@property (nonatomic, retain) UIColor *dotColorOtherPage;
// Optional delegate for callbacks when user taps a page dot.
@property (nonatomic, retain) NSObject<PageControlDelegate> *delegate;
@end
@protocol PageControlDelegate<NSObject>
@optional
- (void)pageControlPageDidChange:(PageControl *)pageControl;
@end
Archivo de implementación:
//
// PageControl.m
//
// Replacement for UIPageControl because that one only supports white dots.
//
// Created by Morten Heiberg <[email protected]> on November 1, 2010.
//
#import "PageControl.h"
// Tweak these or make them dynamic.
#define kDotDiameter 7.0
#define kDotSpacer 7.0
@implementation PageControl
@synthesize dotColorCurrentPage;
@synthesize dotColorOtherPage;
@synthesize delegate;
- (NSInteger)currentPage
{
return _currentPage;
}
- (void)setCurrentPage:(NSInteger)page
{
_currentPage = MIN(MAX(0, page), _numberOfPages-1);
[self setNeedsDisplay];
}
- (NSInteger)numberOfPages
{
return _numberOfPages;
}
- (void)setNumberOfPages:(NSInteger)pages
{
_numberOfPages = MAX(0, pages);
_currentPage = MIN(MAX(0, _currentPage), _numberOfPages-1);
[self setNeedsDisplay];
}
- (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame]))
{
// Default colors.
self.backgroundColor = [UIColor clearColor];
self.dotColorCurrentPage = [UIColor blackColor];
self.dotColorOtherPage = [UIColor lightGrayColor];
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedRight:)];
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
[self addGestureRecognizer:swipeRight];
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedLeft:)];
[swipe setDirection:UISwipeGestureRecognizerDirectionLeft];
[self addGestureRecognizer:swipe];
}
return self;
}
-(void) swipedLeft:(UISwipeGestureRecognizer *) recognizer
{
self.currentPage++;
}
-(void) swipedRight:(UISwipeGestureRecognizer *) recognizer
{
self.currentPage--;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetAllowsAntialiasing(context, true);
CGRect currentBounds = self.bounds;
CGFloat dotsWidth = self.numberOfPages*kDotDiameter + MAX(0, self.numberOfPages-1)*kDotSpacer;
CGFloat x = CGRectGetMidX(currentBounds)-dotsWidth/2;
CGFloat y = CGRectGetMidY(currentBounds)-kDotDiameter/2;
for (int i=0; i<_numberOfPages; i++)
{
CGRect circleRect = CGRectMake(x, y, kDotDiameter, kDotDiameter);
if (i == _currentPage)
{
CGContextSetFillColorWithColor(context, self.dotColorCurrentPage.CGColor);
}
else
{
CGContextSetFillColorWithColor(context, self.dotColorOtherPage.CGColor);
}
CGContextFillEllipseInRect(context, circleRect);
x += kDotDiameter + kDotSpacer;
}
}
- (void)dealloc
{
[dotColorCurrentPage release];
[dotColorOtherPage release];
[delegate release];
[super dealloc];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if (!self.delegate) return;
CGPoint touchPoint = [[[event touchesForView:self] anyObject] locationInView:self];
CGFloat dotSpanX = self.numberOfPages*(kDotDiameter + kDotSpacer);
CGFloat dotSpanY = kDotDiameter + kDotSpacer;
CGRect currentBounds = self.bounds;
CGFloat x = touchPoint.x + dotSpanX/2 - CGRectGetMidX(currentBounds);
CGFloat y = touchPoint.y + dotSpanY/2 - CGRectGetMidY(currentBounds);
if ((x<0) || (x>dotSpanX) || (y<0) || (y>dotSpanY)) return;
self.currentPage = floor(x/(kDotDiameter+kDotSpacer));
if ([self.delegate respondsToSelector:@selector(pageControlPageDidChange:)])
{
[self.delegate pageControlPageDidChange:self];
}
}
@end
En iOS 6 puede configurar el color de tinte de
UIPageControl
:Hay 2 nuevas propiedades:
pageIndicatorTintColor
currentPageIndicatorTintColor
También puede usar la API de apariencia para cambiar el color de tinte de todos los indicadores de página.
Si está apuntando a iOS 5, asegúrese de que no se bloquee:
fuente
funciona para iOS6
fuente
En caso de que alguien quiera una versión ARC / moderna (no es necesario redefinir las propiedades como ivar, no dealloc y funciona con Interface Builder):
PageControl.m:
fuente
La respuesta proporcionada por Heiberg funciona muy bien, sin embargo, el control de la página no se comporta exactamente como el de Apple.
Si desea que el control de la página se comporte como lo hace el de Apple (siempre incremente la página actual en uno si toca la segunda mitad, de lo contrario, disminuya en uno), intente con este método touchBegan:
fuente
Agregue el siguiente código a DidFinishLauch en AppDelegate,
Espero que esto ayude.
fuente
use esto para codificar
o desde el guión gráfico puede cambiar el tinte de la página actual
fuente
En Swift, este código dentro del UIPageViewController obtiene una referencia al indicador de página y establece sus propiedades
fuente
UIPageControl
no es lo mismo queUIPageViewController
Agregando a las respuestas existentes, se puede hacer como,
fuente
Es fácil con Swift 1.2:
fuente
UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClassName.self])
lugar deUIPageControl.appearance()
. Requiere iOS 9.Puede solucionarlo fácilmente agregando el siguiente código a su archivo appdelegate.m en su
didFinishLaunchingWithOptions
método:fuente
Esto me funcionó en iOS 7.
fuente
No es posible usar el SDK de iPhone desde un punto de vista oficial. Es posible que pueda hacerlo utilizando métodos privados, pero eso será una barrera para acceder a la tienda de aplicaciones.
La única otra solución segura es crear su propio control de página que no debe ser demasiado difícil dado que el control de página simplemente muestra qué página se muestra actualmente en una vista de desplazamiento.
fuente
@Jasarien Creo que puede subclasificar UIPageControll, línea seleccionada solo de Apple doc "Las subclases que personalizan la apariencia del control de página pueden usar este método para cambiar el tamaño del control de página cuando el recuento de páginas cambia" para el método sizeForNumberOfPages:
fuente
También puede usar la biblioteca Three20 que contiene un control de página con estilo y docenas de otros controles y abstracciones de interfaz de usuario útiles.
fuente
En mayúsculas
Swift 2.0
y minúsculas, el siguiente código funcionará:fuente
fuente