在Autolayout下遇到了這樣的情況俊抵,比如cell上面有兩個(gè)label谁不,其中一個(gè)label的內(nèi)容長(zhǎng)度都可能會(huì)很長(zhǎng),長(zhǎng)到按設(shè)計(jì)字號(hào)這一行都裝不下(不過不會(huì)超級(jí)的長(zhǎng))徽诲,而另一個(gè)label的內(nèi)容會(huì)很短刹帕。需求規(guī)定兩個(gè)label上的text都不能有省略。VFL就像下面這樣:
@“|-20-[labelA]-0-[labelB]-20-|”
這時(shí)就需要對(duì)labelA做一個(gè)可以自適應(yīng)字號(hào)的處理谎替,即當(dāng)text長(zhǎng)度超過labelA的可被拉抻的最大程度自動(dòng)縮小其字號(hào)直到其可以被完整顯示偷溺。
首先想到的就是這個(gè):
label.adjustsFontSizeToFitWidth = YES;
label.minimumScaleFactor=0.5;
但是問題出現(xiàn)了,ab兩個(gè)label長(zhǎng)度其實(shí)都不固定钱贯,系統(tǒng)無法得知當(dāng)兩個(gè)label內(nèi)容加起來過長(zhǎng)的時(shí)候取哪個(gè)舍哪個(gè)挫掏,所以這條思路就斷了。
于是采用了一條新思路秩命。由于labelB不會(huì)太長(zhǎng)(length最大5)尉共,所以不對(duì)其進(jìn)行處理,讓其在任何情況下都以原字號(hào)顯示完全弃锐。而labelA袄友,我們就要計(jì)算出能留給他的最大長(zhǎng)度,然后再計(jì)算labelA的text按原字號(hào)應(yīng)有的長(zhǎng)度霹菊。如果這個(gè)長(zhǎng)度大于最大長(zhǎng)度則用最大長(zhǎng)度除以text的length再除以字寬比杠河。
字寬比是什么呢?是我的一個(gè)土方法浇辜,就是指字符寬度和字號(hào)的比。為單個(gè)字的寬度除以字號(hào)唾戚。
按這個(gè)思路我們就可以得到下面的代碼:
- (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)是留給國(guó)家名字的最大寬度
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叹坦,實(shí)現(xiàn)的還算達(dá)標(biāo)熊镣。作者知道這個(gè)方法是不標(biāo)準(zhǔn)的,尤其是這個(gè)字寬比的的設(shè)定是不準(zhǔn)確的做法。如果各位有更好的方法還望不吝賜教绪囱。