Estou desenvolvendo um aplicativo no qual desejo alterar a cor ou a imagem dos UIPageControl
pontos de paginação. Como posso mudá-lo? É possível personalizar UIpageControl
no cenário acima?
fonte
Estou desenvolvendo um aplicativo no qual desejo alterar a cor ou a imagem dos UIPageControl
pontos de paginação. Como posso mudá-lo? É possível personalizar UIpageControl
no cenário acima?
ATUALIZAR:
Esta resposta tem 6 anos e está muito desatualizada, mas ainda está atraindo votos e comentários. Desde o iOS 6.0, você deve usar as propriedades pageIndicatorTintColor
e currentPageIndicatorTintColor
em UIPageControl
.
RESPOSTA ORIGINAL:
Encontrei esse problema hoje e decidi escrever minha própria classe de substituição simples.
É um UIView sublassado que usa gráficos principais para renderizar os pontos nas cores que você especificar.
Você usa as propriedades expostas para personalizá-lo e controlá-lo.
Se desejar, você pode registrar um objeto delegado para receber notificações quando o usuário tocar em um dos pequenos pontos da página. Se nenhum representante estiver registrado, a visualização não reagirá ao toque na entrada.
Está completamente fresco no forno, mas parece funcionar. Deixe-me saber se você tiver algum problema com isso.
Melhorias futuras:
Exemplo 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];
Arquivo de cabeçalho:
//
// 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
Arquivo de implementação:
//
// 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
No iOS 6, você pode definir a cor da tonalidade de
UIPageControl
:Existem 2 novas propriedades:
pageIndicatorTintColor
currentPageIndicatorTintColor
Você também pode usar a API de aparência para alterar a cor da tonalidade de todos os indicadores de página.
Se você está segmentando o iOS 5, verifique se ele não falha:
fonte
funciona para iOS6
fonte
Caso alguém queira uma versão ARC / moderna (não há necessidade de redefinir propriedades como ivar, no dealloc e funciona com o Interface Builder):
PageControl.m:
fonte
A resposta fornecida por Heiberg funciona muito bem, no entanto, o controle de página não se comporta exatamente como o da apple.
Se você deseja que o controle de página se comporte como o da apple (sempre aumente a página atual em um se você tocar na segunda metade, caso contrário, diminua em um), tente o seguinte método:
fonte
Adicione o seguinte código ao DidFinishLauch no AppDelegate,
Espero que isso ajude.
fonte
use isso para codificação
ou no storyboard, você pode alterar o tom da página atual
fonte
No Swift, esse código dentro do UIPageViewController está obtendo uma referência ao indicador da página e definindo suas propriedades
fonte
UIPageControl
não é o mesmo queUIPageViewController
Adicionando respostas existentes, isso pode ser feito como,
fonte
É fácil com o Swift 1.2:
fonte
UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClassName.self])
vez deUIPageControl.appearance()
. Requer iOS 9.Você pode corrigi-lo com facilidade, adicionando o seguinte código ao arquivo appdelegate.m no seu
didFinishLaunchingWithOptions
método:fonte
Isso funcionou para mim no iOS 7.
fonte
Não é possível usar o iPhone SDK do ponto de vista oficial. Você pode fazê-lo usando métodos privados, mas isso será uma barreira para entrar na loja de aplicativos.
A única outra solução segura é criar seu próprio controle de página, o que não deve ser muito difícil, pois o controle de página simplesmente exibe a página exibida no momento em uma exibição de rolagem.
fonte
@ Jasarien Acho que você pode subclassificar UIPageControll, linha escolhida apenas do documento da apple "As subclasses que personalizam a aparência do controle de página podem usar esse método para redimensionar o controle de página quando a contagem de páginas mudar" para o método sizeForNumberOfPages:
fonte
Você também pode usar a Biblioteca Three20 que contém um PageControl estilizado e dezenas de outros Controles e Abstrações da UI úteis.
fonte
No caso de
Swift 2.0
e para cima, o código abaixo funcionará:fonte
fonte