在Autolayout下遇到了这样的状况,好比cell上面有两个label,其中一个label的内容长度均可能会很长,长到按设计字号这一行都装不下(不过不会超级的长),而另外一个label的内容会很短。需求规定两个label上的text都不能有省略。VFL就像下面这样:设计
@“|-20-[labelA]-0-[labelB]-20-|”
这时就须要对labelA作一个能够自适应字号的处理,即当text长度超过labelA的可被拉抻的最大程度自动缩小其字号直到其能够被完整显示。code
首先想到的就是这个:it
label.adjustsFontSizeToFitWidth = YES; label.minimumScaleFactor=0.5;
可是问题出现了,ab两个label长度其实都不固定,系统没法得知当两个label内容加起来过长的时候取哪一个舍哪一个,因此这条思路就断了。class
因而采用了一条新思路。因为labelB不会太长(length最大5),因此不对其进行处理,让其在任何状况下都以原字号显示彻底。而labelA,咱们就要计算出能留给他的最大长度,而后再计算labelA的text按原字号应有的长度。若是这个长度大于最大长度则用最大长度除以text的length再除以字宽比。autolayout
字宽比是什么呢?是个人一个土方法,就是指字符宽度和字号的比。为单个字的宽度除以字号。float
按这个思路咱们就能够获得下面的代码:自适应
- (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,实现的还算达标。做者知道这个方法是不标准的,尤为是这个字宽比的的设定是不许确的作法。若是各位有更好的方法还望不吝赐教。im