精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在iOS中如何正確的實現(xiàn)行間距與行高

移動開發(fā) iOS
面向 Google 以及 Stack Overflow 編程了一會后發(fā)現(xiàn),能查到的資料大部分是介紹如何實現(xiàn) lineSpacing 屬性,而不是 lineHeight。但是我就是因為 iOS 和 Android 的默認 lineSpacing 不一致所以才想實現(xiàn)個 lineHeight 啊!

最近準備給 VirtualView-iOS 的文本元素新增一個 lineHeight 屬性,以便和 VirtualView-Android 配合時能更精確的保證雙平臺的一致性。面向 Google 以及 Stack Overflow 編程了一會后發(fā)現(xiàn),能查到的資料大部分是介紹如何實現(xiàn) lineSpacing 屬性,而不是 lineHeight。但是我就是因為 iOS 和 Android 的默認 lineSpacing 不一致所以才想實現(xiàn)個 lineHeight 啊!還是需要自己動手豐衣足食,順帶整理成文章造福后人。

關于行間距 lineSpacing

先貼出一張 iOS 中 UILabel 的默認排版樣式:

 

26-A

大家也都能看出來,默認的排版樣式中,文本的行間距很小,顯得文本十分擠。

這種時候,設計師就會提出行間距的需求,希望讓文本展示得更美觀。類似的標注就會像這樣:

 

26-B

通常來說既然設計師要求的是行間距,那么我們直接設置 lineSpacing 就好。但是 UILabel 是沒有這么一個直接暴露的屬性的,想要修改 lineSpacing,我們需要借助 NSAttributedString 來實現(xiàn),示意代碼:

 

  1. NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; 
  2. paragraphStyle.lineSpacing = 10; 
  3. NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; 
  4. [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName]; 
  5. label.attributedText = [[NSAttributedString alloc] initWithString:label.text attributes:attributes]; 

運行一下觀察效果:

 

26-C

雖然用我們的眼睛看上去好像沒什么問題,但是設計師的火眼金睛一下就能看出來,和設計稿要求的有差距:

 

26-D

怎么會成這樣!?這跟說好的不一樣對不對!?不要慌,我來細細解釋下。

正確的實現(xiàn)行間距

先看示意圖:

 

26-E

紅色區(qū)域是默認繪制單行文本會占用的區(qū)域,可以看到文字的上下是有一些留白的(藍色和紅色重疊的部分)。設計師是想要藍色區(qū)域高度為 10pt,而我們直接設置 lineSpacing 會將兩行紅色區(qū)域中間的綠色區(qū)域高度設置為 10pt,這就是問題的根源了。

那么這個紅色的區(qū)域高度是多少呢?答案是 label.font.lineHeight,它是使用指定字體繪制單行文本的原始行高。

知道了原因后問題就好解決了,我們需要在設置 lineSpacing 時,減去這個系統(tǒng)的自帶邊距:

 

  1. NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; 
  2. paragraphStyle.lineSpacing = 10 - (label.font.lineHeight - label.font.pointSize); 
  3. NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; 
  4. [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName]; 
  5. label.attributedText = [[NSAttributedString alloc] initWithString:label.text attributes:attributes]; 

觀察一下效果,***契合:

 

26-F

關于行高 lineHeight

如果你只關心 iOS 設備上的文本展示效果,那么看到這里就已經(jīng)夠了。但是我需要的是 iOS 和 Android 展現(xiàn)出一模一樣的效果,所以光有行間距是不能滿足需求的。主要的原因在前言也提到了,Android 設備上的文字上下默認留白(上一節(jié)圖中藍色和紅色重疊的部分)和 iOS 設備上的是不一致的:

 

26-G

左側是 iOS 設備,右側 Android 設備,可以看到同樣是顯示 20 號的字體,安卓的行高會偏高一些。在不同的 Android 設備上使用的字體不一樣,可能還會出現(xiàn)更多的差別。如果不想辦法抹平這差別,就不能真正意義上實現(xiàn)雙端一致了。

