0

我有一個包含UITextView和UIImageView的UITableViewCell。文本視圖禁用了滾動功能。 UITableViewCell確實使用自動佈局來計算其高度以適應內容。使用排除路徑時UITextView自動佈局高度

view layout screenshot

如果有比我想的文本流的圖像周圍,並使用它下面的空間太截圖更多的文本。因此我在文本視圖上使用排除路徑。排除路徑被正確設置,並且文本在圖像周圍流動。

排除路徑必須在自動佈局計算出框架後設置。由於排除路徑會阻止文本視圖上的某些視圖空間,因此包含的文本在爲文本視圖計算的高度自動佈局中不再適合

我怎樣才能使這個工作與自動佈局一起?

我試着設置排除後的路徑上設置文本視圖的高度約束:

let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat(MAXFLOAT))) 
    textView.heightAnchor.constraint(equalToConstant: size.height).isActive = true 

這並沒有幫助。我需要在UITableViewCell上調用layoutSubviews()來強制重新計算它的高度。然而,這將創建一個無限循環,因爲我在viewDidLayoutSubviews()中設置了排除路徑。

+0

UIView有一個特殊的功能來更新約束。也許嘗試像這樣覆蓋它: 'override func updateConstraints(){ super.updateConstraints() let size = textView.sizeThatFits(CGSize(width:textView.frame.size.width,height:CGFloat(MAXFLOAT))) textView.heightAnchor.constraint(equalToConstant:size.height).isActive = true }' – DisableR

回答

0

我有一個類似的問題,我無法在沒有太多過度耦合的情況下切實地訪問viewDidLayoutSubviews(),所以我感覺到你的痛苦。

假設您有視圖A並且子視圖包含UITextView。

鑑於A,重寫layoutSubviews()

override public func layoutSubviews() { 
    super.layoutSubviews() 
    // At this point, UITextView is laid out and has a valid frame. 
    // Set exclusion paths here, now that you have enough info to set coordinates. 
    super.layoutSubviews() // do it again. 
} 

這類似於用的UILabel和maxPreferredWidth先前IOS版本所採取的方法。 iOS: Multi-line UILabel in Auto Layout

警告:我不知道,在這裏設置一個約束會幫助你,作爲佈局週期真的不工作的方式,但根據本Update Constraints of Cell Subview,你也許能逃脫做layoutIfNeeded()。

相關問題