2013-11-10 18 views
6

每次我的一個自定義UITableViewCells被tableView繪製時:cellForRowAtIndexPath:控制檯吐出一堆NSLayoutConstraint不一致。我理解這些大多數:如何修復奇怪的NSLayoutConstraint錯誤,似乎不會影響自定義UITableViewCell中的佈局

Unable to simultaneously satisfy constraints. ...boring stuff.. 

"<NSLayoutConstraint:0x8b0eb60 V:|-(NSSpace(20))-[UILabel:0x8b0cb30] (Names: '|':UITableViewCellContentView:0x8bd7d40)>", 
"<NSLayoutConstraint:0x8b0db70 V:[UILabel:0x8b0cb30]-(NSSpace(8))-[UITextView:0x91dba00]>", 
"<NSLayoutConstraint:0x8b0dba0 V:[UITextView:0x91dba00]-(NSSpace(20))-| (Names: '|':UITableViewCellContentView:0x8bd7d40)>", 
"<NSLayoutConstraint:0x8b0d5a0 V:[UITextView:0x91dba00(1000)]>", 
"<NSAutoresizingMaskLayoutConstraint:0x8b00330 h=--& v=--& V:[UITableViewCellContentView:0x8bd7d40(44)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x8b0db70 V:[UILabel:0x8b0cb30]-(NSSpace(8))-[UITextView:0x91dba00]> 

或者至少我認爲我這樣做。讓我感到困惑的是,我的UITableViewCell正在工作,沒有任何約束似乎被打破。我認爲錯誤中列出的一些限制,特別是最後一個,是系統添加的限制條件。如果我不使用.xibs並且只在代碼中添加約束,這可能嗎?錯誤的最後一行特別介紹給我,因爲我爲每個代碼動態生成高度,但是我注意到了那裏的44,默認的單元格高度。

默認情況下是否添加了這些限制中的一部分,例如,當我撥打[super updateConstraints]時?我將如何着手解決這些錯誤或找出他們來自哪裏?

在附註上,我明白浸入Core Text的性能比我的UITextView + Auto Layout解決方案要好得多。目前我正在研究緩存細胞高度。但是,這些佈局錯誤是否會在滾動時造成延遲,或者僅僅是因爲我使用自動佈局來計算屏幕上出現的每個單元格高度?

我已經發布the project in which these errors are occurring on Github如果有人想下載並體驗自己的古怪。

+0

當您的UITableViewCell的高度爲44,這是它的默認高度時,這些約束不能全部滿足。您可以通過手動指定大於20 + 8 + 20 + 1000 +標籤內在尺寸高度的默認高度來消除這些錯誤。或者,如果手動計算高度後沒有看到它們,您可以忽略它們。 –

+0

順便提一下,你可能想避免在UITableViewCell中使用自動佈局,因爲它是差(滾動)滾動性能的常見原因。 –

+0

@AaronBrager我得到它的工作,但將單元格的contentView.frame.height設置爲initWithStyle中的一個大常量:prepareForReuse :.謝謝你的幫助! –

回答

2

按照Aaron的建議,我手動更改單元格的高度,當它被初始化時,這樣當Auto Layout進行計算時,約束條件可以將它調整到位。在不初始設置內容框架的情況下,默認框架是{0, 0, 320, 44}。這太小,無法滿足控制檯中顯示的限制和錯誤。

同樣,當重複使用單元格時,舊的contentView.frame(由Auto Layout計算)將繼續存在。如果使用相同數量的文本,這很好 - 但是如果新單元需要更多文本(因此需要更大的contentView.frame),我們遇到同樣的問題,contentView.frame太小,不能滿足約束條件。

所以,在我的自定義的UITableViewCell我現在手動initWithStyle:prepareForReuse:設置contentView.frame.height足夠恆定大到可以容納任意數量的文本(足夠的App.net職位和一些額外的餘量)。這可以確保Auto Layout進行計算時不會出現錯誤。

我甚至可能會考慮將此值設置得更高一些,甚至動態地設置爲適應iOS 7中的動態文本。至於滾動,看起來錯誤沒有加劇波濤洶涌的滾動,這都是因爲Auto佈局計算(我認爲)。下一步是在調用viewDidAppear:時計算單元高度...

+0

「下一步是在調用'viewDidAppear:'時計算單元高度...」...您可能需要在數據(文本)從服務器到達時計算單元高度並存儲結果。然後,當你需要顯示單元格時,你不需要做任何計算。 –

+0

我想出了一種計算單元格高度減去UITextView高度的方法,所以在heightForRowAtIndexPath中我只是計算了UITextView所需的高度。滾動是順利的,我甚至不需要實現緩存。我想過在數據到達時進行計算,但現在我沒有完成的模型對象,只是本地和隨機生成的內容。不過我會記住它的。另外,我的解決方案現在在Github上運行。 –

+0

我可以確認在initWithStyle:和prepareForReuse中設置contentView高度是一個很好的解決方案。可能希望將此答案標記爲已接受,即使這是您自己的問題的答案。 –

相關問題