iOS富文本設(shè)置混合字符串(中英文)奇葩換行問題

今天遇到一個奇葩問題,一個多行顯示的Lable,其中設(shè)置了Lable字體顏色有差異的富文本。
但是出現(xiàn)了一個奇怪的問題,就是當(dāng)文本全是英文的顯示正常,但是有中英文混合字符串的時候,這個Lable,中間就會莫名其妙的換行展示。

最會查資料發(fā)現(xiàn)了Lable一個lineBreakMode屬性,
在使用富文本時應(yīng)注意中英混合的情況,會使你的換行操作出現(xiàn)問題,因?yàn)楹芏嗑幾g器默認(rèn)會計(jì)算當(dāng)“中文”+“英文”后如果寬度大于設(shè)定的控件寬度時,會將中文后的英文直接換到第二行顯示(即lineBreakMode的默認(rèn)屬性為NSLineBreakByWordWrapping),在Xcode中的控制臺打印和coding的時候都會出現(xiàn)這個情況。

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;

如果此時你是即進(jìn)行了富文本設(shè)定又對換行進(jìn)行設(shè)定的話,記住先把換行操作的代碼放到label.attributedText = .......代碼之后,不然label.lineBreakMode = NSLineBreakByCharWrapping會失效。
設(shè)置之后顯示正常了,但是計(jì)算這個文本高度的時候,計(jì)算的高度不準(zhǔn)確了。

切記:計(jì)算高度的時候,段落樣式加上這個屬性,就可以計(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ì)算文本繪制時占據(jù)的矩形塊</span>
                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本繪制時的附加選項(xiàng)
                                        attributes:dic        // 文字的屬性
                                           context:nil].size; // context上下文。包括一些信息,例如如何調(diào)整字間距以及縮放。該對象包含的信息將用于文本繪制。該參數(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ì)算文本繪制時占據(jù)的矩形塊
                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本繪制時的附加選項(xiàng)
                                        attributes:dic        // 文字的屬性
                                           context:nil].size; // context上下文。包括一些信息,例如如何調(diào)整字間距以及縮放。該對象包含的信息將用于文本繪制。該參數(shù)可為nil
    
    return textSize.width;
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容