這時候我們可以通過設置 lineHeight 來使得每一行文本的高度一致,lineHeight 設置為 30pt 的情況下,一行文本高度一定是 30pt,兩行文本高度一定是 60pt。雖然文字的渲染上會有細微的差別,但是布局上的差別將被完全的抹除。lineHeight 同樣可以借助 NSAttributedString 來實現(xiàn),示意代碼:

 

  1. NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; 
  2. paragraphStyle.maximumLineHeight = lineHeight; 
  3. paragraphStyle.minimumLineHeight = lineHeight; 
  4. NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; 
  5. [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName]; 
  6. label.attributedText = [[NSAttributedString alloc] initWithString:label.text attributes:attributes]; 

運行一下觀察效果:

 

27-A

在 debug 模式下確認了下文本的高度的確正確的,但是為什么文字都顯示在了行底呢?

修正行高增加后文字的位置

修正文字在行中展示的位置,我們可以用 baselineOffset 屬性來搞定。這個屬性十分有用,在實現(xiàn)上標下標之類的需求時也經(jīng)常用到它。經(jīng)過調試,發(fā)現(xiàn)最合適的值是 (lineHeight - label.font.lineHeight) / 4(尚未搞清楚為什么是除以 4 而不是除以 2,希望知道的老司機指點一二)。最終的代碼示例如下:

 

  1. NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new]; 
  2. paragraphStyle.maximumLineHeight = lineHeight; 
  3. paragraphStyle.minimumLineHeight = lineHeight; 
  4. NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; 
  5. [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName]; 
  6. CGFloat baselineOffset = (lineHeight - label.font.lineHeight) / 4; 
  7. [attributes setObject:@(baselineOffset) forKey:NSBaselineOffsetAttributeName]; 
  8. label.attributedText = [[NSAttributedString alloc] initWithString:label.text attributes:attributes]; 

貼一下在不同字號和行高下的展示效果:

 

27-B

行高和行間距同時使用時的一個問題

不得不說行高和行間距我們都已經(jīng)可以***的實現(xiàn)了,但是我在嘗試同時使用它們時,發(fā)現(xiàn)了 iOS 的一個 bug(當然也可能是一個 feature,畢竟不 crash 都不一定是 bug):

 

27-C

著色的區(qū)域都是文本的繪制區(qū)域,其中看上去是橙色的區(qū)域是 lineSpacing,綠色的區(qū)域是 lineHeight。但是為什么單行的文本系統(tǒng)也要展示一個 lineSpacing 啊!?坑爹呢這是!?

好在我們通常是行高和行間距針對不同的需求分別獨立使用的,它們在分開使用時不會觸發(fā)這個問題。所以在 VirtualView-iOS 庫中,我暫且將高度計算的邏輯保持和系統(tǒng)一致了。

總結

至此,成功的為 VirtualView-iOS 添加了對 lineHeight 屬性的支持,更多的實現(xiàn)細節(jié)大家可以到開源庫中直接看源代碼。希望我們的 Tangram 方案可以更加完善,幫助更多的人一次開發(fā)兩端同時使用,用一塊七巧板拼出大千世界。

責任編輯:未麗燕 來源: 蘋果核
相關推薦

2015-07-22 12:42:36

Pivot行列轉換

2021-08-26 08:24:33

高并發(fā)秒殺系統(tǒng)

2010-04-26 10:09:22

Oracle存儲過程

2009-12-07 18:42:55

PHP與Javascr

2024-11-28 09:59:35

2024-09-19 20:59:49

2010-06-28 12:46:09

SQL Server

2009-12-03 20:09:03

Tomcat支持PHP

2015-07-14 11:07:43

IOS一像素線

2018-11-01 17:06:06

cell自適應高主

2024-01-29 00:57:20

GuavaJava拷貝

2010-03-04 15:24:14

Python程序

2010-04-29 17:31:56

Oracle存儲過程

2014-04-09 09:32:24

Go并發(fā)

2010-05-05 17:19:32

Oracle存儲過程

2009-09-15 18:27:59

equals實現(xiàn)canEqualScala

2025-06-26 00:40:13

2024-12-27 09:32:19

2010-09-08 16:50:11

JavaScriptDOM操作
點贊
收藏

51CTO技術棧公眾號

