【iOS開發(fā)筆記】富文本的對齊方式萤衰、行高堕义、行間距控制

一、開發(fā)問題

開發(fā)中腻菇,按照設(shè)計稿去做的頁面胳螟,為何總是無法與設(shè)計稿完美對應(yīng)?怎樣才能精準(zhǔn)的還原設(shè)計稿樣式筹吐?

相信大家都遇到過類似問題糖耸,今天來探討下如何通過對齊的方式盡可能精準(zhǔn)的還原文本的展示樣式。

二丘薛、文本的屬性

文本

對圖中做幾點(diǎn)解釋:

  • baseline:相當(dāng)于坐標(biāo)原點(diǎn)嘉竟,默認(rèn)設(shè)定中大部分的拉丁字母底部與此對齊,漢字的中下部與此對齊洋侨。
  • ascent:字體可繪制區(qū)域的上部最大值舍扰,ascent在大部分情況下會比最高的字符還要高一點(diǎn)點(diǎn),可能是系統(tǒng)設(shè)定希坚。
  • descent:與ascent相似边苹,是字體可繪制區(qū)域的下部最大值,可能為負(fù)值裁僧。
  • leading:行間距个束,與傳統(tǒng)意義的行間距并不相同,不同的字體在顯示時視覺上的行間距不同聊疲,這時說的是這個值茬底。
  • line height:行高,= ascent + |descent| + leading获洲。

需要注意阱表,以上屬性為字體本身的屬性,應(yīng)該是字體設(shè)計時就定好的,理論上是不可變的(富文本中對應(yīng)baselineOffset改變的是富文本顯示的對齊方式)

另外最爬,iOS中的字體大小涉馁,即UIFontpointSize屬性,并不直接對應(yīng)行高烂叔,一般一個字體是10的文本谨胞,line height一般為11.89固歪,大約為字體大小的1.2倍蒜鸡,所以按照這個結(jié)果來看,iOS字體默認(rèn)是1.2倍行高牢裳。

三逢防、行間距和行高

行高及行間距

繼續(xù)先來對圖中做幾點(diǎn)解釋:

  • line space:行間距,直接對應(yīng)兩行文本之間的間距值蒲讯。
  • line height of font:每一行文字的高度忘朝。
  • 行高:每一行的實(shí)際高度,= line height of font + line space判帮。
  • 行高倍數(shù)lineHeightMultiple局嘁,幾倍行高,= 行高 / line height晦墙。

四悦昵、NSAttributeString的對應(yīng)屬性

在iOS開發(fā)中使用富文本進(jìn)行行設(shè)置時主要通過段落類型NSMutableParagraphStyle來進(jìn)行設(shè)置,對應(yīng)富文本中的NSAttributedStringKey.paragraphStyle

主要涉及屬性如下:

  • lineSpacing:行間距晌畅,會在每行位子之間添加間距但指,在首行的頂部與尾行的底部沒有額外的空白。比較符合我們大多數(shù)的需求抗楔,但不太適合和通用型設(shè)置棋凳,因?yàn)椴煌淖煮w大小為實(shí)現(xiàn)相同效果可能需要設(shè)置不同的行間距,比較繁瑣连躏。
  • minimumLineHeight/maximumLineHeight/lineHeightMultiple :最小行高/最大行高/行高倍數(shù)剩岳,這幾個屬性都是直接設(shè)置行高的,存在的問題是如果行高大于文字的高度(line height of font)入热,那么多余的空間會放在該行的上方拍棕,即baseline所在的位置是該行的最底部向上偏移leading + |descent|的位置〔哦伲可搭配使用富文本的baselineOffset屬性來設(shè)置對齊莫湘,但總體不是很方便。

根據(jù)上面提到的一些缺點(diǎn)郑气,開發(fā)中可以考慮組合使用幅垮,例如要求行高為a px,字體大小為b px尾组,則:

  • 因?yàn)橄到y(tǒng)中默認(rèn)為1.2倍行距忙芒,所以文字行高為:line_height_of_font = b * 1.2示弓。
  • 文字在行中居中顯示,所以每行中文字與該行頂部的間距:line_top = (a - line_height_of_font) / 2呵萨。
  • 所以每行行高設(shè)置為:minimumLineHeight = line_height_of_font + line_top = (a - b * 1.2) / 2 + b * 1.2奏属。
  • 此時設(shè)置兩行之間的間距為:lineSpacing = a - minimumLineHeight
  • 最后在計算該富文本行高時潮峦,底部加上一個lineSpacing囱皿,實(shí)現(xiàn)最后一行與底部的間距。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忱嘹,一起剝皮案震驚了整個濱河市嘱腥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拘悦,老刑警劉巖齿兔,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異础米,居然都是意外死亡分苇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門屁桑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來医寿,“玉大人,你說我怎么就攤上這事掏颊≡愫欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵乌叶,是天一觀的道長盆偿。 經(jīng)常有香客問我,道長准浴,這世上最難降的妖魔是什么事扭? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮乐横,結(jié)果婚禮上求橄,老公的妹妹穿的比我還像新娘。我一直安慰自己葡公,他們只是感情好罐农,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著催什,像睡著了一般涵亏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天气筋,我揣著相機(jī)與錄音拆内,去河邊找鬼。 笑死宠默,一個胖子當(dāng)著我的面吹牛麸恍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搀矫,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼抹沪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了艾君?” 一聲冷哼從身側(cè)響起采够,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤肄方,失蹤者是張志新(化名)和其女友劉穎冰垄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體权她,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虹茶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了隅要。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝴罪。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖步清,靈堂內(nèi)的尸體忽然破棺而出要门,到底是詐尸還是另有隱情,我是刑警寧澤廓啊,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布欢搜,位于F島的核電站,受9級特大地震影響谴轮,放射性物質(zhì)發(fā)生泄漏炒瘟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一第步、第九天 我趴在偏房一處隱蔽的房頂上張望疮装。 院中可真熱鬧,春花似錦粘都、人聲如沸廓推。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樊展。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滚局,已是汗流浹背居暖。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留藤肢,地道東北人太闺。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像嘁圈,于是被迫代替她去往敵國和親省骂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

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