switch iphone ios uipagecontrol

iphone - switch - ios selector



¿Cómo puedo cambiar el color de los puntos de paginación de UIPageControl? (18)

Estoy desarrollando una aplicación en la que deseo cambiar el color o la imagen de los puntos de paginación de UIPageControl . ¿Cómo puedo cambiarlo? ¿Es posible personalizar UIpageControl en el escenario anterior?


@Jasarien Creo que puede subclasificar UIPageControll, línea seleccionada de Apple Doc solamente "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 cambia el número de páginas" para el método sizeForNumberOfPages:


Agregando a las respuestas existentes, se puede hacer como,


Agregue el siguiente código a DidFinishLauch en AppDelegate,

UIPageControl *pageControl = [UIPageControl appearance]; pageControl.pageIndicatorTintColor = [UIColor lightGrayColor]; pageControl.currentPageIndicatorTintColor = [UIColor blackColor]; pageControl.backgroundColor = [UIColor whiteColor];

Espero que esto ayude


Aquí hay una solución de Swift 3.0 ... usted sabe si está de acuerdo con aceptar el riesgo establecido: "La modificación de las subvistas de un control existente es frágil".

Deberá llamar a updateDots () en su viewDidAppear () y su controlador valueChanged para el control de página.

import UIKit class CustomImagePageControl: UIPageControl { let activeImage:UIImage = UIImage(named: "SelectedPage")! let inactiveImage:UIImage = UIImage(named: "UnselectedPage")! override func awakeFromNib() { super.awakeFromNib() self.pageIndicatorTintColor = UIColor.clear self.currentPageIndicatorTintColor = UIColor.clear self.clipsToBounds = false } func updateDots() { var i = 0 for view in self.subviews { if let imageView = self.imageForSubview(view) { if i == self.currentPage { imageView.image = self.activeImage } else { imageView.image = self.inactiveImage } i = i + 1 } else { var dotImage = self.inactiveImage if i == self.currentPage { dotImage = self.activeImage } view.clipsToBounds = false view.addSubview(UIImageView(image:dotImage)) i = i + 1 } } } fileprivate func imageForSubview(_ view:UIView) -> UIImageView? { var dot:UIImageView? if let dotImageView = view as? UIImageView { dot = dotImageView } else { for foundView in view.subviews { if let imageView = foundView as? UIImageView { dot = imageView break } } } return dot } }


En Swift, este código dentro de UIPageViewController obtiene una referencia al indicador de página y establece sus propiedades

