亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS UILabel 設置內容的間距及高度的計算示例

2019-10-21 18:43:52
字體:
來源:轉載
供稿:網友

前言

ios/209901.html">UILabel 是的使用頻率是非常頻繁,當文字較多的時候,會顯得密密麻麻的,不利于UI顯示及用戶觀看。通常我們需要對 Label 中“行間距”或“文字間距”進行調整,從而使文字沒那么緊密,提高用戶體驗。

當調整“行間距”或“字間距”后,很多時候需要對Label進行高度自適應,此時會出現高度計算錯誤的問題,所以我們需要對“富文字”高度進行計算。計算結束后,經測試發現:當文字為1行并且全部文字為“中文”時,高度計算不準確,最后對該問題進行處理。

綜上所述:分為以下三步進行設置“UILabel 內容的間距及高度的計算”

? 1. 通過使用 UILbael 的分類實現修改間距的功能。

? 2 .使用兩種方法來計算:“富文字”的高度。

? 3. 對“高度計算結果”特殊情況進行處理。

一.設置 Label “行間距”或“字間距”

設置思路

普通的 NSString 文字,不能調整字體“行間距”或“字間距”,但
NSAttributedString 富文字,可以調整該間距,所以我們把普通的字體變為富文字,然后使用富文字對應方法即可設置間距。
設置過程

給 label 添加一個分類,在分類中聲明并實現三種方法

@interface UILabel (ChangeLineSpaceAndWordSpace)//1.設置:行間距+ (void)changeLineSpaceForLabel:(UILabel *)label WithSpace:(float)space;//2.設置:字間距+ (void)changeWordSpaceForLabel:(UILabel *)label WithSpace:(float)space;//3.設置:行間距 與 字間距+ (void)changeSpaceForLabel:(UILabel *)label withLineSpace:(float)lineSpace WordSpace:(float)wordSpace;@end

1.設置:行間距

//傳入需要設置的 Label 與需要設置的行間距數值+ (void)changeLineSpaceForLabel:(UILabel *)label WithSpace:(float)space { NSString *labelText = label.text; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setLineSpacing:space]; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])]; label.attributedText = attributedString; [label sizeToFit];}

2.設置:字間距

//傳入需要設置的 Label 與需要設置的字間距數值+ (void)changeWordSpaceForLabel:(UILabel *)label WithSpace:(float)space { NSString *labelText = label.text; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText attributes:@{NSKernAttributeName:@(space)}]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])]; label.attributedText = attributedString; [label sizeToFit];}

3.同時設置: 行間距 與 字間距

//傳入需要設置的 Label 與需要設置的行間距數值與字間距數值+ (void)changeSpaceForLabel:(UILabel *)label withLineSpace:(float)lineSpace WordSpace:(float)wordSpace { NSString *labelText = label.text; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText attributes:@{NSKernAttributeName:@(wordSpace)}]; NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; [paragraphStyle setLineSpacing:lineSpace]; [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])]; label.attributedText = attributedString; [label sizeToFit];}

使用示例

//設置label內容,將lable內容變為有間距的內容 testLabel.text = @"測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字測試文字"; [UILabel changeLineSpaceForLabel:testLabel WithSpace:20];//設置testLabel中內容的行間距為20 [UILabel changeWordSpaceForLabel:self.testLabel WithSpace:20];//設置testLabel中內容的字間距為20//  [UILabel changeLineSpaceForLabel:self.testLabel WithSpace:20];//設置testLabel中內容的行間距為20,字間距為20

ios,UILabel,內容間距,設置間距,間距

計算Label富文字高度

計算思路

可以直接計算富字體排布高度,該高度即為 Label 高度,也可以使用 UILable 的方法來計算 Label 高度

方法1.使用UILabel方法:sizeThatFits

- (CGRect)sizeThatFits:(CGSize)size; 

通過UILabel的方法sizeThatFits,該方法需要傳入一個參數,即可算出目前label高度。

參數1. size:其中size的寬度為label的寬度,size的一般填入最大高度。

CGSize size = [label sizeThatFits:CGSizeMake(label.frame.size.width, CGFLOAT_MAX)];

