2014-04-06 39 views
2

我已經做了大量的搜索/閱讀/測試,並且找不到解決此問題的方法。 我已經嘗試過iOS 4.3,但它仍未在iOS7中解決。UILabel中的字體不正確 - Ascender或Descender被裁剪

問題是這樣的:大尺寸的字體可以在UILabel中剪切上升或下降的字體。 這裏直接從Xcode的5.1 UI是截圖(沒有代碼在所有!)顯示的問題 - 字體大小300點:

enter image description here

正如你可以看到,即使是簡單的字體像Helvetica Neue字體(粗體或不)它有下降的裁剪。 (你正在看UIViewController> UIView> UILabel)

如果你嘗試這個,然後改變點的大小,你會看到字體縮小,最終不會裁剪下降。這在160點又是:

enter image description here

還要注意,某些字體沒有得到裁剪和別人 - 嘗試值得注意的是,紙莎草或或薩沃耶LET - 所有這些都是標準的iOS &字體.. ..

我談論身高在這裏 - 我知道我可以使用adjustsFontSizeToFitWidth = YES看到整個長度,我也知道我可以使用sizeToFit,但既不保證沒有上升器/下降的裁剪。

還要注意的是使用計算上升器/下降值不會幫助爲主要議題的高度,字體是不是標籤內垂直居中當它被繪製。 (如果是的話,這將是一個簡單的計算。)

所以,這裏是一個問題:我如何顯示字體儘可能高,並保證不會裁剪上升/下降,無論使用何種字體

編輯: 我重新讀我的問題,並意識到我沒有正確地問 - 我能夠調整標籤以適應字體 - 這不是問題。下面是修改後的問題:

如何在UILabel中儘可能大地繪製文本,並確保其垂直居中,而不裁剪Ascender或Descender?

我可以很容易地找出文本的整體高度,一旦我知道它將適合,如何在UILabel中繪製垂直居中?

例如:在第一個屏幕截圖中,文本「Tg」被裁剪,但它很容易短到可以在標籤中垂直放置。事實上,它可能會更大,如果適當居中,它仍然適合。但我知道沒有辦法垂直居中...

回答

0

標籤的大小可以根據長度字符串,使用字體屬性和大小的字體的的大小。我用這個方法很多,對於這樣的要求的偉大工程 -

NSString *textWithinLabel = @"Whatever you like, passed from where ever"; 

CGSize maximumLabelSize = CGSizeMake(300, 1000); //Place your maximum sizes here 

//Here I've used Helvetica, though you can pass any font name or font size here to try out 
NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[[UIFont fontWithName:@"Helvetica" size:15] forKey: NSFontAttributeName]; 

CGSize newExpectedLabelSize = [textWithinLabel boundingRectWithSize:maximumLabelSize options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:stringAttributes context:nil].size; 

CGRect frame = self.yourLabel.frame; 
frame.size.height = newExpectedLabelSize.height; 
self.yourLabel.frame = frame; 

這個例子將改變標籤的高度,雖然你可以用它來改變這裏太寬等 的stringAttributes被用來計算大小,而不是設置屬性。例如,如果您的標籤使用的是14pts,並且計算了30pts的高度,則不會更改字體的高度,只會增加標籤的大小以適應較大的字體大小。如果您希望此方法還可以更改字體屬性,則需要在方法的底部添加適當的代碼 - self.yourLabel.text.font = ...

我希望這回答了你的問題,

謝謝你,吉姆。

+0

Jeely - 謝謝,但在審查我的問題後,我認爲我需要重述它。我能夠增加標籤的大小以適應字體 - 這不是真正的問題 - 請參閱我的更新。對困惑感到抱歉。 – wayneh

0

我試過了,它解決了我的問題。從本質上講,這封信的高度是上升+下降。這就是標籤所需的垂直空間。

1. [commentLabel sizeToFit]; //爲了從標籤修剪掉不需要的區域

2. [commentLabel SETFRAME:CGRectMake(commentLabel.frame.origin.x,commentLabel.frame.origin.y + ABS(commentLabel.font.descender), commentLabel.frame.size.width,commentLabel.font.ascender + ABS(commentLabel.font.descender))];

// **(2)**中的框架調整將標籤向下移動commentLabel.font.descender,因爲默認情況下標籤是根據其實際底線而不是我們在筆記本上使用的實際線條對齊的,下線從線下垂。在標籤的情況下,底線是下行線的下端。