Tworzę aplikację, w której chcę zmienić kolor lub obraz UIPageControl
kropek stronicowania. Jak mogę to zmienić? Czy można dostosować UIpageControl
powyższy scenariusz?
źródło
Tworzę aplikację, w której chcę zmienić kolor lub obraz UIPageControl
kropek stronicowania. Jak mogę to zmienić? Czy można dostosować UIpageControl
powyższy scenariusz?
AKTUALIZACJA:
Ta odpowiedź ma 6 lat i jest bardzo nieaktualna, ale wciąż przyciąga głosy i komentarze. Od wersji iOS 6.0 powinieneś używać właściwości pageIndicatorTintColor
i .currentPageIndicatorTintColor
UIPageControl
ORYGINALNA ODPOWIEDŹ:
Wpadłem dzisiaj na ten problem i postanowiłem napisać własną prostą klasę zastępczą.
Jest to sublasowany UIView, który używa Core Graphics do renderowania kropek w określonych przez Ciebie kolorach.
Za pomocą ujawnionych właściwości można go dostosowywać i kontrolować.
Jeśli chcesz, możesz zarejestrować obiekt delegowany, aby otrzymywać powiadomienia, gdy użytkownik stuknie jedną z małych kropek strony. Jeśli nie zostanie zarejestrowany żaden uczestnik, widok nie zareaguje na wprowadzanie dotykowe.
Z piekarnika jest całkowicie świeży, ale wydaje się, że działa. Daj mi znać, jeśli napotkasz jakieś problemy.
Przyszłe ulepszenia:
Przykładowe zastosowanie:
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];
Plik nagłówka:
//
// 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
Plik implementacyjny:
//
// 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
W iOS 6 możesz ustawić kolor odcienia
UIPageControl
:Istnieją 2 nowe właściwości:
pageIndicatorTintColor
currentPageIndicatorTintColor
Możesz także użyć interfejsu API wyglądu, aby zmienić kolor odcienia wszystkich wskaźników strony.
Jeśli celujesz w iOS 5, upewnij się, że się nie zawiesi:
źródło
działa na iOS6
źródło
W przypadku, gdy ktoś chce ARC / jego nowoczesnej wersji (nie trzeba ponownie definiować właściwości jako ivar, bez dealloc i współpracuje z Konstruktorem interfejsów):
PageControl.m:
źródło
Odpowiedź udzielona przez Heiberga działa naprawdę dobrze, jednak kontrola strony nie zachowuje się dokładnie tak samo jak Apple.
Jeśli chcesz, aby formant strony zachowywał się tak, jak ma to miejsce w przypadku Apple (zawsze zwiększaj bieżącą stronę o jedną, jeśli dotkniesz drugiej połowy, w przeciwnym razie zmniejsz o jedną), spróbuj zamiast tego dotknąć metody Began:
źródło
Dodaj następujący kod do DidFinishLauch w AppDelegate,
Mam nadzieję, że to pomoże.
źródło
użyj tego do kodowania
lub z serii ujęć możesz zmienić bieżący odcień strony
źródło
W Swift ten kod wewnątrz UIPageViewController otrzymuje odniesienie do wskaźnika strony i ustawia jego właściwości
źródło
UIPageControl
to nie to samo, coUIPageViewController
Dodając do istniejących odpowiedzi, można to zrobić w następujący sposób:
źródło
Z Swift 1.2 jest to łatwe:
źródło
UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClassName.self])
zamiastUIPageControl.appearance()
. Wymaga systemu iOS 9.Możesz to łatwo naprawić, dodając następujący kod do pliku appdelegate.m w
didFinishLaunchingWithOptions
metodzie:źródło
To działa dla mnie w iOS 7.
źródło
Z oficjalnego punktu widzenia nie można korzystać z iPhone SDK. Być może będziesz w stanie to zrobić za pomocą prywatnych metod, ale będzie to stanowić barierę przed wejściem do sklepu z aplikacjami.
Jedynym innym bezpiecznym rozwiązaniem jest utworzenie własnej kontroli strony, która nie powinna być zbyt trudna, biorąc pod uwagę, że kontrola strony pokazuje po prostu, która strona jest aktualnie wyświetlana w widoku przewijania.
źródło
@Jasarien Myślę, że można podklasować UIPageControll, linia wybrana tylko z Apple Doc „Podklasy, które dostosowują wygląd formantu strony, mogą użyć tej metody do zmiany rozmiaru formantu strony, gdy zmienia się liczba stron” dla metody sizeForNumberOfPages:
źródło
Możesz także użyć biblioteki Three20, która zawiera stylowy PageControl oraz dziesiątki innych przydatnych kontrolek i abstrakcji interfejsu użytkownika.
źródło
W przypadku
Swift 2.0
wzwyż i niżej poniższy kod będzie działał:źródło
źródło