2015-08-29 32 views
13

即使標籤的文本適合一行,是否預計具有自定義lineSpacing屬性的多行UILabel也會包含該行間距?使用單行文本的UILabel的行間距

這裏是我的標籤:

這裏是它是如何佈局。請注意文本下方的額外間距。

enter image description here

對於比較:

enter image description here

什麼奇怪的是缺乏一致性。當標籤延伸到第二線,底線不再包括這個額外的間距:

enter image description here

有沒有辦法時,有文字的單行刪除此行間距?或者採取其他方式來強化一些一致性,這樣我至少可以解釋它?

更新

基準計算也似乎打破。嘗試將視圖(此處爲紅色框)與標籤的基線對齊時,多行標籤部分覆蓋。不管有多少行是在標籤

enter image description here enter image description here

+0

您使用的是自定義字體嗎? – larsacus

+0

@larsacus是的,我是。具體來說,各種Gotham變種。 –

+0

您是否嘗試過使用系統字體進行相同的測試? – Wain

回答

2

既然你說過你使用的是自定義字體,根據以前的經驗,我最好的猜測是你看到的問題的根源在於自定義字體本身的裏面。無論何時,當客戶端給我一個自定義字體時,有90%的時間,實際的字體指標(如Apple的內部字體渲染子系統所解釋的,即使它可能在其他地方正確渲染)也是「錯誤的」。

好消息是這是可以修復的,但它需要用新指標來重建字體,這通常是一個試驗/錯誤事件。你可能還需要檢查你的字體許可證是否允許這樣的事情(如果它甚至重要的話)。

話雖這麼說,這些都是一些資源問題,我保持周圍這個確切的情況,每當我開始一個新項目:

這裏有一個類似的問題,到你的假設,這自定義字體問題:「Custom UIFont baseline shifted」。這個問題在UIButton「UIButton custom font vertical alignment」中涉及到這個問題,但是這兩個問題最終都回答了這個問題「Custom installed font not displayed correctly in UILabel」的答案。

我有一個自定義字體的個人測試臺應用程序,現在我每次使用自定義字體時都會使用它。這使我可以爲每次重建迭代測試字體,以確保它完美呈現。確保以各種字體大小甚至其他語言測試您的更改(是的,許多排列組合)。在使用自定義字體時,我遇到了與泰文和中文有關的問題,因爲它們的上行距離非常接近UILabel的邊界框。我爲自己創建的測試平臺包括以各種大小和各種大小的各種語言呈現的基本UILabels中的字體(因爲就像我所說的,過去我遇到了一些不好的經驗,使用某些語言的自定義字體,以羅馬字符)。

如果有人對此有更好的解決方案,我很樂意聽到它,因爲幾乎每次都會遇到自定義字體的問題。這是我的工作流程,用於在佈局過程中補償字體的渲染問題或使用單獨的屬性字符串調整之前,將問題排除在萌芽狀態之外。我不是字體專家,我只是一個喜歡字體來渲染內置字體的人(尤其是使用自動佈局時)。

+0

感謝您的支持。我很想看到你的字體測試套件是開源的!再次感謝。 –

+0

你可以分享你的字體測試代碼嗎? –

0

是的,lineSpacing應用。如果您使用的是自動佈局,則可以通過將標籤的baseline限制爲其父級或同級視圖(適當時)來解決此問題,而不是標籤的頂部邊緣與父級或同級頂級對齊。 (但是,這是假定您的標籤的背景顏色與其父視圖的顏色相同;否則,您會看到多餘的行間距顯示爲背景顏色。可能更好,現在我想起來了)是設置一個paragraphSpacing屬性0以及這應該會取消標籤中最後一行的lineSpacing,而不管您有多少行

+0

'paragraphSpacing'沒有效果,除非有多段文字,這很有意義(不幸的是)。我不確定你在基線對齊時會得到什麼? –

+0

我現在明白 - 您建議我使用標籤的底線而非底部,因爲它們在兩種情況下都是一致的。不幸的是它在實踐中沒有任何區別。 –

+0

只需雙重檢查 - 實際上,當與標籤的基線對齊時,視圖實際上會在多行使用時重疊文本。 –

1

您可以計算如果只有一條線,則將lineSpacing設置爲0

但是可能有更好的解決方案

+0

這似乎是合理的,我可能會從我父視圖的layoutSubviews實現它。 FWIW我已經與iOS的各種文本API進行了廣泛的合作,我記得在UILabel中NSParagraphStyle的行爲非常奇怪。 –

3
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping 

當文本爲多行時可以避免此問題。

使用fontName [UIFont fontWithName:@"PingFangSC-Regular" size:14]明確設置字體,而不是使用[UIFont systemFontOfSize:14]可以避免文本爲單行時的問題。

希望這對你有幫助!