今天遇到一個(gè)奇葩問題,一個(gè)多行顯示的Lable,其中設(shè)置了Lable字體顏色有差異的富文本莉掂。
但是出現(xiàn)了一個(gè)奇怪的問題朴摊,就是當(dāng)文本全是英文的顯示正常默垄,但是有中英文混合字符串的時(shí)候,這個(gè)Lable甚纲,中間就會(huì)莫名其妙的換行展示口锭。
最會(huì)查資料發(fā)現(xiàn)了Lable一個(gè)lineBreakMode屬性,
在使用富文本時(shí)應(yīng)注意中英混合的情況,會(huì)使你的換行操作出現(xiàn)問題介杆,因?yàn)楹芏嗑幾g器默認(rèn)會(huì)計(jì)算當(dāng)“中文”+“英文”后如果寬度大于設(shè)定的控件寬度時(shí)讹弯,會(huì)將中文后的英文直接換到第二行顯示(即lineBreakMode的默認(rèn)屬性為NSLineBreakByWordWrapping),在Xcode中的控制臺(tái)打印和coding的時(shí)候都會(huì)出現(xiàn)這個(gè)情況这溅。
label.lineBreakMode = NSLineBreakByCharWrapping;以字符為顯示單位顯示组民,后面部分省略不顯示。
label.lineBreakMode = NSLineBreakByClipping;剪切與文本寬度相同的內(nèi)容長度悲靴,后半部分被刪除臭胜。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字以……方式省略莫其,顯示尾部文字內(nèi)容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中間的內(nèi)容以……方式省略耸三,顯示頭尾的文字內(nèi)容乱陡。
label.lineBreakMode = NSLineBreakByTruncatingTail;結(jié)尾部分的內(nèi)容以……方式省略,顯示頭的文字內(nèi)容仪壮。
label.lineBreakMode = NSLineBreakByWordWrapping;以單詞為顯示單位顯示憨颠,后面部分省略不顯示。
解決方法:
設(shè)置label.lineBreakMode = NSLineBreakByCharWrapping;
如果此時(shí)你是即進(jìn)行了富文本設(shè)定又對(duì)換行進(jìn)行設(shè)定的話积锅,記住先把換行操作的代碼放到label.attributedText = .......代碼之后爽彤,不然label.lineBreakMode = NSLineBreakByCharWrapping會(huì)失效。
設(shè)置之后顯示正常了缚陷,但是計(jì)算這個(gè)文本高度的時(shí)候适篙,計(jì)算的高度不準(zhǔn)確了。
切記:計(jì)算高度的時(shí)候箫爷,段落樣式加上這個(gè)屬性嚷节,就可以計(jì)算高度
paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
-----------------附上高度寬度計(jì)算方法---------------
計(jì)算高度
+ (CGFloat)getTheStringHeight:(NSString *)string setFont:(CGFloat)font withWidth:(CGFloat)width
{
if (string == nil || [string isEqualToString:@""])
{
return 0;
}
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:string];
//段落
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
// [paragraphStyle setLineSpacing:pageWidth];
// paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
NSRange range = NSMakeRange(0, attrStr.length);
[attrStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range];
//設(shè)置字體
[attrStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:font]
range:range];
NSDictionary *dic = [attrStr attributesAtIndex:0 effectiveRange:&range]; // 獲取該段
CGSize textSize = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT) // 用于計(jì)算文本繪制時(shí)占據(jù)的矩形塊</span>
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本繪制時(shí)的附加選項(xiàng)
attributes:dic // 文字的屬性
context:nil].size; // context上下文。包括一些信息虎锚,例如如何調(diào)整字間距以及縮放硫痰。該對(duì)象包含的信息將用于文本繪制。該參數(shù)可為nil
return textSize.height;
}
計(jì)算寬度
+ (CGFloat)getTheStringWidth:(NSString *)string setFont:(CGFloat)font withHeight:(CGFloat)height
{
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:string];
NSRange range = NSMakeRange(0, attrStr.length);
//設(shè)置字體
[attrStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:font]
range:range];
NSDictionary *dic = [attrStr attributesAtIndex:0 effectiveRange:&range]; // 獲取該段attributedString
CGSize textSize = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, height) // 用于計(jì)算文本繪制時(shí)占據(jù)的矩形塊
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本繪制時(shí)的附加選項(xiàng)
attributes:dic // 文字的屬性
context:nil].size; // context上下文窜护。包括一些信息效斑,例如如何調(diào)整字間距以及縮放。該對(duì)象包含的信息將用于文本繪制柄慰。該參數(shù)可為nil
return textSize.width;
}