热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

iOS使用UIBezierPath实现ProgressView

这篇文章主要为大家详细介绍了iOS使用UIBezierPath实现ProgressView,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

使用UIBezierPath实现ProgressView实现的效果如下:

界面采用UITableView和TabelViewCell的实现,红色的视图采用UIBezierPath绘制.注意红色的部分左上角,左下角是直角哟!!!!不多说<这里才是用UIBezierPath实现的真正愿意啦!!!&#128518;>,代码如下:

控制器代码:

//
// ViewController.m
// ProgressViewDemo
//
// Created by 思 彭 on 2017/4/20.
// Copyright © 2017年 思 彭. All rights reserved.
//

#import "ViewController.h"
#import "ProgressTableViewCell.h"

@interface ViewController ()

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) CAShapeLayer *layer;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.navigationItem.title = @"ProgressDemo";
  [self setUI];
}

#pragma mark - 设置界面

- (void)setUI {
  
  self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStyleGrouped];
  self.tableView.delegate = self;
  self.tableView.dataSource = self;
  self.tableView.backgroundColor = [UIColor clearColor];
  // 注册cell
  [self.tableView registerClass:[ProgressTableViewCell class] forCellReuseIdentifier:@"cell"];
  self.tableView.tableFooterView = [[UIView alloc]init];
  [self.view addSubview:self.tableView];
}

#pragma mark - UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  
  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  
  return 5;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  
  ProgressTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
  return cell;
}

#pragma mark - UITableViewDelegate

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
  
  return 0.001f;;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  
  return 0.0001f;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  
  return 44;
}

@end

TabelViewCell代码:

//
// ProgressTableViewCell.m
// ProgressViewDemo
//
// Created by 思 彭 on 2017/4/21.
// Copyright © 2017年 思 彭. All rights reserved.
//

#import "ProgressTableViewCell.h"
#import "Masonry.h"
#import "ProgressView.h"

@interface ProgressTableViewCell ()

@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) ProgressView *progressView;
@property (nonatomic, strong) UILabel *numberLabel;

@end

@implementation ProgressTableViewCell

- (void)awakeFromNib {
  [super awakeFromNib];
  // Initialization code
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
  
  if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
    [self createSubViews];
    [self layOut];
  }
  return self;
}

- (void)createSubViews {
  
  self.titleLabel = [[UILabel alloc]init];
  self.titleLabel.fOnt= [UIFont systemFontOfSize:16];
  self.titleLabel.text = @"西单大悦城";
  self.titleLabel.textAlignment = NSTextAlignmentLeft;
  [self.contentView addSubview:self.titleLabel];
  self.progressView = [[ProgressView alloc]init];
  self.progressView.backgroundColor = [UIColor whiteColor];
  self.progressView.progress = arc4random_uniform(100) + 40;
  [self.contentView addSubview:self.progressView];
  self.numberLabel = [[UILabel alloc]init];
  self.numberLabel.fOnt= [UIFont systemFontOfSize:16];
  self.numberLabel.text = @"¥2000";
  self.numberLabel.textAlignment = NSTextAlignmentRight;
  [self.contentView addSubview:self.numberLabel];
}

- (void)layOut {
  
  [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(self.contentView).offset(10);
    make.centerY.mas_equalTo(self.contentView);
//    make.width.greaterThanOrEqualTo(@(70));
    make.width.mas_equalTo(self.contentView.frame.size.width * 0.3);
  }];
  [self.progressView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(self.titleLabel.mas_right).offset(10);
    make.height.mas_equalTo(20);
    make.centerY.mas_equalTo(self.titleLabel.mas_centerY);
    make.width.mas_equalTo(self.contentView.frame.size.width * 0.4);
  }];
  [self.numberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.mas_equalTo(self.progressView.mas_right).offset(10);
    make.centerY.mas_equalTo(self.contentView);
    make.right.mas_equalTo(self.contentView).offset(-10);
  }];
}

@end

ProgressView代码:

//
// ProgressView.m
// ProgressViewDemo
//
// Created by 思 彭 on 2017/4/20.
// Copyright © 2017年 思 彭. All rights reserved.
//

#import "ProgressView.h"

@interface ProgressView ()

@end

@implementation ProgressView


-(void)drawRect:(CGRect)rect{
  
  // 创建贝瑟尔路径
  
  /*
  CGFloat width = self.progress / rect.size.width * rect.size.width;
  // 显示的宽度 = 服务器返回的数值 / 设置的总宽度 * 满值;
   
   显示的宽度= 满值 * 比例值
   比例值 = 服务器返回的宽度 / 满值
   */
  
  CGFloat width = rect.size.width * self.progress / rect.size.width;
   // 显示的宽度 = 服务器返回的数值 * 设置的总宽度 / 满值;
  UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, width, rect.size.height) byRoundingCorners:UIRectCornerTopRight|UIRectCornerBottomRight cornerRadii:CGSizeMake(rect.size.height, rect.size.height)];
  [[UIColor redColor] setFill];
  [path fill];
}

- (void)setProgress:(CGFloat)progress{
  
  _progress = progress;
  // 重绘,系统会先创建与view相关联的上下文,然后再调用drawRect
  [self setNeedsDisplay];
}


@end

是不是超级简单。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 在将Web服务器和MySQL服务器分离的情况下,是否需要在Web服务器上安装MySQL?如果安装了MySQL,如何解决PHP连接MySQL服务器时出现的连接失败问题? ... [详细]
  • 大势至服务器文件备份系统是一款专为服务器数据保护设计的安全软件,能够实现自动化的全量备份和增量备份,支持多种备份目标,如服务器其他分区、外接硬盘、其他服务器或NAS存储空间,并提供灵活的备份频率设置,有效保障服务器文件的安全。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • 本文详细介绍了MySQL数据库服务器(mysqld)和客户端(mysql)的区别,并提供了多种启动和关闭MySQL服务器的方法。通过这些方法,您可以更好地管理和维护MySQL数据库。 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • Linux下MySQL 8.0.28安装指南
    本文详细介绍了在Linux系统上安装MySQL 8.0.28的步骤,包括下载数据库、解压数据包、安装必要组件和启动MySQL服务。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • 本文介绍了 Linux 系统中用于定期执行任务的 cron 服务及其配置方法。通过 crond 和 crontab 命令,用户可以轻松地安排系统和用户级别的周期性任务。 ... [详细]
  • ZooKeeper 入门指南
    本文将详细介绍ZooKeeper的工作机制、特点、数据结构以及常见的应用场景,包括统一命名服务、统一配置管理、统一集群管理、服务器动态上下线和软负载均衡。 ... [详细]
author-avatar
甜蜜棉羽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有