2016-11-12 143 views
4

我已經看到涉及自動佈局的垂直調整大小的答案,但我創建的UILabel只在運行時需要。 (我可能會從零的任何地方需要很多這樣的標籤。)swift:以編程方式創建UILabel固定寬度,根據文本長度垂直調整大小

例子(忽略顏色)

  1. 短信(注意相同的寬度更長的文本):

enter image description here

  1. 更長的文本(注意與更短的文本示例相同的寬度,用於添加文本的更多行):

enter image description here

如果文本可以放在固定寬度的一行中,則標籤不需要垂直調整大小。但是如果有更多的字符,標籤應該保持垂直擴展以適應這些額外的字符。文本應該一直在線後繞行。文本應該從標籤的左上角開始。

更具體:

let marker = GMSMarker(position: myLatLng) 
// see http://stackoverflow.com/a/40211383/1168364 for imageWithView 
marker.icon = imageWithView(label) // **how do i create this label?** 
marker.map = map // map is a GMSMapView 

這些標籤都可在屏幕上的任何地方。這是一個地圖應用程序,其中每個標籤將放置在一個隨機位置。標籤的位置彼此沒有關係。

+0

可能重複[調整UILabel高度取決於文本](http://stackoverflow.com/questions/446405/adjust-uilabel-height-depending-on-the-text) – alexburtnik

+0

@alexburtnik你可以請重新考慮這個因爲不是重複的?該解決方案在這裏似乎不起作用。注意固定寬度的附加要求。也許你對下面的解決方案不起作用有一些想法。 – lf215

+0

我已收回近距離投票,但它仍然是重複的。以下解決方案假定您使用自動佈局約束。我的解決方案下面是一個替代方案,它是手動更新框架。 – alexburtnik

回答

6

有UIView的兩種有用的方法:sizeToFit()sizeThatFits(_:)

第一個調整大小,以便一個最小的尺寸,以符合子視圖的內容和第二個不改變幀可言,但回報率計算尺寸:(1)適用於所有子視圖和(2)不超過參數size

所以,你可以使用sizeThatFits你的目的:

let label = UILabel() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    label.backgroundColor = UIColor.orange 
    label.textColor = UIColor.white 
// label.text = "ultimate Frisbee" 
    label.text = "ultimate Frisbee\nin 3 minutes,\nall welcome|2" 
    label.numberOfLines = 10 
    view.addSubview(label) 

    updateLabelFrame() 
} 

func updateLabelFrame() { 
    let maxSize = CGSize(width: 150, height: 300) 
    let size = label.sizeThatFits(maxSize) 
    label.frame = CGRect(origin: CGPoint(x: 100, y: 100), size: size) 
} 

輸出:

enter image description here enter image description here

P.S.你也可以通過自動佈局約束來解決你的問題,但我並不是以編程方式使用它們的大熱門。

1

將標籤的numberOfLines屬性設置爲零,並使用約束來固定標籤的寬度(通過顯式限制寬度或將前導邊緣和尾部邊緣限制爲某些其他視圖,如標籤的超視圖)。然後標籤會自動調整爲適合文本的高度。您需要通過其頂部約束來固定一個標籤,以便視圖系統知道從哪裏開始佈局,然後將所有其他標籤的頂部限制到之前標籤的底部。這樣他們將所有的佈局相對於之前標籤的高度。

編輯迴應您的評論:

您可以通過使用widthAnchor屬性設置明確在iOS 9視圖的寬度和更高版本。您可以使用NSLayoutConstraints(以搜索爲例)在較舊的iOS版本上進行設置。

例如爲:

label.widthAnchor.constraintEqualToConstant(50.0).active = true

這將設置標籤的寬度設置爲50個點寬,但沒有解決它的高度,所以用numberOfLines = 0則標籤將垂直當您設置文本自動調整大小。

+0

我的標籤的位置彼此沒有任何關係 – lf215

+0

@ lf215那麼您只需將'numberOfLines'屬性設置爲零即可獲得動態高度(假定寬度是固定/約束的,否則它將只展示爲一個長度線) – par

+0

我用代碼更新了我的問題。我不清楚如何只按照你所說的「通過明確地限制寬度」來修正寬度。你的意思是[this](http://stackoverflow.com/a/27682006/1168364)? – lf215

相關問題