Ich entwickle eine Anwendung, in der ich entweder die Farbe oder das Bild von UIPageControl
Paginierungspunkten ändern möchte . Wie kann ich das ändern? Ist es möglich, das UIpageControl
obige Szenario anzupassen ?
quelle
Ich entwickle eine Anwendung, in der ich entweder die Farbe oder das Bild von UIPageControl
Paginierungspunkten ändern möchte . Wie kann ich das ändern? Ist es möglich, das UIpageControl
obige Szenario anzupassen ?
AKTUALISIEREN:
Diese Antwort ist 6 Jahre alt und sehr veraltet, zieht aber immer noch Stimmen und Kommentare an. Seit iOS 6.0 sollten Sie die Eigenschaften pageIndicatorTintColor
und currentPageIndicatorTintColor
verwenden UIPageControl
.
URSPRÜNGLICHE ANTWORT:
Ich bin heute auf dieses Problem gestoßen und habe beschlossen, meine eigene einfache Ersatzklasse zu schreiben.
Es ist eine untergeordnete UIView, die Core Graphics verwendet, um die Punkte in den von Ihnen angegebenen Farben zu rendern.
Sie verwenden die exponierten Eigenschaften, um sie anzupassen und zu steuern.
Wenn Sie möchten, können Sie ein Delegatenobjekt registrieren, um Benachrichtigungen zu erhalten, wenn der Benutzer auf einen der kleinen Seitenpunkte tippt. Wenn kein Delegat registriert ist, reagiert die Ansicht nicht auf Berührungseingaben.
Es ist völlig frisch aus dem Ofen, scheint aber zu funktionieren. Lassen Sie mich wissen, wenn Sie Probleme damit haben.
Zukünftige Verbesserungen:
Anwendungsbeispiel:
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];
Header-Datei:
//
// 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
Implementierungsdatei:
//
// 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
In iOS 6 können Sie die Farbtonfarbe einstellen für
UIPageControl
:Es gibt 2 neue Eigenschaften:
pageIndicatorTintColor
currentPageIndicatorTintColor
Sie können auch die Darstellungs-API verwenden, um die Farbtonfarbe aller Seitenindikatoren zu ändern.
Wenn Sie auf iOS 5 abzielen, stellen Sie sicher, dass es nicht abstürzt:
quelle
funktioniert für iOS6
quelle
Falls jemand eine ARC / moderne Version davon möchte (keine Notwendigkeit, Eigenschaften als ivar neu zu definieren, kein Dealloc und arbeitet mit Interface Builder):
PageControl.m:
quelle
Die Antwort von Heiberg funktioniert sehr gut, aber das Seitensteuerelement verhält sich nicht genau wie das von Apple.
Wenn Sie möchten, dass sich das Seitensteuerelement wie das von Apple verhält (erhöhen Sie die aktuelle Seite immer um eins, wenn Sie die zweite Hälfte berühren, andernfalls um eins verringern), versuchen Sie stattdessen diese touchBegan-Methode:
quelle
Fügen Sie DidFinishLauch in AppDelegate den folgenden Code hinzu:
Hoffe das wird helfen.
quelle
Verwenden Sie dies zum Codieren
oder über das Storyboard können Sie die aktuelle Seitentönung ändern
quelle
In Swift erhält dieser Code im UIPageViewController einen Verweis auf die Seitenanzeige und legt deren Eigenschaften fest
quelle
UIPageControl
ist nicht dasselbe wieUIPageViewController
Das Hinzufügen zu vorhandenen Antworten kann wie folgt erfolgen:
quelle
Mit Swift 1.2 ist das ganz einfach:
quelle
UIPageControl.appearanceWhenContainedInInstancesOfClasses([MyClassName.self])
stattdessen anstelle vonUIPageControl.appearance()
. Benötigt iOS 9.Sie können das Problem problemlos beheben, indem Sie Ihrer appdelegate.m- Datei in Ihrer
didFinishLaunchingWithOptions
Methode den folgenden Code hinzufügen :quelle
Dies funktioniert für mich in iOS 7.
quelle
Es ist aus offizieller Sicht nicht möglich, das iPhone SDK zu verwenden. Möglicherweise können Sie dies mit privaten Methoden tun, dies ist jedoch ein Hindernis für den Zugriff auf den App Store.
Die einzige andere sichere Lösung besteht darin, ein eigenes Seitensteuerelement zu erstellen, das nicht allzu schwierig sein sollte, da das Seitensteuerelement einfach anzeigt, welche Seite derzeit in einer Bildlaufansicht angezeigt wird.
quelle
@Jasarien Ich denke, Sie können UIPageControll unterordnen, Zeile nur aus Apple Doc ausgewählt. "Unterklassen, die das Erscheinungsbild des Seitensteuerelements anpassen, können diese Methode verwenden, um die Größe des Seitensteuerelements zu ändern, wenn sich die Seitenzahl ändert" für die Methode sizeForNumberOfPages:
quelle
Sie können auch die Three20-Bibliothek verwenden, die ein stilisierbares PageControl und Dutzende anderer hilfreicher Steuerelemente und Abstraktionen für die Benutzeroberfläche enthält.
quelle
Ab
Swift 2.0
und zu funktioniert der folgende Code:quelle
quelle