iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现

时间:2022-09-18 19:51:49

最近同样是新App,设计稿里出现一种圆形进度条的设计,如下:

iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现

想了想,圆形进度条实现起来不难,但是其中显示百分比的文本确需要自适应,虽然可以使用时自己设定文本字体的大小,但是这样显得很麻烦,也很low。

查了一圈,目前实现的自适应UILabel,都是根据font大小动态调整frame的size,并不能满足我们的需求。

 那么问题来了

如何实现一种能够根据frame大小自适应调整文本font size的圆形进度条呢?

我的实现思路很简单,首先计算出能够给予UILabel的frame最大尺寸,然后根据高度优先,宽度次之的原则,计算出最合适的字体大小,这样可以完美的适配各种尺寸。

效果如下:

iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现

实现代码:

CircleProgressBar继承于UIView,具有四个属性,分别如下:

//
// CircleProgressBar.h
// demo
//
// Created by ZhangChangwei on 15/4/1.
// Copyright (c) 2015年 Changwei. All rights reserved.
// #import <UIKit/UIKit.h> @interface CircleProgressBar : UIView
//进度条百分比值
@property (nonatomic) float percentValue;
//进度条宽度
@property (nonatomic) float lineWidth;
//文本颜色
@property (nonatomic ) UIColor *textColor;
//进度条颜色
@property (nonatomic ) UIColor *barColor;
@end

实现方式主要采用CoreGraphics绘制图形,其中文字绘制采用自适应计算大小的方式实现,实现了根据控件frame大小动态改变字体的行为,非常灵活。

//
// CircleProgressBar.m
// demo
//
// Created by ZhangChangwei on 15/4/1.
// Copyright (c) 2015年 Changwei. All rights reserved.
// #import "CircleProgressBar.h" @implementation CircleProgressBar /**
* init and set up property
*
* @param frame <#frame description#>
*
* @return <#return value description#>
*/
-(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self) { }
return self;
} /**
* redraw
*
* @param rect frame
*/
- (void)drawRect:(CGRect)rect {
if(_lineWidth==0.0f){
_percentValue=;
NSLog(@"%@",@"请输入颜色,数值等参数");
}
//开始绘制图形
CGContextRef ctx=UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx, _lineWidth);
CGContextBeginPath(ctx);
CGContextSetStrokeColorWithColor(ctx, _barColor==nil?[UIColor orangeColor].CGColor:_barColor.CGColor);
CGContextAddArc(ctx, self.frame.size.width/, self.frame.size.width/, self.frame.size.width/-_lineWidth, M_PI*1.5, M_PI*(1.5-*_percentValue), );
CGContextStrokePath(ctx);
//绘制计算最佳文本大小
CGSize maxSize=CGSizeMake(rect.size.width*0.75, rect.size.height/);
int currentFontSize=;
NSString *str=[NSString stringWithFormat:@"%.1f%%",_percentValue*];
CGSize requiredSize = [str boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize]} context:nil].size;
if(requiredSize.height<=maxSize.height)
{
while (requiredSize.height<=maxSize.height&&requiredSize.width<maxSize.width) {
currentFontSize++;
requiredSize=[str boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize]} context:nil].size;
}
}else
{
while (requiredSize.height>maxSize.height||requiredSize.width>maxSize.width) {
currentFontSize--;
requiredSize=[str boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize]} context:nil].size;
}
requiredSize=[str boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize]} context:nil].size;
}
//绘制自适应文本
[str drawAtPoint:CGPointMake(rect.size.width/-requiredSize.width/, rect.size.height/-requiredSize.height/)
withAttributes:@{
NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize],
NSForegroundColorAttributeName:_textColor==nil?[UIColor blackColor]:_textColor
}]; } @end

使用方法:

CircleProgressBar使用起来非常简单,只需要提供相应参数即可,如下:

