关闭

iOS 进度条,可选择环形或者直线,有无动画

标签: ios进度条圆形进度条直线进度条动画
859人阅读 评论(0) 收藏 举报
分类:

自己写的一个环形进度条,可以已圆或者直线的形式展示,有无动画,编写简洁,注释明确,不愿意读码的同学可以直接创建一个类,copy .h .m即可。


.h

#define SELECKED_COLOR [UIColor colorWithRed:2/255.0 green:126/255.0 blue:198/255.0 alpha:1]


#import <UIKit/UIKit.h>


@interface WYSegmentControl : UIControl


// UIControl 继承与UIView 

@property(nonatomic,assign) NSInteger selectedIndex;



-(id)initWithItems:(NSArray*)items WithNormalImage:(UIImage*)normalImage WithSelectImage:(UIImage*)selectImage WithFrame:(CGRect)rect hideScrollImg:(BOOL)isHide;


-(void)setSegmentHeight:(CGFloat)height;


-(void)SetSelectedSegmentIndex:(NSInteger)index;


/**

 *  设置按钮title

 *

 *  @param title title

 *  @param index 索引

 */

- (void)setSelectedSegmentTitle:(NSString *)title Index:(NSInteger)index;



@end


.m

#import "WYSegmentControl.h"


@interface WYSegmentControl()

{

    UIView *_v_scroll; // 滚动视图

    CGFloat _width_scroll; // 滚动视图宽度

    CGFloat _height_scroll;

    UIScrollView *_bgScrollView; // 背景滑动视图

    NSMutableArray *_arr_items; // 按钮

    

    UIImage *_normalImage;

    UIImage *_selectImage;

    CGFloat _btnWidth; // 按钮宽度

    BOOL _isHideScrollView; // 是否隐藏滑动条

    

}

@property(nonatomic,assign) CGFloat segheight;


@end


@implementation WYSegmentControl



-(id)initWithItems:(NSArray*)items WithNormalImage:(UIImage*)normalImage WithSelectImage:(UIImage*)selectImage WithFrame:(CGRect)rect hideScrollImg:(BOOL)isHide{

    

    if (self = [super initWithFrame:rect]) {

        

        

        _isHideScrollView = isHide;

        

        _normalImage = normalImage;

        _selectImage = selectImage;

        _btnWidth = self.frame.size.width / 4;

        

        if (items.count <= 3) {

            

            _btnWidth = rect.size.width / items.count;

        }

        

        // 按钮items

        [self setItems:items];

    }

    

    return self;

}

- (void)setSelectedSegmentTitle:(NSString *)title Index:(NSInteger)index

{

    for (UIButton* btn in _arr_items) {

        

        if (btn.tag == index){

            [btn setTitle:title forState:UIControlStateNormal];

        }

    }

}

- (void)setItems:(NSArray *)array

{

    for (UIView *subView in [self subviews]) {

        

        [subView removeFromSuperview];

    }

    

    NSInteger count = [array count];

    CGFloat width_singe = _btnWidth;

    CGFloat height = 40.0f;

    

    // 背景scrollView

    _bgScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width , 40)];

    _bgScrollView.showsHorizontalScrollIndicator = NO;

    _bgScrollView.contentSize = CGSizeMake(count * width_singe, 40);

    [self addSubview:_bgScrollView];

    

    _arr_items = [NSMutableArray array];

    [_arr_items removeAllObjects];

    for ( int i = 0; i< count; i++) {

        

        UIButton* btn = [[UIButton alloc] initWithFrame:CGRectMake(width_singe * i, 0, width_singe, height)];

        btn.tag = i;

        [btn setBackgroundImage:_normalImage forState:UIControlStateNormal];

        [btn setBackgroundImage:_selectImage forState:UIControlStateHighlighted];

        [btn setBackgroundImage:_selectImage forState:UIControlStateSelected];

        btn.titleLabel.font = [UIFont systemFontOfSize:14];

        [btn setTitle:[array objectAtIndex:i] forState:UIControlStateNormal];

        [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];

        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted];

        [btn setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];

        [btn addTarget:self action:@selector(changeShow:) forControlEvents:UIControlEventTouchUpInside];

        [_bgScrollView addSubview:btn];

        [_arr_items addObject:btn];

    }

    _width_scroll = width_singe;

    


  

    if (!_isHideScrollView) {

        

        // 滑动条

        CGFloat v_height = 2;

        _height_scroll = v_height;

        _v_scroll = [[UIView alloc] initWithFrame:CGRectMake(0, 40 - v_height, width_singe, v_height)];

        [_bgScrollView addSubview:_v_scroll];

        UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width_singe, v_height)];

            

            line.backgroundColor = [UIColor redColor];

        [_v_scroll addSubview:line];

    } else {

        

        // 竖线

        NSInteger num = _arr_items.count;

        for ( int i = 0 ; i< num - 1; i++) {

            UILabel * lab_line = [[UILabel alloc] initWithFrame:CGRectMake(self.frame.size.width/num + (self.frame.size.width/num)*i,0,0.5,40)];

            lab_line.backgroundColor = [UIColor lightGrayColor];

            [self addSubview:lab_line];

        }

    

    }

    // 横线

    UILabel * lab_line = [[UILabel alloc] initWithFrame:CGRectMake(0,39.5,self.frame.size.width,0.5)];

    lab_line.backgroundColor = [UIColor lightGrayColor];

    [self addSubview:lab_line];

    [self bringSubviewToFront:lab_line];

    

}

// 重新设置每一个控件的高度

-(void)setSegmentHeight:(CGFloat)height{

    

    CGFloat width_singe = _btnWidth;

    for (UIButton* btn in _arr_items) {

        NSInteger tag = btn.tag;

        btn.frame = CGRectMake(width_singe*tag,0, width_singe, height);

    }

}


// 设置某一个被选中

-(void)SetSelectedSegmentIndex:(NSInteger)index{

    

    for (UIButton* btn in _arr_items) {

        

        if (btn.tag == index){

            btn.selected = YES;

            _selectedIndex = index;

            

        }else{

            btn.selected = NO;

        }

    }

}

// 被点击时 

-(void)changeShow:(id)sender{

    

    UIButton* btn = sender;

    _selectedIndex = btn.tag;

        

    if (btn) {

        [self startAnimation:btn animated:NO];

    }

    

    for (UIButton* btn in _arr_items) {

        btn.selected = NO;

    }

    

    btn.selected = YES;

    

    [self sendActionsForControlEvents:UIControlEventValueChanged];

}



- (void)startAnimation:(UIButton *)btn animated:(BOOL)animated

{

    if (animated) {

        

        __weak UIButton *weakBtn = btn;

        __weak UIView *weakSview = _v_scroll;

        [UIView animateWithDuration:0.2 animations:^{

            weakBtn.transform = CGAffineTransformMakeScale(0.5, 0.5);

            [weakSview setFrame:CGRectMake(_selectedIndex * _width_scroll, 40 - _height_scroll, _width_scroll, _height_scroll)];

            

        } completion:^(BOOL finished) {

            

            [UIView animateWithDuration:0.25 animations:^{

                

                weakBtn.transform = CGAffineTransformMakeScale(1.2, 1.2);

                

            } completion:^(BOOL finished) {

                

                weakBtn.transform = CGAffineTransformMakeScale(1, 1);

            }];

        }];

    } else {

        

        [_v_scroll setFrame:CGRectMake(_selectedIndex * _width_scroll, 40 - _height_scroll, _width_scroll, _height_scroll)];

        

    }

}

@end

编写仓促,有问题的地方可以留言,望共同进度



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1701次
    • 积分:39
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档