2014-01-14 61 views
4

我使用AutoLayout將一些標籤放置在單元格的垂直中心。文本全部大寫,但UILabel有問題,即使應用sizeToFit時,也會在文本下方留下空間,看起來很像是字母尾巴,如小寫字母y,p和q 。由於我是垂直居中,所以這會導致偏移,這意味着文本會比應該顯示的高几個像素。垂直居中對齊UILabel時忽略上升和下降?

另一個問題可能是:我可以根據字體是否包含使用上行或下行的任何字符,智能地調整其垂直中心的字體嗎?

例如,字符串「abbaba」不需要下拉字符串,而字符串「oyyoyo」不需要上行字符。全部大寫的字符串也永遠不需要下行字符串。如果我垂直居中「oyyoyoyo」,它會顯得太低。

enter image description here

回答

3

感謝,Abhinit,你的答案。

我也在尋找這個,所以我想在這裏發佈你需要應用的準確約束來對齊你喜歡的文本。

此圖片來自Wikipedia顯示了字體的不同大小部分。

enter image description here

所以,有許多方法來對齊取決於是否要對齊到伸高度,蓋的高度,x高度,基線或伸高度的標籤。

比方說,你在帽狀「HELLO」一個label包含文本,並要與viewAbove對準瓶蓋高度,並與viewBelow對齊基線。

你會做:

let font = label.font 
let ascenderDelta = font.ascender - font.capHeight 

LayoutHelper() 
    .addViews([ 
     "label":label, "viewAbove":viewAbove, "viewBelow":viewBelow 
    ]) 
    .withMetrics(["ascenderDelta":ascenderDelta]) 
    .addConstraints([ 

     // -- Here the constraints to align to cap height -- 
     "X:label.top == viewAbove.bottom - ascenderDelta", 
     "X:label.baseline == viewBelow.top", 

     ...other constraints... 
    ]) 

注:在例子中,我用我的實用工具類LayoutHelper,但我希望這個想法是清楚的。

關於「自動對齊」標籤:

我會考慮讓「智能」標籤,調整到適當的線取決於它是否包含伸,伸,瓶蓋等

您可以使用drawTextInRect(如here,但例如使用insets = {-ascenderDelta, 0, font.descender, 0})中的負插入來執行此操作。但是,如果你有的話,那會使任何上升/下降的作物出現。我寧願在沒有裁剪任何可能的上身的情況下對齊到大寫字母。

4

您可以使用UIFont的「大寫高度」和「X字高」特性,以獲得正確的高度,並用它來大小的UILabel。

當然,這是假設你知道字符串是小寫字母還是大寫字母。如果沒有,那麼你可以覆蓋UILabel上的setText並在函數被調用時檢查。

我也想到找深入CoreText和實施這樣的http://www.zsiegel.com/2012/10/23/Core-Text-Calculating-line-heights/

+0

不僅大寫或小寫,而且在小寫的情況下是否使用包含上部或下部的字符。重寫'setText'是一個很好的主意。麻煩的是,如果我想在「oyyyo」的情況下調整上升,我不能那樣做。如果我調整標籤的高度,那上行會保持在頂部,不是嗎? – Luke

+1

我認爲UIBaselineAdjustmentAlignBaselines可能有幫助。也就是說,這些正是我比UILabel和UIFont類更願意考慮CoreText的原因。 – Abhinit

2

我的東西有同樣的問題,並通過繼承的UILabel和改變其繪製方法解決了這個問題:

- (void)drawRect:(CGRect)rect 
{ 
    CGRect capCenteredRect = CGRectMake(rect.origin.x, (self.font.leading-self.font.capHeight)*0.5f, rect.size.width, rect.size.height); 
    [super drawTextInRect:capCenteredRect]; 
} 

在我的案例我需要居中上限,因爲UILabel的垂直居中總是有一些像素關閉。 如果需要垂直居中與伸小寫字母可以將矩形更改爲:

CGRectMake(rect.origin.x, (self.font.leading-self.font.xHeight)*0.5f+self.font.descender, rect.size.width, rect.size.height)