android和ios开发进度条,iOS实现步骤进度条功能实例代码

本文介绍了如何在iOS中利用UIProgressView、UIView和UILabel实现一个步骤进度条效果。通过创建一个名为HQLStepView的自定义视图类,实现了进度条、圆点索引和文字提示的功能,并提供了设置当前步骤的方法。源码详细展示了各个组件的布局和颜色设置,以及如何根据步骤索引更新界面。

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

前言

在开发中,我们经常在很多场景下需要用到进度条,比如文件的下载,或者文件的上传等。 本文主要给大家介绍的是一个步骤进度条效果,步骤进度条效果参考

7eaaa2f85faad5d74c004a89fd1c7ab4.png

iOS UIKit 框架中并没有提供类似的控件,我们可以使用 UIProgressView、UIView、UILabel 组合实现步骤进度条效果。

UIProgressView——实现水平的进度条效果;

UIView——把UIView裁剪成圆形,实现索引节点效果;

UILabel——每个节点下面的提示文字。

源码

将步骤进度条封装成一个 HQLStepView 类,它是 UIView 的子类。

HQLStepView.h 文件

#import

@interface HQLStepView : UIView

// 指定初始化方法

- (instancetype)initWithFrame:(CGRect)frame titlesArray:(NSArray *)titlesArray stepIndex:(NSUInteger)stepIndex;

// 设置当前步骤

- (void)setStepIndex:(NSUInteger)stepIndex animation:(BOOL)animation;

@end

HQLStepView.m 文件

#import "HQLStepView.h"

// 步骤条主题色

#define TINT_COLOR [UIColor colorWithRed:35/255.f green:135/255.f blue:255/255.f alpha:1]

@interface HQLStepView ()

@property (nonatomic, copy) NSArray *titlesArray;

@property (nonatomic, assign) NSUInteger stepIndex;

@property (nonatomic, strong) UIProgressView *progressView;

@property (nonatomic, strong) NSMutableArray *circleViewArray;

@property (nonatomic, strong) NSMutableArray *titleLabelArray;

@property (nonatomic, strong) UILabel *indicatorLabel;

@end

@implementation HQLStepView

#pragma mark - Init

- (instancetype)initWithFrame:(CGRect)frame titlesArray:(NSArray *)titlesArray stepIndex:(NSUInteger)stepIndex {

self = [super initWithFrame:frame];

if (self) {

_titlesArray = [titlesArray copy];

_stepIndex = stepIndex;

// 进度条

[self addSubview:self.progressView];

for (NSString *title in _titlesArray) {

// 圆圈

UIView *circle = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 13, 13)];

circle.backgroundColor = [UIColor lightGrayColor];

circle.layer.cornerRadius = 13.0f / 2;

[self addSubview:circle];

[self.circleViewArray addObject:circle];

// 标题

UILabel *label = [[UILabel alloc] init];

label.text = title;

label.font = [UIFont systemFontOfSize:14];

label.textAlignment = NSTextAlignmentCenter;

[self addSubview:label];

[self.titleLabelArray addObject:label];

}

// 当前索引数字

[self addSubview:self.indicatorLabel];

}

return self;

}

// 布局更新页面元素

- (void)layoutSubviews {

NSInteger perWidth = self.frame.size.width / self.titlesArray.count;

// 进度条

self.progressView.frame = CGRectMake(0, 0, self.frame.size.width - perWidth, 1);

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

CGFloat startX = self.progressView.frame.origin.x;

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

// 圆圈

UIView *cycle = self.circleViewArray[i];

if (cycle) {

cycle.center = CGPointMake(i * perWidth + startX, self.progressView.center.y);

}

// 标题

UILabel *label = self.titleLabelArray[i];

if (label) {

label.frame = CGRectMake(perWidth * i, self.frame.size.height / 2, self.frame.size.width / self.titlesArray.count, self.frame.size.height / 2 );

}

}

self.stepIndex = self.stepIndex;

}

#pragma mark - Custom Accessors

- (UIProgressView *)progressView {

if (!_progressView) {

_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];

_progressView.progressTintColor = TINT_COLOR;

_progressView.progress = self.stepIndex / ((self.titlesArray.count - 1) * 1.0);

}

return _progressView;

}

- (UILabel *)indicatorLabel {

if (!_indicatorLabel) {

_indicatorLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 23, 23)];

_indicatorLabel.textColor = TINT_COLOR;

_indicatorLabel.textAlignment = NSTextAlignmentCenter;

_indicatorLabel.backgroundColor = [UIColor whiteColor];

_indicatorLabel.layer.cornerRadius = 23.0f / 2;

_indicatorLabel.layer.borderColor = [TINT_COLOR CGColor];

_indicatorLabel.layer.borderWidth = 1;

_indicatorLabel.layer.masksToBounds = YES;

}

return _indicatorLabel;

}

- (NSMutableArray *)circleViewArray {

if (!_circleViewArray) {

_circleViewArray = [[NSMutableArray alloc] initWithCapacity:self.titlesArray.count];

}

return _circleViewArray;

}

- (NSMutableArray *)titleLabelArray {

if (!_titleLabelArray) {

_titleLabelArray = [[NSMutableArray alloc] initWithCapacity:self.titlesArray.count];

}

return _titleLabelArray;

}

// 设置当前进度索引,更新圆形图片、文本颜色、当前索引数字

- (void)setStepIndex:(NSUInteger)stepIndex {

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

UIView *cycle = self.circleViewArray[i];

UILabel *label = self.titleLabelArray[i];

if (stepIndex >= i) {

cycle.backgroundColor = TINT_COLOR;

label.textColor = TINT_COLOR;

} else {

cycle.backgroundColor = [UIColor lightGrayColor];

label.textColor = [UIColor lightGrayColor];

}

}

}

#pragma mark - Public

- (void)setStepIndex:(NSUInteger)stepIndex animation:(BOOL)animation {

if (stepIndex < self.titlesArray.count) {

// 更新颜色

self.stepIndex = stepIndex;

// 设置进度条

[self.progressView setProgress:stepIndex / ((self.titlesArray.count - 1) * 1.0) animated:animation];

// 设置当前索引数字

self.indicatorLabel.text = [NSString stringWithFormat:@"%lu", stepIndex + 1];

self.indicatorLabel.center = ((UIView *)[self.circleViewArray objectAtIndex:stepIndex]).center;

}

}

@end

接口调用:

- (void)viewDidLoad {

[super viewDidLoad];

// 初始化

_hqlStepView = [[HQLStepView alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, 60) titlesArray:@[@"第一步", @"第二步", @"第三步"] stepIndex:0];

[self.view addSubview:_hqlStepView];

}

- (void)viewDidAppear:(BOOL)animated {

[super viewDidAppear:animated];

// 设置当前步骤,步骤索引=数组索引

[_hqlStepView setStepIndex:0 animation:YES];

}

效果:

8ca6aa2e84cf3176db818e274bdcdb46.png

因为 UIProgressView 实现的水平进度条高度值默认为1,设置frame是无效的。可以通过仿射变换的方式增加它的高度。

第三方框架

参考:

总结:

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值