最近项目开发有需求是用到自定义的UIPageControl,添加自己的图片而不是系统自带单调的白色和灰色小圆点
一开始根据网上很多人说的做法,http://www.cnblogs.com/wengzilin/p/3210331.html的做法,直接导致程序崩溃!!!
原因很简单
-(void) updateDots 13 { 14 for (int i = 0; i < [self.subviews count]; i++) 15 { 16 UIImageView* dot = [self.subviews objectAtIndex:i]; 17 if (i == self.currentPage) dot.image = activeImage; 18 else dot.image = inactiveImage; 19 } 20 }
这个方法里面,继承UIPageControl 的self.subviews并不是UIImageView,而是uiview。。。。
setimage的时候当然会崩溃了。。。
还有就是http://code4app.com/ios/SMPageControl/507e30146803fa2705000000 这个,虽然达到要求并且好像很强大的样子,但这个貌似太复杂了,不好理解,还是果断弃用了
最后是根据某个论坛有人写的代码(找不到网址了)修改得到下面简单而方便又实用的方式:不继承UIPageControl,也不继承UIControl,直接用uiview实现,简单粗暴就是爽!!!:
MyPageControl.h
#import <UIKit/UIKit.h>
@interface MyPageControl : UIView
@property (nonatomic,assign) int numberOfPages;
@property (nonatomic,assign) int currentPage;
@property (nonatomic,assign) float PointSize; //指示图标的长和宽
@property (nonatomic,assign) float distanceOfPoint; //间隔距离
@property (nonatomic,assign) UIColor *currentPagePointColor; //暂时没用
@property (nonatomic,assign) UIColor *pagePointColor; //暂时没用
@property (nonatomic,retain) NSString *inactiveImage; //激活状态图片
@property (nonatomic,retain) NSString *activeImage; //未激活状态图片
-(float)sizeForNumberOfPages:(NSInteger)pages;
-(void)setNumberOfPages:(NSInteger)pages;
-(void)setCurrentPage:(NSInteger)page;
@end
.m
#import "MyPageControl.h"
@implementation MyPageControl
@synthesize currentPage = _currentPage;
@synthesize numberOfPages = _numberOfPages;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
-(float)sizeForNumberOfPages:(NSInteger)pages{
return _distanceOfPoint*(pages+1) + _PointSize*pages;
}
-(void) setNumberOfPages:(NSInteger)pages{
for (int i = 0; i < pages; i++) {
UIImageView * pointImageView = [[UIImageView alloc] initWithFrame:CGRectMake(_distanceOfPoint +(_distanceOfPoint+_PointSize)*i, (self.frame.size.height-_PointSize)/2, _PointSize, _PointSize)];
pointImageView.image=[UIImage imageNamed:self.inactiveImage];
[self addSubview:pointImageView];
}
}
- (void) setCurrentPage:(NSInteger)page {
int countOfPages = [self.subviews count];
for (NSUInteger subviewIndex = 0; subviewIndex < countOfPages; subviewIndex++) {
UIImageView* subview = [self.subviews objectAtIndex:subviewIndex];
if (subviewIndex == page) {
subview.image = [UIImage imageNamed:self.activeImage];
}else{
subview.image = [UIImage imageNamed:self.inactiveImage];
}
}
}
@end
调用时也特别简单,但要注意的是,设置下面的几个属性的时候,不能调换顺序,具体原因,看程序便懂。。。
MyPageControl *pageControl = [[MyPageControl alloc] initWithFrame:CGRectMake(viewWitdh/3, viewHeight-60, viewWitdh/3, 30)];
pageControl.inactiveImage=@"inactiveImage";
pageControl.activeImage =@"activeImage";
pageControl.PointSize=24;
pageControl.distanceOfPoint=10;
[pageControl setNumberOfPages:3];
pageControl.currentPage = 0;
//以上几个属性不能调换顺序设置,不然有问题
[self.window addSubview:pageControl];
这样就可以随便根据inactiveImage和activeImage两个属性改成你想要的两种任意图片了。。。。。