自定义UIPageControl,可修改任何属性,简单粗暴

本文介绍如何使用自定义的UIView替代系统默认的UIPageControl,通过设置图片来实现个性化导航体验,包括创建类的方法、初始化、设置页面数量、当前页面以及激活状态图片等操作,并提供了一个简单的实例来展示实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近项目开发有需求是用到自定义的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两个属性改成你想要的两种任意图片了。。。。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值