博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Autolayout下对字体自适应Label的实现
阅读量:6306 次
发布时间:2019-06-22

本文共 1450 字,大约阅读时间需要 4 分钟。

在Autolayout下遇到了这样的情况,比如cell上面有两个label,其中一个label的内容长度都可能会很长,长到按设计字号这一行都装不下(不过不会超级的长),而另一个label的内容会很短。需求规定两个label上的text都不能有省略。VFL就像下面这样:

@“|-20-[labelA]-0-[labelB]-20-|”

这时就需要对labelA做一个可以自适应字号的处理,即当text长度超过labelA的可被拉抻的最大程度自动缩小其字号直到其可以被完整显示。

首先想到的就是这个:

label.adjustsFontSizeToFitWidth = YES;label.minimumScaleFactor=0.5;

但是问题出现了,ab两个label长度其实都不固定,系统无法得知当两个label内容加起来过长的时候取哪个舍哪个,所以这条思路就断了。

于是采用了一条新思路。由于labelB不会太长(length最大5),所以不对其进行处理,让其在任何情况下都以原字号显示完全。而labelA,我们就要计算出能留给他的最大长度,然后再计算labelA的text按原字号应有的长度。如果这个长度大于最大长度则用最大长度除以text的length再除以字宽比。

字宽比是什么呢?是我的一个土方法,就是指字符宽度和字号的比。为单个字的宽度除以字号。

按这个思路我们就可以得到下面的代码:

- (void)calculateNameLabelWidth{    if (labelA.text.length>0) {        CGSize size=[@"a" sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:16]}];        float constant = size.width / labelA.text.length / 16        //constant为字宽比        //(labelB的x-labelA的x)是留给国家名字的最大宽度        float maxFont = (CGRectGetMinX(_codeLabel.frame) - CGRectGetMinX(_nameLabel.frame)) / self.nameLabel.text.length / constant;        if (maxFont < 16) {            labelA.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:maxFont];        } else {            labelA.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:16.0];        }    }}

autolayout下如何获取控件的frame呢?在layoutIfNeeded里,所以我们要将我们的方法放到下面:

- (void)layoutIfNeeded {    [super layoutIfNeeded];    [self calculateNameLabelWidth];}

ok,实现的还算达标。作者知道这个方法是不标准的,尤其是这个字宽比的的设定是不准确的做法。如果各位有更好的方法还望不吝赐教。

转载地址:http://flixa.baihongyu.com/

你可能感兴趣的文章
轨磁条简介
查看>>
(算法)交错的字符串
查看>>
hdu 5471(状压DP or 容斥)
查看>>
oracle.jdbc.driver.OracleDriver和oracle.jdbc.OracleDriver这两个驱动的区别
查看>>
NSQ部署
查看>>
git常用命令记录
查看>>
IBM发布新一代云计算工具包MobileFirst Foundation
查看>>
唯品会HDFS性能挑战和优化实践
查看>>
大规模学习该如何权衡得失?解读NeurIPS 2018时间检验奖获奖论文
查看>>
大厂前端高频面试问题与答案精选
查看>>
我们用5分钟写了一个跨多端项目
查看>>
Visual Studio 15.4发布,新增多平台支持
查看>>
有赞透明多级缓存解决方案(TMC)设计思路
查看>>
如何设计高扩展的在线网页制作平台
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
Swift 5将强制执行内存独占访问
查看>>
中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>