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

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

最會查資料發(fā)現(xiàn)了Lable一個lineBreakMode屬性,
在使用富文本時應(yīng)注意中英混合的情況濒旦,會使你的換行操作出現(xiàn)問題,因為很多編譯器默認(rèn)會計算當(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è)置之后顯示正常了盒使,但是計算這個文本高度的時候崩掘,計算的高度不準(zhǔn)確了。

切記:計算高度的時候少办,段落樣式加上這個屬性苞慢,就可以計算高度

paraStyle.lineBreakMode = NSLineBreakByCharWrapping;

-----------------附上高度寬度計算方法---------------
計算高度

+ (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ù)的矩形塊</span>
                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本繪制時的附加選項
                                        attributes:dic        // 文字的屬性
                                           context:nil].size; // context上下文。包括一些信息英妓,例如如何調(diào)整字間距以及縮放挽放。該對象包含的信息將用于文本繪制绍赛。該參數(shù)可為nil
    return textSize.height;
}

計算寬度

+ (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ù)的矩形塊
                                           options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading // 文本繪制時的附加選項
                                        attributes:dic        // 文字的屬性
                                           context:nil].size; // context上下文。包括一些信息辑畦,例如如何調(diào)整字間距以及縮放吗蚌。該對象包含的信息將用于文本繪制。該參數(shù)可為nil
    
    return textSize.width;
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纯出,一起剝皮案震驚了整個濱河市蚯妇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暂筝,老刑警劉巖箩言,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焕襟,居然都是意外死亡陨收,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門胧洒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏吓,“玉大人,你說我怎么就攤上這事卫漫》票” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵列赎,是天一觀的道長宏悦。 經(jīng)常有香客問我,道長包吝,這世上最難降的妖魔是什么饼煞? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮诗越,結(jié)果婚禮上砖瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己嚷狞,他們只是感情好块促,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著床未,像睡著了一般竭翠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薇搁,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天斋扰,我揣著相機(jī)與錄音,去河邊找鬼。 笑死传货,一個胖子當(dāng)著我的面吹牛屎鳍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播损离,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哥艇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了僻澎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤十饥,失蹤者是張志新(化名)和其女友劉穎窟勃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逗堵,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡秉氧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜒秤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汁咏。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖作媚,靈堂內(nèi)的尸體忽然破棺而出攘滩,到底是詐尸還是另有隱情,我是刑警寧澤纸泡,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布漂问,位于F島的核電站,受9級特大地震影響女揭,放射性物質(zhì)發(fā)生泄漏蚤假。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一吧兔、第九天 我趴在偏房一處隱蔽的房頂上張望磷仰。 院中可真熱鬧,春花似錦境蔼、人聲如沸灶平。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民逼。三九已至,卻和暖如春涮帘,著一層夾襖步出監(jiān)牢的瞬間拼苍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留疮鲫,地道東北人吆你。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像俊犯,于是被迫代替她去往敵國和親妇多。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354