2016-05-12 47 views
0

我試圖讓我的多行UILabel儘可能小與給定的最大寬度,但sizeToFit()sizeThatFits(_,_)方法沒有給出我想要的結果。如何讓UILabel更好地調整大小?

看看這個圖像: enter image description here 紅色矩形表示我通過在sizeThatFits(而高度爲最大)的寬度。顯然,正如你所看到的,這個方法實際上會返回的大小,它適合於,但它並沒有給我可能的最小尺寸,這是我想要的。

比方說,我指定max-width: 300。這個實際結果給我一個大小約。 280*50。 正如你可以在圖片中看到,文現在這樣寫的:

Here is some text that is supposed to 
align nicely 

我想實現的是:

Here is some text that is 
supposed to align nicely 

這一結果將有同樣的高度,但一個更小的寬度,如200*50 我知道這很難界定「最小尺寸可能」,因爲它可能返回此:

Here 
is 
some 
text 
that 
... 

甚至每行只有一個字母。但鑑於sizeThatFits返回這個,給定的寬度和高度,爲什麼它不會返回我想要的結果,這是相同的高度,但與較小的寬度。爲什麼不是最小的適合返回?這樣的功能是否存在?

+0

你試過label.minimumScaleFactor = 0.7或0.8嗎? –

+0

我認爲你需要設置textAlignment到中心 –

+0

@RahulVyas'MinimumScaleFactor'與此無關。不,我不希望文字對齊中心。即使我使用'textAlignment = .Center',它也會在同一個地方打斷這個句子,使得文本'很好地對齊',就可以獨立在下一行。 – Sti

回答

0

我做我自己的解決方案,它工作得很好:

private func calculateWantedSize(label:UILabel)->CGSize{ 
    var lastAcceptableWidth = label.bounds.width 
    let currentHeight = label.sizeThatFits(CGSize(width: label.bounds.width, height: CGFloat.max)).height 

    var tempHeight = currentHeight 
    while(tempHeight == currentHeight){ 
     let newWidth = lastAcceptableWidth - 1 
     tempHeight = label.sizeThatFits(CGSize(width: newWidth, height: CGFloat.max)).height 
     if tempHeight == currentHeight{ 
      lastAcceptableWidth = newWidth 
     } 
    } 
    return CGSize(width: lastAcceptableWidth, height: label.bounds.height) 
} 

在這裏,我會把我的標籤到函數首先計算標籤的當前寬度和高度,然後循環遍歷寬度-1並檢查所得高度,直到高度發生變化。當寬度太低而需要換新線時,高度會改變。當發生這種情況時,我返回最後有效寬度,這仍然需要與原始高度相同的高度。

這是適合我的問題,使用屬性文本等

當然,採用這種時候,一定調用之前做一些檢查。我不知道如果您使用此功能會發生什麼情況,當標籤有一個單詞,或一個字母,或根本沒有文字。我只測試過這種情況,我知道這個應用會發生這種情況,並且它運行良好。

0

性病,

你可以試試這個哥們:)我一直在使用它了,似乎做了很好的工作:)

CGRect rect = [yourText boundingRectWithSize:CGSizeMake(maxWidth_you_Can_afford, CGFLOAT_MAX) 
                  options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) 
                  attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:16]} 
                  context:nil]; 

執行後,矩形將具有最小寬度和高度這將需要呈現文本:)

一旦你的框架,現在你可以設置爲相同的標籤,並設置文本以及:)

我已經用它在聊天泡:)和它工作得很好:)

編碼愉快:)

+0

這對我不起作用..給我略有不同,但仍然是相同的結果。一個像素的幾個分數不同..奇怪。你確定沒有其他人在做什麼嗎? – Sti

+0

嗯,沒有其他的朋友:|我使用它的寬度約束的標籤,並根據矩形值我更新我的聊天氣泡寬度,它工作得很好。您是否將標籤的字體大小設置爲16,並將樣式設置爲系統字體?這種方法高度依賴於UIFont,如果你在標籤中提供不同的字體,並且不同的計算文本將不會被正確包裝 –

+0

@sti:出於好奇,問你爲什麼需要最小空間?通常UILabels使用強度大小,它不會獲得不必要的額外空間。我這樣做是因爲我可以讓我的聊天泡泡從一側開始,到另一側結束,不存在間隙,因此我將最大寬度指定爲屏幕寬度的70%,我可以知道你到底想要做什麼嗎? –

相關問題