iOS UIFont簡介與文本行數(shù)判斷

UIFont

UIFont.png
屬性介紹

familyName:字體家族的名字
fontName:字體的名字
pointSize:字號大小
ascender:基準線以上的高度
descender:基準線以下的高度(負數(shù))
capHeight:大寫字母的高度
xHeight:小寫x的高度
lineHeight:行高
leading:行間距(一般為0)

    NSString *text = @"字體高度??";
    UIFont *font = [UIFont fontWithName:@"Didot Italic" size:18];
    NSLog(@"字體信息:\npointSize:%lf,\nascender:%lf,\ndescender:%lf,\ncapHeight:%lf,\nxHeight:%lf,\nlineHeight:%lf,\nleading:%lf",font.pointSize,font.ascender,font.descender,font.capHeight,font.xHeight,font.lineHeight,font.leading);

字體信息:
pointSize:18.000000,
ascender:16.956000,
descender:-5.220000,
capHeight:12.942000,
xHeight:7.956000,
lineHeight:22.176000,
leading:0.450000

1.設(shè)置的字體大小就是 pointSize细移。

  1. lineHeight = ascender + descender (按照圖上所示應(yīng)該為lineHeight = ascender + descender +leading ,但是實際查看了幾個字體汪茧,都是lineHeight = ascender + descender)通危。

3.實際行與行之間就是存在間隙的,間隙大小即為 lineHeight - pointSize微渠,在富文本中設(shè)置行高的時候,其實際文字間的距離就是加上這個距離的盏浇。(原來一直錯誤的理解文字間的距離就是行間距)匠璧。

行數(shù)計算(猜想)

text
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIFont *font = [UIFont fontWithName:@"Didot Italic" size:18];
    NSLog(@"字體信息:\npointSize:%lf,\nascender:%lf,\ndescender:%lf,\ncapHeight:%lf,\nxHeight:%lf,\nlineHeight:%lf,\nleading:%lf",font.pointSize,font.ascender,font.descender,font.capHeight,font.xHeight,font.lineHeight,font.leading);
    
    NSString *text = @"字體高度??";
    CGSize size= [text boundingRectWithSize:CGSizeMake(300, CGFLOAT_MAX)
                                          options:NSStringDrawingTruncatesLastVisibleLine
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil].size;
    NSLog(@"文本計算:%lf,%lf",size.width,size.height);
    
    UILabel *label = [[UILabel alloc] init];
    label.frame = CGRectMake(30, 0, size.width, size.height);
    label.backgroundColor = [UIColor redColor];
    label.numberOfLines = 0;
    label.text = text;
    label.font = font;
    [self.view addSubview:label];
    NSLog(@"label展示:%lf,%lf",label.frame.size.width,label.frame.size.height);
    
    UILabel *label1 = [[UILabel alloc] init];
    label1.frame = CGRectMake(30, 100, 300, 300);
    label1.backgroundColor = [UIColor redColor];
    label1.numberOfLines = 0;
    label1.text = text;
    label1.font = font;
    [label1 sizeToFit];
    [self.view addSubview:label1];
    NSLog(@"label1展示:%lf,%lf",label1.frame.size.width,label1.frame.size.height);
    
    self.label2 = [[UILabel alloc] init];
    self.label2.backgroundColor = [UIColor redColor];
    self.label2.numberOfLines = 0;
    self.label2.text = text;
    self.label2.font = font;
    [self.view addSubview:self.label2];
    [self.label2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(30);
        make.top.mas_equalTo(200);
    }];
    
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"label2展示:%lf,%lf",self.label2.frame.size.width,self.label2.frame.size.height);
}

字體信息:
pointSize:18.000000,
ascender:16.956000,
descender:-5.220000,
capHeight:12.942000,
xHeight:7.956000,
lineHeight:22.176000,
leading:0.450000

//iOS16.4 iPhone14
/**字體高度??
*/
文本計算:94.000000,22.176000
label展示:94.000000,22.176000
label1展示:94.000000,22.333333
label2展示:94.000000,22.333333
/**字體高度??\n字體高度??
*/
文本計算:94.000000,44.352000
label展示:94.000000,44.352000
label1展示:94.000000,44.666667
label2展示:94.000000,44.666667
/**字體高度3??\n字體高度3??\n字體高度3??
*/
文本計算:102.676000,66.528000
label展示:102.676000,66.528000
label1展示:103.000000,66.666667
label2展示:103.000000,66.666667