- (void)viewDidLoad {
[super viewDidLoad]; CircleProgressBar *bar1=[[CircleProgressBar alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/-, SCREEN_HEIGHT*0.2, , )];
bar1.barColor=[UIColor redColor];
bar1.lineWidth=1.0f;
bar1.percentValue=0.85;
bar1.backgroundColor=[UIColor clearColor];
[self.view addSubview:bar1]; CircleProgressBar *bar2=[[CircleProgressBar alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/-, SCREEN_HEIGHT*0.3, , )];
bar2.barColor=[UIColor orangeColor];
bar2.lineWidth=;
bar2.percentValue=0.45;
bar2.backgroundColor=[UIColor clearColor];
[self.view addSubview:bar2];
CircleProgressBar *bar3=[[CircleProgressBar alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/-, SCREEN_HEIGHT*0.5, , )];
bar3.barColor=[UIColor greenColor];
bar3.lineWidth=;
bar3.textColor=[UIColor blueColor];
bar3.percentValue=0.75;
bar3.backgroundColor=[UIColor clearColor];
[self.view addSubview:bar3];
CircleProgressBar *bar4=[[CircleProgressBar alloc] initWithFrame:CGRectMake(SCREEN_WIDTH/-, SCREEN_HEIGHT*0.7, , )];
bar4.barColor=[UIColor blueColor];
bar4.textColor=[UIColor purpleColor];
bar4.lineWidth=;
bar4.percentValue=0.55;
bar4.backgroundColor=[UIColor clearColor];
[self.view addSubview:bar4];
}

完成了圆形进度条的实现后,想了想,其实可以加入动画,使得进度条动态展现,下次有时间再实现

iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现的更多相关文章

  1. &lbrack;转载&rsqb;ExtJs4 笔记(8) Ext&period;slider 滚轴控件、 Ext&period;ProgressBar 进度条控件、 Ext&period;Editor 编辑控件

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  2. ExtJs4 笔记(8) Ext&period;slider 滚轴控件、 Ext&period;ProgressBar 进度条控件、 Ext&period;Editor 编辑控件

    本篇要登场的有三个控件,分别是滚轴控件.进度条控件和编辑控件. 一.滚轴控件 Ext.slider 1.滚轴控件的定义 下面我们定义三个具有代表意义滚轴控件,分别展示滚轴横向.纵向,以及单值.多值选择 ...

  3. iOS&colon;进度条控件的详细使用

    进度条控件:UIProcessView:UIView   功能:顾名思义,用来显示下载进度或者传输数据进度.   属性: @property(nonatomic) UIProgressViewStyl ...

  4. iOS项目开发实战——自己定义圆形进度提示控件

    iOS中默认的进度条是水平方向的进度条,这往往不能满足我们的需求. 可是我们能够自己定义类似的圆形的进度提示控件,主要使用iOS中的画图机制来实现. 这里我们要实现一个通过button点击然后圆形进度 ...

  5. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  6. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  7. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  8. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  9. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

随机推荐

  1. 初学者在ubuntu下安装使用git(上)

      一 git的安装测试 在Ubuntu系统下的bash中输入git,如果提示没有安装的话,用命令 sudo apt-get install git 安装git,安装完成之后通过 git –versi ...

  2. VS XML注释

    1.<c> <c>text</c> 其中: text 希望将其指示为代码的文本. 备注 <c> 标记为您提供了一种将说明中的文本标记为代码的方法.使用 ...

  3. js作用域学习

    代码解析至少分两步 1):查找var,function参数例如下面这个例子 a= 未定义 fn1={alert(2)}函数的话,是整个整体 2):逐行读代码:类似=+-%*等都是表达式,表达式可以改变 ...

  4. 安卓Json介绍(转)。

    1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式, ...

  5. RHEL7和RHEL6的主要变化

    RHEL7和RHEL6的主要变化   RHEL7 RHEL6 文件系统 XFS EXT4 内核版本 3.10.x-x系列 2.6.x-x系列 内核名称 Maipo Santiago 发布时间 2014 ...

  6. Windows 7下 搭建 基于 ssh 的sftp 服务器

    Windows  xp 下 搭建 基于  ssh 的sftp 服务器,服务器端可以用 freesshd,F-secure server等,filezilla server不可用,之前傻乎乎的用file ...

  7. 苹果ATS特性服务器证书配置指南

    配置指南: 需要配置符合PFS规范的加密套餐,目前推荐配置: ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!AD ...

  8. MVVM之旅(1)创建一个最简单的MVVM程序

    这是MVVM之旅系列文章的第一篇,许多文章和书喜欢在开篇介绍某种技术的诞生背景和意义,但是我觉得对于程序员来说,一个能直接运行起来的程序或许能够更直观的让他们了解这种技术.在这篇文章里,我将带领大家一 ...

  9. Actifio快照池(snapshot pool)空间占用说明

    快照池是什么? 快照池是根据定义的SLA(Service Level Agreement)来保存应用数据各时间点的黄金副本空间. 快照池空间的消耗 快照池空间由三种不同类型的虚拟磁盘使用: Stagi ...

  10. solaris下安装oracle 11g与11g rac

    1.To Find Swap, RAM, and OS Version 对于 Solaris 操作系统,查看 Swap, RAM, and OS Version 的方法: swap -l /usr/s ...