override func viewDidLoad() { super.viewDidLoad() //Creating the proxy let pageControl = UIPageControl.appearance() //Customizing pageControl.pageIndicatorTintColor = UIColor.lightGrayColor() pageControl.currentPageIndicatorTintColor = UIColor.darkGrayColor() //Setting the background of the view controller so the dots wont be on a black background self.view.backgroundColor = UIColor.whiteColor() }


En caso de que alguien quiera una ARC / versión moderna de la misma (no es necesario redefinir las propiedades como ivar, sin dealloc, y funciona con Interface Builder):

#import <UIKit/UIKit.h> @protocol PageControlDelegate; @interface PageControl : UIView // Set these to control the PageControl. @property (nonatomic) NSInteger currentPage; @property (nonatomic) NSInteger numberOfPages; // Customize these as well as the backgroundColor property. @property (nonatomic, strong) UIColor *dotColorCurrentPage; @property (nonatomic, strong) UIColor *dotColorOtherPage; // Optional delegate for callbacks when user taps a page dot. @property (nonatomic, weak) NSObject<PageControlDelegate> *delegate; @end @protocol PageControlDelegate<NSObject> @optional - (void)pageControlPageDidChange:(PageControl *)pageControl; @end

PageControl.m:

#import "PageControl.h" // Tweak these or make them dynamic. #define kDotDiameter 7.0 #define kDotSpacer 7.0 @implementation PageControl @synthesize dotColorCurrentPage; @synthesize dotColorOtherPage; @synthesize currentPage; @synthesize numberOfPages; @synthesize delegate; - (void)setCurrentPage:(NSInteger)page { currentPage = MIN(MAX(0, page), self.numberOfPages-1); [self setNeedsDisplay]; } - (void)setNumberOfPages:(NSInteger)pages { numberOfPages = MAX(0, pages); currentPage = MIN(MAX(0, self.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]; } return self; } -(id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { self.dotColorCurrentPage = [UIColor blackColor]; self.dotColorOtherPage = [UIColor lightGrayColor]; } return self; } - (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<self.numberOfPages; i++) { CGRect circleRect = CGRectMake(x, y, kDotDiameter, kDotDiameter); if (i == self.currentPage) { CGContextSetFillColorWithColor(context, self.dotColorCurrentPage.CGColor); } else { CGContextSetFillColorWithColor(context, self.dotColorOtherPage.CGColor); } CGContextFillEllipseInRect(context, circleRect); x += kDotDiameter + kDotSpacer; } } - (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 el contexto de Swift 2.0 y Swift 2.0 posteriores, el siguiente código funcionará:

pageControl.pageIndicatorTintColor = UIColor.whiteColor() pageControl.currentPageIndicatorTintColor = UIColor.redColor()


En iOS 6 puedes establecer el color del tinte de UIPageControl :

Hay 2 nuevas propiedades:

  • pageIndicatorTintColor
  • currentPageIndicatorTintColor

También puede usar la API de apariencia para cambiar el color del tinte de todos los indicadores de página.

Si su objetivo es iOS 5, asegúrese de que no se cuelgue:

if ([pageControl respondsToSelector:@selector(setPageIndicatorTintColor:)]) { pageControl.pageIndicatorTintColor = [UIColor whiteColor]; }


Es fácil con Swift 1.2:

UIPageControl.appearance().pageIndicatorTintColor = UIColor.lightGrayColor() UIPageControl.appearance().currentPageIndicatorTintColor = UIColor.redColor()


Esto funciona para mí en iOS 7.

pageControl.pageIndicatorTintColor = [UIColor purpleColor]; pageControl.currentPageIndicatorTintColor = [UIColor magentaColor];


La respuesta proporcionada por Heiberg funciona muy bien, sin embargo, el control de página no se comporta exactamente como el de Apple.

Si desea que el control de la página se comporte como el de apple (siempre incremente la página actual en uno si toca la segunda mitad, de lo contrario disminuya en uno), pruebe este método touchesBegan:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ CGPoint touchPoint = [[[event touchesForView:self] anyObject] locationInView:self]; CGRect currentBounds = self.bounds; CGFloat x = touchPoint.x - CGRectGetMidX(currentBounds); if(x<0 && self.currentPage>=0){ self.currentPage--; [self.delegate pageControlPageDidChange:self]; } else if(x>0 && self.currentPage<self.numberOfPages-1){ self.currentPage++; [self.delegate pageControlPageDidChange:self]; } }


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 sea demasiado difícil dado que el control de página simplemente muestra qué página se muestra actualmente en una vista de desplazamiento.


Puede solucionarlo fácilmente agregando el siguiente código a su archivo appdelegate.m en su método didFinishLaunchingWithOptions :

UIPageControl *pageControl = [UIPageControl appearance]; pageControl.pageIndicatorTintColor = [UIColor darkGrayColor]; pageControl.currentPageIndicatorTintColor = [UIColor orangeColor]; pageControl.backgroundColor = [UIColor whiteColor]


También podría usar la Biblioteca Three20 que contiene un PageControl con estilo y docenas de otros Controles y Extracciones UI útiles.


usa esto para codificar

if ([pageControl respondsToSelector:@selector(setPageIndicatorTintColor:)]) { pageControl.pageIndicatorTintColor = [UIColor whiteColor]; }

o desde el guión gráfico puede cambiar el tinte de la página actual


ACTUALIZAR:

Esta respuesta tiene 6 años de antigüedad y está muy desactualizada, pero sigue atrayendo votos y comentarios. Desde iOS 6.0, debe utilizar las propiedades pageIndicatorTintColor y currentPageIndicatorTintColor en UIPageControl .

RESPUESTA ORIGINAL:

Me encontré con este problema hoy y decidí escribir mi propia clase de reemplazo simple.

Es una UIView subclase que utiliza 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 toque uno de los pequeños puntos de página. Si no se registra ningún delegado, la vista no reaccionará a la entrada táctil.

Está completamente fresco del horno, pero parece funcionar. Avíseme si tiene algún problema.

Mejoras futuras:

  • Cambie el tamaño de los puntos para que se ajusten a los límites actuales si hay demasiados.
  • No vuelva a dibujar toda la vista en drawRect:

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


myView.superview.tintColor = [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f];


pageControl.pageIndicatorTintColor = [UIColor redColor]; pageControl.currentPageIndicatorTintColor = [UIColor redColor];

funciona para iOS6