xcode 自定义progressbar(圆角) BaseProgressBar

本文档介绍了如何使用Xcode自定义一个带有圆角的进度条控件BaseProgressBar,包括初始化方法、设置最大值、当前值以及动画效果。通过导入QuartzCore框架实现圆角效果,并提供了动画图片的加载和渐变颜色的绘制。

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

#import <UIKit/UIKit.h>


@interface BaseProgressBar : UIView

{

    float preValue;

    float minValue;

    float maxValue;

float currentValue;

    float vx;

}

@property (nonatomic, retain)UIImageView * bgImageView;

@property (nonatomic, retain)UIImageView * imageView;

@property (nonatomic, retain)NSTimer * timer;

@property (nonatomic, readwrite) float currentValue;

@property (nonatomic, readwrite) float maxValue;

@property (nonatomic, assign)BOOL isAnimation;

- (id)initWithFrame:(CGRect)frame imageName:(NSArray *)array;

@property (nonatomic,assign) id delegate;

@end


@protocol BaseProgressBarDelegate

-(void)progressEnd;

@end





#import "BaseProgressBar.h"

#import "DrawAndAnimation.h"

#import "ImageManager.h"

#import "GameConst.h"

//设置圆角需要倒的包

#import <QuartzCore/QuartzCore.h>

@implementation BaseProgressBar

@synthesize timer;

@synthesize maxValue;

@synthesize currentValue;


- (id)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        // Initialization code

        self.backgroundColor  =  [UIColor clearColor]; 

//设置圆角代码

        [self.layer setMasksToBounds:YES];

        [self.layer setBorderWidth:1.0];

        minValue = 0.0f;

        maxValue = 1.0f;

        currentValue = 0.0f;

        preValue = currentValue;

        

        

    }

    return self;

}


- (id)initWithFrame:(CGRect)frame imageName:(NSArray *)array

{

    self = [super initWithFrame:frame];

    if (self) {

        // Initialization code

        self.backgroundColor  =  [UIColor clearColor];

        self.isAnimation =YES;

        

        _bgImageView  = [[UIImageView alloc] initWithImage:[[ImageManager sharedImageManager] imageNamed:@"frame_loading.png"]];

        [_bgImageView setFrame:CGRectMake(0 ,0self.frame.size.width + 9*Content_Size ,1.1 * self.frame.size.height)];

        _bgImageView.center =CGPointMake(self.frame.size.width/2, self.frame.size.height/2);

        [self addSubview:_bgImageView];

        //        [_bgImageView setContentStretch:CGRectMake(0.4, 0.4,0.2,0.2)];

        [_bgImageView release];

        

        NSMutableArray *imageArr = [[NSMutableArray alloc] init];

        

        for (NSString * keyStr in array)

        {

            UIImage *image =   [[ImageManager sharedImageManager] imageNamed:[NSString stringWithFormat:@"%@.png",keyStr]];

            [imageArr addObject:image];

        }

        

        

        _imageView  = [[UIImageView alloc] initWithFrame: CGRectMake(0 ,-self.frame.size.height/2, 2 * self.frame.size.height, 2 * self.frame.size.height)];

        [_imageView setAnimationDuration:0.4];

        [_imageView setAnimationImages:imageArr];

        [imageArr release];

        [self addSubview:_imageView];

        [_imageView release];

        [_imageView startAnimating];

        

        minValue = 0.0f;

        maxValue = 1.0f;

        currentValue = 0.0f;

        preValue = currentValue;

        

        

    }

    return self;

}


-(void)setCurrentValue:(float)newValue

{

    if (newValue>=self.maxValue)

    {

        currentValue = maxValue;

    }

    else

    {

        currentValue = newValue;

    }

    if (preValue == 0 && currentValue==self.maxValue)

    {

        preValue = currentValue;

        return;

    }

    if (self.isAnimation)

    {

        vx = (currentValue - preValue)/50;

        if (vx < 0)

        {

            vx  = vx * (-1);

        }

        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(runadd) userInfo:nil repeats:YES];

    }

    else

    {

        preValue = currentValue;

        return;

    }

}


-(void)setMaxValue:(float)newValue

{

    if (currentValue>maxValue) {

        currentValue = maxValue;

        

    }else{

        maxValue = newValue;

        [self setNeedsDisplay];

    }

}

-(void)runadd

{

    CGPoint point = self.imageView.center ;

    

    preValue = preValue + vx;

    if (preValue >= currentValue)

    {

        preValue = currentValue;

    }

    [self setNeedsDisplay];

    

    if (preValue == currentValue)

    {

        [self.timer invalidate];

        self.timer = nil;

        if(_delegate&&[_delegate respondsToSelector:@selector(progressEnd)])

        {

            [_delegate progressEnd];

            _delegate = nil;

        }

    }

    

    

    CGFloat percent = (preValue/maxValue) * self.frame.size.width;

    self.imageView.center =CGPointMake(percent,point.y);

}


- (void)dealloc

{

    if (self.timer != nil)

    {

        [self.timer invalidate];

        self.timer = nil;

    }

    

    [super dealloc];

}


- (void)drawRect:(CGRect)rect

{

    // Drawing code

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 1.0);

    CGFloat colors1 [] = {

        27/255.0, 0/255.0, 7/255.0, 1.0,

        129/225.0, 46/255.0, 64/255.0, 1.0

    };

    

    CGFloat colors2 [] = {

        159/255.0, 253/255.0, 255.0, 1.0,

        27/225.0, 128/255.0, 213/255.0, 1.0,

        41/225.0, 216/255.0, 255/255.0, 1.0

    };

    

    

    CGFloat colors3 [] =

    {

        132/255.0, 190/255.0, 13/255.0, 1.0,

        37/225.0, 71/255.0, 8/255.0, 1.0,

        44/225.0, 138/255.0, 12/255.0, 1.0

    };

    

    CGGradientRef gradient1 = [DrawAndAnimation gradient:context color:colors1];

    [DrawAndAnimation drawRadiusAndGradientRect:rect radius:0 contex:context gradient:gradient1];

    CGGradientRelease(gradient1);

    

    CGFloat percent = (preValue/maxValue) * (rect.size.width-2);

    if (percent >= (rect.size.width-2))

    {

        percent = (rect.size.width-2);

    }

    CGRect progressRect = CGRectMake(rect.origin.x + 1, rect.origin.y + 1,percent, rect.size.height - 2);

    

    if (preValue < maxValue)

    {

        CGGradientRef gradient2 = [DrawAndAnimation gradient3:context color:colors2];

        [DrawAndAnimation drawRadiusAndGradientRectNotDrawHighlight:progressRect radius:0 contex:context gradient:gradient2];

        CGGradientRelease(gradient2);

    }

    else

    {

        CGGradientRef gradient2 = [DrawAndAnimation gradient3:context color:colors3];

        [DrawAndAnimation drawRadiusAndGradientRectNotDrawHighlight:progressRect radius:0 contex:context gradient:gradient2];

        CGGradientRelease(gradient2); 

    } 

}



@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值