方法2.使用NSString方法:boundingWithRect

- (CGRect)boundingRectWithSize:(CGSize)size            options:(NSStringDrawingOptions)options            context:(nullable NSStringDrawingContext *)context;

該方法需要傳入3個參數:

參數1. size:其中size的寬度為label的寬度,size的一般填入最大高度。

參數2. options: 文本繪制時的附加選項

? 1. NSStringDrawingUsesLineFragmentOrigin (整個文本將以每行組成的矩形為單位計算整個文本的尺寸 )
? 2. NSStringDrawingUsesFontLeading (使用字體的行間距來計算文本占用的范圍,即每一行的底部到下一行的底部的距離計算 )
? 3. NSStringDrawingUsesDeviceMetrics (將文字以圖像符號計算文本占用范圍,而不是以字符計算。也即是以每一個字體所占用的空間來計算文本范圍 )
? 4. NSStringDrawingTruncatesLastVisibleLine (當文本不能適合的放進指定的邊界之內,則自動在最后一行添加省略符號。如果NSStringDrawingUsesLineFragmentOrigin沒有設置,則該選項不生效)

參數3. context: 上下文,一般傳nil

使用示例

NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX) options:options context:nil];

Label富文字計算高度注意點

出現問題

當文字只有一行并且是全是中文時:高度計算不準確

ios,UILabel,內容間距,設置間距,間距

解決思路

首先: 通過sizeThatFits 或 boundingWithRect 計算出未處理的rect值

第一步: 對rect值,進行判斷: “是否只有一行 并且 該行文字全為中文”

第二步: 修復高度值,對高度值進行調整: “減去一個行間距值”

示例代碼