www.av导航| 丰满大乳奶做爰ⅹxx视频| 日本成人网址| 国产一区不卡在线| 国自产精品手机在线观看视频| 日本少妇毛茸茸| 伦一区二区三区中文字幕v亚洲| 日韩毛片一二三区| 久久av免费观看| 国产又色又爽又黄又免费| 在线观看视频免费一区二区三区| 亚洲视频视频在线| 亚洲男人天堂2021| 希岛爱理一区二区三区av高清| 亚洲欧美综合色| 六十路精品视频| 精品久久人妻av中文字幕| 久久精品123| 欧美大片免费观看| 91无套直看片红桃在线观看| 免费萌白酱国产一区二区三区| 在线观看91精品国产麻豆| 日本熟妇人妻xxxx| 成人免费网站在线观看视频| 国产日韩欧美一区二区三区综合| 春色成人在线视频| 国产又粗又猛又黄视频| 欧美日韩日本国产亚洲在线| 色噜噜狠狠狠综合曰曰曰88av| 噜噜噜在线视频| 1204国产成人精品视频| 欧美理论片在线| 亚洲成人福利在线观看| 久久男人av资源站| 亚洲一二三专区| 福利在线小视频| 欧美日本高清| 中文字幕一区二区三区精华液| 麻豆精品视频| 天堂av2024| va亚洲va日韩不卡在线观看| 亚洲在线免费看| 在线观看免费高清视频| 久久在线精品| 日本一区二区三区四区视频| 成人免费区一区二区三区| 国色天香一区二区| 欧美精品videosex极品1| 91人妻一区二区三区蜜臀| 91欧美国产| 日韩亚洲一区二区| 黄色片子在线观看| 亚洲精品97| 欧美成人精品在线观看| 麻豆成人在线视频| 国产精品xvideos88| 久久久久久久久中文字幕| 九九九在线视频| 国产综合欧美| 性欧美暴力猛交69hd| 日本熟妇成熟毛茸茸| 91久久黄色| 青青草精品毛片| 无码人妻精品一区二区三区9厂| 性欧美精品高清| 热久久这里只有精品| 无码视频在线观看| 美女爽到高潮91| 91色p视频在线| 亚洲av色香蕉一区二区三区| 成+人+亚洲+综合天堂| 久久综合伊人77777麻豆| 国产福利在线看| 国产精品灌醉下药二区| 成人午夜视频免费观看| 日韩精品av| 精品视频一区二区三区免费| 中文字幕第一页在线视频| 91欧美日韩在线| 亚洲精品自拍偷拍| 老司机深夜福利网站| 欧美不卡在线| 1769国产精品| 亚洲一区二区人妻| 丁香婷婷综合网| 欧美日韩国产不卡在线看| 日本三级在线播放完整版| 洋洋av久久久久久久一区| 欧美日韩在线一| 欧洲成人一区| 欧美一二三四区在线| 国产人妻人伦精品1国产丝袜| 国产成人影院| 欧美精品亚州精品| 日本中文在线播放| 国产综合久久久久久久久久久久| 国产一区免费| 免费日本一区二区三区视频| 午夜精品久久久久久久久久| 亚洲天堂av线| 国产精品2023| 最近的2019中文字幕免费一页| 国产精品suv一区二区69| 日本怡春院一区二区| 不卡一区二区三区四区五区| 岛国在线视频| 性感美女极品91精品| 亚洲欧美日本一区二区三区| 欧洲在线一区| 欧美老肥婆性猛交视频| 精品无码一区二区三区的天堂| 国产91露脸合集magnet| 四虎永久国产精品| www.成人影院| 亚洲成av人乱码色午夜| 国产大屁股喷水视频在线观看| 亚洲高清网站| 91国产丝袜在线放| av播放在线| 精品露脸国产偷人在视频| 中文字幕日韩久久| 日韩久久久久| 日韩av电影在线播放| 人妻夜夜爽天天爽| 亚洲日本欧美天堂| 亚洲精品性视频| 精品一区二区三区的国产在线观看| 久久久久久中文| a级片在线视频| 中文欧美字幕免费| 亚洲狼人综合干| 要久久爱电视剧全集完整观看| 久久久久久久久久国产精品| 国产成人毛毛毛片| 亚洲三级电影全部在线观看高清| 天天插天天操天天射| 国产一区二区在线| 日韩免费在线视频| 毛片免费在线观看| 日韩欧美国产激情| 五月婷婷综合在线观看| 国产精品久久久免费 | 在线视频精品一区| 欧美xnxx| 日韩亚洲一区二区| 国产孕妇孕交大片孕| 亚洲欧洲一区二区三区| 不卡的在线视频| 亚洲色图网站| 91久久极品少妇xxxxⅹ软件 | 青青草97国产精品麻豆| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲精品无码久久久| 亚洲影院久久精品| 欧美xxxx×黑人性爽| 亚洲美洲欧洲综合国产一区| 久久99精品久久久久久水蜜桃| 精品众筹模特私拍视频| 精品国产免费人成电影在线观看四季| 国产精品99re| 久久午夜色播影院免费高清 | 国产99久久久国产精品免费看| 中文字幕の友人北条麻妃| 亚洲三级av| 国产91精品青草社区| 黑人与亚洲人色ⅹvideos| 欧美在线观看一区| 国产一二三区精品| 丰满放荡岳乱妇91ww| 18岁网站在线观看| 俺要去色综合狠狠| 亚洲综合日韩中文字幕v在线| 国产蜜臀一区二区打屁股调教| 亚洲国产欧美自拍| 日韩xxx视频| 亚洲精品国产第一综合99久久| 日本国产在线视频| 日韩精品一二三| 91免费版看片| 亚洲人成网77777色在线播放| 国产精品都在这里| av免费在线免费观看| 亚洲国产精品成人精品| 国产精品传媒在线观看| 亚洲人成电影网站色mp4| av网页在线观看| 男男视频亚洲欧美| 欧美中日韩在线| 免费看日本一区二区| 成人午夜激情网| 蜜桃视频在线观看免费视频| 中文字幕日韩在线播放| 国产 欧美 自拍| 欧美亚洲高清一区二区三区不卡| 欧美国产日韩综合| 久久精品亚洲精品国产欧美| 一级黄色免费毛片| 日韩中文字幕1| 丰满的少妇愉情hd高清果冻传媒 | 国产h视频在线播放| 久久亚洲在线| 久久精品人人做人人爽电影| 色999韩欧美国产综合俺来也| 97视频免费观看| 欧美jizzhd欧美| 日韩毛片中文字幕| 国产成人麻豆精品午夜在线| 欧美亚洲高清一区| 欧美三日本三级少妇99| 日韩理论在线观看| 精品无码人妻一区二区免费蜜桃| 国产91丝袜在线播放| 在线观看免费不卡av| 老牛影视一区二区三区| 国产一二三区在线播放| 婷婷精品进入| 视频在线一区二区三区| 免费av一区| 国产精品日韩一区二区| 国产高清日韩| 国产免费一区视频观看免费| videos性欧美另类高清| 91国偷自产一区二区三区的观看方式 | 国产不卡一区视频| 不卡的在线视频| 麻豆一区二区三区| 欧美日韩在线免费播放| 免费亚洲视频| 久久国产亚洲精品无码| 亚洲成人中文| www.成年人视频| 在线 亚洲欧美在线综合一区| 欧洲金发美女大战黑人| 国产精品毛片久久| 一区二区三区偷拍| 色综合五月天| 亚洲免费精品视频| 日本成人小视频| 神马影院我不卡午夜| 成人在线免费视频观看| 日韩高清国产一区在线观看| 久久99蜜桃| 日本一区二区三区四区高清视频 | 精品国产av一区二区| 3d动漫精品啪啪一区二区竹菊| 又骚又黄的视频| 欧美日韩三级一区二区| 亚洲自拍第二页| 欧美日韩国产成人在线91 | 亚洲国产一区自拍| 欧美熟妇另类久久久久久不卡| 亚洲国产精品高清久久久| 黄色av小说在线观看| 亚洲国产日韩欧美在线99| 少妇av一区二区| 国产视频一区在线| 国产视频二区在线观看| 国产亚洲日本欧美韩国| 91社区在线高清| 久久久999精品| 91豆花视频在线播放| 69av成年福利视频| 午夜日韩成人影院| 国产专区精品视频| 综合中文字幕| 蜜桃91精品入口| 日韩理论电影院| 日韩精品第1页| 日韩一级欧洲| 国产精品乱码久久久久| 国产一区视频网站| 亚洲欧美日韩偷拍| 国产女主播在线一区二区| 国产亚洲精品久久久久久豆腐| 亚洲精品国产一区二区三区四区在线| 日韩三级一区二区三区| 91黄色免费网站| 国产情侣av在线| 亚洲国内精品在线| av成人手机在线| 欧美极品在线视频| 免费日韩电影| 91在线免费观看网站| 精品福利一区| 亚洲一区综合| 日韩午夜免费视频| 在线观看国产中文字幕| 粉嫩久久99精品久久久久久夜 | 国产亚洲精品美女久久久久久久久久| 亚洲欧洲精品一区二区三区波多野1战4| 91成人精品| 97xxxxx| 国产成人自拍在线| 亚洲自拍偷拍图| 亚洲综合在线观看视频| 91麻豆精品在线| 精品国产百合女同互慰| 永久免费在线观看视频| 高清视频欧美一级| 欧洲精品久久久久毛片完整版| 国产三级精品在线不卡| 国产精品成人av| 日本三区在线观看| 成人午夜视频网站| 中文国语毛片高清视频| 日本国产一区二区| 色噜噜在线播放| 久久香蕉国产线看观看av| 免费观看成人性生生活片| 国产精品免费视频一区二区| 日韩视频在线观看| 午夜视频在线瓜伦| av一本久道久久综合久久鬼色| 在线观看亚洲网站| 日本韩国一区二区三区视频| 色一情一乱一乱一区91av| 久久伊人免费视频| 成人看片毛片免费播放器| 精品综合久久| 亚洲第一毛片| 黄色激情在线观看| 一区二区在线看| 国产女人高潮的av毛片| 永久免费看mv网站入口亚洲| 成人爱爱网址| 久久亚洲一区二区| 一本一本久久| 亚洲国产精品无码久久久久高潮| 一二三区精品视频| 国产视频第二页| 另类色图亚洲色图| 少妇高潮一区二区三区99| 亚洲蜜桃在线| 久久国产麻豆精品| 天天摸日日摸狠狠添| 在线视频综合导航| 国产精品麻豆一区二区三区| 青草成人免费视频| 国产亚洲电影| 国产天堂在线播放| 欧美极品少妇xxxxⅹ高跟鞋 | 久久久久久国产精品免费播放| 91精品国产全国免费观看| 国产人成网在线播放va免费| 91日本视频在线| 欧美高清日韩| 日本一级大毛片a一| 亚洲一级在线观看| 午夜视频www| 日本a级片电影一区二区| 久久不见久久见免费视频7| 国产成人精品无码播放| 国产日韩欧美电影| 在线免费看av片| 久久久电影免费观看完整版| 精品午夜视频| 亚洲一区二区三区av无码| 成人av网址在线观看| 久久国产视频播放| 亚洲欧美在线第一页| 国产精品久久久久久久久久齐齐 | 激情小说网站亚洲综合网| 99精品国产一区二区青青牛奶| 精品国产无码在线观看| 色中色一区二区| 欧美天天影院| 成人一区二区在线| 美女91精品| www.黄色com| 精品日韩一区二区三区免费视频| www.51av欧美视频| 亚洲国产欧美日韩| 国产电影一区二区三区| 国产成人无码精品亚洲| 亚洲欧洲在线观看| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 成人高清免费观看| 日本视频网站在线观看| 日韩视频免费在线| 超碰97久久| youjizzxxxx18| 亚洲自拍与偷拍| 精品无吗乱吗av国产爱色| 91精品在线看| 99精品国产99久久久久久福利| ass极品国模人体欣赏| 337p日本欧洲亚洲大胆精品| 成人四虎影院| 国产妇女馒头高清泬20p多| 欧美国产一区视频在线观看| www.蜜臀av.com| 国产精品久久久亚洲| 欧美日韩国产成人精品| 免费看黄色av| 日韩精品在线一区二区| 国产综合色在线观看| 日韩av中文字幕第一页| 国产精品无码永久免费888| 日韩一级免费毛片| 国产日韩欧美夫妻视频在线观看 |