我正在开发一个应用程序,我想在其中更改UIPageControl分页点的颜色或图像。我怎样才能改变它?是否可以UIpageControl在上述情况下进行自定义?
UIPageControl
UIpageControl
更新:
这个答案已有 6 年历史并且非常过时,但它仍然吸引着投票和评论。pageIndicatorTintColor从 iOS 6.0 开始,您应该currentPageIndicatorTintColor在UIPageControl.
pageIndicatorTintColor
currentPageIndicatorTintColor
原始答案:
今天遇到了这个问题,决定自己写一个简单的替换类。
它是一个子类 UIView,它使用 Core Graphics 以您指定的颜色呈现点。
您使用公开的属性来自定义和控制它。
如果您愿意,您可以注册一个委托对象以在用户点击其中一个小页面点时获取通知。如果没有注册委托,则视图不会对触摸输入做出反应。
它是从烤箱里完全新鲜出炉的,但似乎有效。如果您遇到任何问题,请告诉我。
未来的改进:
示例使用:
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];
头文件:
// // PageControl.h // // Replacement for UIPageControl because that one only supports white dots. // // Created by Morten Heiberg <morten@heiberg.net> 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
实现文件:
// // PageControl.m // // Replacement for UIPageControl because that one only supports white dots. // // Created by Morten Heiberg <morten@heiberg.net> 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