2015-06-18 67 views
0

似乎不可能讓UILabel堅持以我想要的方式約束一致。前導空間和尾隨空間約束似乎有效,但標籤只是截斷線條而不是擴展到新線條。UILabel沒有可靠包裝

please stop truncating

我確實有UILabel集的numberOfLines爲0。我也曾嘗試建議這裏列出:UILabel not wrapping text correctly sometimes (auto layout),它似乎並不可靠地工作。我嘗試的最後一件事是將setContentCompressionResistancePriority屬性設置爲FittedLow,但它不能同時用於UITableView中的所有內容。事實上,根據tableview是否刷新,看起來所有的包裝都可以被取消。

我試過的唯一辦法似乎很好,就是將UILabel的preferredMaxLayoutWidth設置爲常量。我只是希望將它作爲避免計算標籤在運行時應該有多寬的最後手段。當然,有一種方法可以獲得我想要的東西。

+0

已經給出了最好的高度?或在運行時計算高度? –

+0

嘿,你提供了固定的高度和寬度約束 – morroko

+1

它取決於'UILabel'實例和字體的高度,可能標籤會一致地包裝文本(最終它是一個精確計算的值而不是戲劇女王),所以,在你的情況下,當邊緣發生輕微變化會影響最終結果(自動佈局工作漂浮而非整體!)時,可能會出現這種情況,因此,可能需要稍微更改佈局(例如,增加高度1點,或者將字體大小減少5%等等),從這種不平衡的情況推開UILabel。 – holex

回答

0

的關鍵在於得到它才能正常工作是要求視圖重置佈局後,已被應用和限制所有文本已被設置。我只是添加了這行我的自定義UITableViewCell我已經建立,它需要的數據後:

//set data 
    //set constraints 

    ... 

    contentView.setNeedsLayout() 
    contentView.layoutIfNeeded() 
} 

我意識到這是解決方案,因爲該視圖保持受着自己的約束條件之後,報告他們的初始幀的大小,而不是大小的。出於某種原因,所有其他意見看起來都正確,但不是UILabels

我找到了答案的解決方案張貼在這裏:https://stackoverflow.com/a/13542580/1637033

+0

但是這不應該需要在iOS 8中,只要UILabel的文本發生變化,它會自動佈局__。 – matt

0

可以計算的的UILabel運行的高度按內容

func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat 
    { 
     let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) 
     label.numberOfLines = 0 
     label.lineBreakMode = NSLineBreakMode.ByWordWrapping 
     label.font = font 
     label.text = text 

     label.sizeToFit() 
     return label.frame.height 

    } 
+0

這似乎真的很密集,不是嗎? – mango

+0

@mango這是我可以看到根據內容計算動態高度的唯一選項。否則,請從故事板明確提供最大高度 –

+0

我在此處未使用故事板。但我會盡量指定最大高度,正如您在我有機會時所建議的那樣。 – mango