//通過boundingWithRect 計算出未處理的rect值 NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading; CGRect rect = [attributeString boundingRectWithSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX) options:options context:nil];//判斷內容是否只有一行 : (目前高度 - 字體高度) <= 行間距 if ((rect.size.height - _font.lineHeight) <= paragraphStyle.lineSpacing){//如果只有一行,進行判斷內容中是否全部為漢字  if ([self containChinese:string]) {//修正后高度為: 目前高度 - 一個行間距   rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height-paragraphStyle.lineSpacing);  } }//判斷內容中是否全部為漢字- (BOOL)containChinese:(NSString *)str {  for(int i=0; i< [str length];i++){ int a = [str characterAtIndex:i];   if( a > 0x4e00 && a < 0x9fff){      return YES;    }  }  return NO;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品jvid在线观看蜜臀| 日韩av网址在线观看| 韩国美女主播一区| 亚洲国产天堂久久综合网| 亚洲欧美制服丝袜| 日韩欧美在线播放| 成人国产精品免费视频| 色综合久久天天综线观看| 日韩精品日韩在线观看| 国内揄拍国内精品少妇国语| 最近2019中文免费高清视频观看www99| 亚洲国产欧美久久| 91成人福利在线| 成人黄在线观看| 欧美午夜精品久久久久久浪潮| 国产成人aa精品一区在线播放| 亚洲图片欧美日产| 欧美激情aaaa| 欧美日韩激情视频8区| 国产一区二区三区日韩欧美| 在线播放国产一区二区三区| 久久夜色精品国产欧美乱| 国产美女久久精品香蕉69| 九九视频直播综合网| 久久精视频免费在线久久完整在线看| 国产精品h片在线播放| 亚洲欧美中文另类| 日韩在线精品视频| 欧美成年人视频网站欧美| 日韩视频在线观看免费| 国产精品av在线| 亚洲欧美中文字幕| 欧美老女人bb| 亚洲天堂开心观看| 亚洲人成电影在线播放| 91精品国产高清久久久久久久久| 国产在线高清精品| 欧美在线视频观看免费网站| 国产69精品久久久| 一区二区中文字幕| 福利二区91精品bt7086| 国产精品久久久久91| 国产精品亚洲美女av网站| 国产精品欧美日韩一区二区| 91精品视频大全| 久久99久久99精品免观看粉嫩| 日本免费在线精品| 欧美放荡办公室videos4k| 欧美性猛交99久久久久99按摩| 亚洲国产第一页| 亚洲国产精品va在线看黑人动漫| 久久久久久有精品国产| 久久久精品国产| 久久97精品久久久久久久不卡| 国产啪精品视频| 国产不卡精品视男人的天堂| 欧美黄网免费在线观看| 久久久欧美精品| 亚洲视频在线看| 欧美一区三区三区高中清蜜桃| 欧美日韩国产黄| 国产日本欧美一区二区三区| 国产欧美精品在线播放| 亚洲国产高清高潮精品美女| 欧美激情亚洲一区| 国产精品影片在线观看| 国产九九精品视频| 最好看的2019的中文字幕视频| 国内精品视频一区| 亚洲国产美女精品久久久久∴| 国产suv精品一区二区| www.久久久久久.com| 欧美性猛交xxxx乱大交极品| 亚洲尤物视频网| 欧美第一淫aaasss性| 久久激情五月丁香伊人| 亚洲福利视频专区| 欧美超级免费视 在线| 日韩精品极品视频免费观看| 欧美日韩人人澡狠狠躁视频| 久久中文字幕国产| 亚洲经典中文字幕| 亚洲国产精品久久久久| 国产精品久久久久久久一区探花| 亚洲欧美制服综合另类| 国产色综合天天综合网| 国产成+人+综合+亚洲欧美丁香花| 精品在线观看国产| 色综合久久精品亚洲国产| 日本韩国在线不卡| 狠狠色狠色综合曰曰| 97在线视频国产| 国产视频欧美视频| 久久久久亚洲精品国产| 欧美激情视频播放| 亚洲va欧美va国产综合久久| 国产精品日日摸夜夜添夜夜av| 成人97在线观看视频| xxxx欧美18另类的高清| 国产亚洲视频中文字幕视频| 国产午夜精品久久久| 欧美另类高清videos| 91精品免费看| 欧美最猛黑人xxxx黑人猛叫黄| 欧美一级免费视频| 自拍偷拍免费精品| 18一19gay欧美视频网站| 久久人91精品久久久久久不卡| 色播久久人人爽人人爽人人片视av| 欧美日韩国产成人| 午夜精品一区二区三区在线视频| 欧美大片在线看免费观看| 久久精品久久久久电影| 久久久精品一区| 日本久久精品视频| 国内精品久久久久久影视8| 亚洲成人三级在线| 日韩少妇与小伙激情| 国产精品久久久久久久久久久不卡| 亚洲综合社区网| 亚洲影视九九影院在线观看| 日韩电影中文字幕一区| 国产精品成av人在线视午夜片| 欧美疯狂xxxx大交乱88av| 18久久久久久| 岛国精品视频在线播放| 午夜精品久久久久久久久久久久久| 欧美日韩加勒比精品一区| 中文字幕日韩欧美在线视频| 久久最新资源网| 国产精品免费看久久久香蕉| 日韩电影中文字幕在线观看| 亚洲精品乱码久久久久久按摩观| 久久精品亚洲国产| 夜夜嗨av色一区二区不卡| 亚洲精品美女网站| 中文字幕v亚洲ⅴv天堂| 色妞在线综合亚洲欧美| 96国产粉嫩美女| 国产精品一区二区三区在线播放| 亚洲成人黄色在线观看| 亚洲精品一区二区久| 91麻豆国产语对白在线观看| 欧美高清视频免费观看| 精品国产成人av| 亚洲国产欧美一区| 亚洲第一精品自拍| 国产不卡一区二区在线播放| 亚洲一区二区三区在线免费观看| 日本午夜精品理论片a级appf发布| 国产一区av在线| 2025国产精品视频| 中文亚洲视频在线| 国产精品v片在线观看不卡| 97不卡在线视频| 亚洲成人激情视频| 亚洲第一页在线| 91最新在线免费观看| 国模私拍一区二区三区| 最近2019中文字幕第三页视频| 在线看国产精品| 国内精品视频一区| 亚洲电影免费观看| 免费99精品国产自在在线|