通過boundingRectWithSize...方法獲取的文本高度為字體的lineHeight*行數(shù)。是否可以通過高度計算除以字體的lineHeight判斷是單行還是雙行鲤妥??拱雏?

富文本
 UIFont *font = [UIFont fontWithName:@"Didot Italic" size:18];
 NSLog(@"字體信息:\npointSize:%lf,\nascender:%lf,\ndescender:%lf,\ncapHeight:%lf,\nxHeight:%lf,\nlineHeight:%lf,\nleading:%lf",font.pointSize,font.ascender,font.descender,font.capHeight,font.xHeight,font.lineHeight,font.leading);
 
 
 NSString *text = @"字體高度??";
 NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc]init];
 style.lineBreakMode = NSLineBreakByWordWrapping;
 style.alignment = NSTextAlignmentRight;
 NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
 [attributes setObject:style forKey:NSParagraphStyleAttributeName];
 [attributes setObject:@(-3) forKey:NSBaselineOffsetAttributeName];
 [attributes setObject:font forKey:NSFontAttributeName];
 NSAttributedString *att = [[NSAttributedString alloc] initWithString:text attributes:attributes];
 CGSize size = [att boundingRectWithSize:CGSizeMake(300, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;


字體信息:
pointSize:18.000000,
ascender:16.956000,
descender:-5.220000,
capHeight:12.942000,
xHeight:7.956000,
lineHeight:22.176000,
leading:0.450000

//iOS16.4 iPhone14
/**字體高度??
*/
文本計算:94.000000,25.176000
label展示:94.000000,25.176000
label1展示:94.000000,25.333333
label2展示:94.000000,25.333333

/**字體高度??\nwww
*/
文本計算:94.000000,50.352000
label展示:94.000000,50.352000
label1展示:94.000000,50.666667
label2展示:94.000000,50.666667

/**字體高度??\nwww\n123
*/
文本計算:94.000000,75.528000
label展示:94.000000,75.528000
label1展示:94.000000,75.666667
label2展示:94.000000,75.666667

富文本部分屬性設(shè)置會影響當行字體的高度棉安,但應(yīng)該也可以通過高度計算除以單行高度判斷文本行數(shù),如該實例中單行高度為lineHeight+NSBaselineOffsetAttributeName铸抑。

注意:sizeToFitMasonry會根據(jù)屏幕分辨率向上適配寬高贡耽。

參考文檔

iOS_UIFont的Attributes解析
iOS 對UIFont的新的理解
UILabel行間距l(xiāng)ineSpacing 行高lineHeight

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹊汛,隨后出現(xiàn)的幾起案子蒲赂,更是在濱河造成了極大的恐慌,老刑警劉巖刁憋,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥嘴,死亡現(xiàn)場離奇詭異,居然都是意外死亡至耻,警方通過查閱死者的電腦和手機若皱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門镊叁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人走触,你說我怎么就攤上這事晦譬。” “怎么了互广?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵敛腌,是天一觀的道長。 經(jīng)常有香客問我惫皱,道長迎瞧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任逸吵,我火速辦了婚禮凶硅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扫皱。我一直安慰自己足绅,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布韩脑。 她就那樣靜靜地躺著氢妈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪段多。 梳的紋絲不亂的頭發(fā)上首量,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音进苍,去河邊找鬼加缘。 笑死,一個胖子當著我的面吹牛觉啊,可吹牛的內(nèi)容都是我干的拣宏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杠人,長吁一口氣:“原來是場噩夢啊……” “哼勋乾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗡善,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤辑莫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罩引,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體各吨,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年蜒程,在試婚紗的時候發(fā)現(xiàn)自己被綠了绅你。 大學時的朋友給我發(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
  • 我被黑心中介騙來泰國打工庐船, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留银酬,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓醉鳖,卻偏偏與公主長得像捡硅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盗棵,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容