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

原创 2015年07月10日 17:36:50

自己写的一个环形进度条,可以已圆或者直线的形式展示,有无动画,编写简洁,注释明确,不愿意读码的同学可以直接创建一个类,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

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



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS 自定义控件 progressView(环形进度条)

之前做项目的时候有用到环形进度条,先是在网上找了一下第三方控件,发现好用是好用,就是东西太多了,有点复杂,还不如自己写一个简单点适合自己用的。 先把自定义控件的效果图贴出来。       ...

iOS开发中的基于CAShapeLayer和贝塞尔曲线的圆形进度条动画

先简单的介绍下CAShapeLayer 1,CAShapeLayer继承自CALayer,可使用CALayer的所有属性 2,CAShapeLayer需要和贝塞尔曲线配合使用才有意义。 Shap...

iOS实现一个颜色渐变的弧形进度条

转自:https://www.ganlvji.com/gradient_circle_progress/ 1、先来一个结果 80%的状态: 99%的状态: 2、...

iOS-swift环形进度指示器+图片加载动画

demo.gif 如图,这个动画的是如何做的呢? 分析: 1.环形进度指示器,根据下载进度来更新它2.扩展环,向内向外扩展这个环,中间扩展的时候,去掉这个遮盖 一.环形进度指示器 1...

圆形进度条定制

// // HYBCircleProgressBar.h // CircleBarProject // // Created by huangyibiao on 14-8-16. // Cop...

iOS封装圆形进度条控件

简单封装一个圆形进度条的控件,实现原理: 容器是一个UIView,上面放三层CALayer,未填充的圆形条和进度条都为CAShapeLayer,里面有个属性为path,可以用UIBezierPath...

IOS_环形的进度条(平角和圆角两种类型 )

本帖来自本群【深圳_流云】,感谢分享。需要的攻城师尽管拿去! 为了感谢原作者,附上作者的Email:757279387@qq.com 【不小心暴露了QQ】 废话不多说,上源代码 /* 环形的进度...

有渐变色的进度圆环(带有百分比)

效果如下: 直接创建 同类名,全选—复制—粘贴 就能完成 文件全代码都有 封装一个view 直接使用 使用例子: 即为效果图 ZPCAshapelGradientView *...

iOS 通过UIBezierPath和CAShapeLayer绘制圆形进度条

不需要重写drawRect方法绘制圆形进度条,希望对大家有帮助 //创建显示进度label _progressLabel = [[UILabel alloc]initWithFrame:...

iOS通过CAShapeLayer和UIBezierPath画环形进度条

UIBezierPath可以绘制矢量路径,而CAShapeLayer是Layer的子类,可以在屏幕进行绘制,本文主要思想是:CAShapeLayer按照UIBezierPath的矢量路径进行绘制。 效...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)