iOS 进度条,可选择环形或者直线,有无动画
2015-07-10 17:36
585 查看
自己写的一个环形进度条,可以已圆或者直线的形式展示,有无动画,编写简洁,注释明确,不愿意读码的同学可以直接创建一个类,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
编写仓促,有问题的地方可以留言,望共同进度
.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
编写仓促,有问题的地方可以留言,望共同进度
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Gifski:一个跨平台的高质量 GIF 编码器
- 模仿动画的放大缩小容器
- php判断GIF图片是否为动画的方法
- PHP设置进度条的方法
- 浅析JavaScript动画
- js排序动画模拟-插入排序
- javascript实现简单的进度条
- js插件YprogressBar实现漂亮的进度条效果
- jquery插件NProgress.js制作网页加载进度条
- 分享8款优秀的 jQuery 加载动画和进度条插件
- jQuery动画特效实例教程
- JQuery动画和停止动画实例代码
- JQuery动画与特效实例分析