2013-04-16 12 views
15

我在我的UITableView面臨一個非常奇怪的問題。 我有一些不同的單元格,我想在新聞推送式表格視圖上顯示。UITableViewCellContentView高度如何可能不同於heightForRowAtIndexPath:

我在重用後遇到單元問題。 單元格包含兩個圖像,兩個標籤和一個帶有share/like/comment按鈕的視圖。 我嘗試要畫它,但我不知道這會是相當:

------------------------------------------------- 
|  | __ ____________________________ | 
|  | |_2| |       | | 
|  |  |    3    | | 
|  |  |       | | 
| 1 |  |____________________________| | 
|  |          | 
|  |_______________________________________| 
|  |          | 
|  |     4     | 
|_______|_______________________________________| 
|            | 
|      5      | 
|_______________________________________________| 

1 : objectImage 
2 : subjectImage 
3 : titleLabel 
4 : commentLabel 
5 : actionsView 

我的約束是:

"H:|-0-[objectImage(60)]-7-[subjectImage(30)]-7-[titleLabel]-7-|" 
"H:|-0-[objectImage(60)]-0-[commentLabel]-0-|" 
"H:|-0-[actionsView]-0-|" 
"V:|-0-[objectImage(>=35)]-0-[actionsView(44)]-0-|" 
"V:|-7-[subjectImage(30)]" 
"V:|-7-[titleLabel(>=46)]-7-[commentLabel(>=35)]-0-[actionsView(44)]-0-|" 

而且每個細胞繪製的時候,我改變這個約束:

"V:[commentLabel(%0.2f)]" 

細胞第一次顯示完美。

但是,我遇到的問題是,在一些重用(我無法每次重現它)之後,應用程序因爲約束問題而崩潰。 這裏是例外:

"<NSLayoutConstraint:0x205a75b0 V:[UILabel:0x1ef31430(105)]>", 
"<NSLayoutConstraint:0x1ef34440 V:[UILabel:0x1ef31430]-(0)-[UIView:0x1ef2fe50]>", 
"<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]>", 
"<NSLayoutConstraint:0x1ef33900 V:|-(7)-[UILabel:0x1ef31250] (Names: '|':UITableViewCellContentView:0x1ef2bf50)>", 
"<NSLayoutConstraint:0x1ef34340 V:[UILabel:0x1ef31250(>=46)]>", 
"<NSLayoutConstraint:0x1efV:[UIView:0x1ef2fe50]-(0)-| (Names: '|':UITableViewCellContentView:0x1ef2bf50)>", 
"<NSLayoutConstraint:0x1ef331d0 V:[UIView:0x1ef2fe50(44)]>", 
"<NSAutoresizingMaskLayoutConstraint:0x1ef36f90 h=--& v=--& V:[UITableViewCellContentView:0x1ef2bf50(147)]>" 


Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x1ef34380 V:[UILabel:0x1ef31250]-(7)-[UILabel:0x1ef31430]> 

的問題是,該約束[UITableViewCellContentView:0x1ef2bf50(147)]是不正確的。

是什麼奇怪的是,heightForRowAtIndexPath:返回正確的值是217

什麼我不明白的是,的UITableViewCell的高度是正確的!

(lldb) po 0x1ef2bf50 
$0 = 519225168 <UITableViewCellContentView: 0x1ef2bf50; frame = (0 0; 320 147); gestureRecognizers = <NSArray: 0x1ef30a20>; layer = <CALayer: 0x1ef2a3d0>> 
(lldb) po [0x1ef2bf50 superview] 
$1 = 0x1ef30e40 <NewsSubjectCommentCell: 0x1ef30e40; baseClass = UITableViewCell; frame = (0 1055; 320 217); hidden = YES; autoresize = W; layer = <CALayer: 0x1ef25e10>> 

所以我不明白這怎麼可能是UITableViewCellContentView的高度限制爲147,是同類型的另一小區的高度,但它應改爲209,對不對?因此,如果你對這種情況如何發生有所瞭解(也許我做錯了什麼),我會很高興。

感謝,

+0

你找到一個解決方案?我有完全相同的問題。 –

+0

否,我使用的(差)的解決方案是在heightForRowAtIndexPath 1添加到細胞高度:功能 –

+0

http://stackoverflow.com/questions/12610783/auto-layout-still-required-after-executing-layoutsubviews- with-uitableviewcel/39136021#39136021 – qingqinghebiancao

回答

2

您必須關閉包含您的約束,如果你的代碼或視覺語言添加約束的觀點在自動轉換:

[self.someView setTranslatesAutoresizingMaskIntoConstraints:NO]; 

這可以防止[UITableViewCellContentView:0x1ef2bf50(147)]約束正在創建。

+0

包含我的約束的視圖是我自定義的UITableViewCell。我已經嘗試了你的建議,但是當我這樣做時,我有錯誤「聲明失敗 - [NewsSubjectCommentCell layoutSublayersOfLayer:],/ SourceCache /UIKit_Sim/UIKit-2380.17/UIView.m:5776」。順便說一句,如果任何人都可以告訴我如何得到斷言信息(以便我知道在哪裏調試),我很喜歡它。我一直在尋找幾個月...... –

+1

嘗試在您的UITableViewCell的超級視圖上調用此方法。也許最好在單獨的問題中詢問斷言失敗/消息,以保持這種清潔。 – Whakkee

+0

你不能。你必須做到這一點swizzle禁用將自動調整大小的掩碼轉換爲表視圖單元格的約束:http://stackoverflow.com/a/12941256/180445這將解決斷言失敗。這是我對OP的最終解決方案。 –

7

您可以嘗試以較低優先級(例如@ 900)設置(/某些)高度。我有一個類似的問題(我的UITableViewCellContentView太小,約束無法滿足)。在降低了我的「錯誤」高度的優先級後,它很好地佈置在預期的高度上。

+2

這對我有用。更改邊界,或設置UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth沒有。 – giampaolo

+0

這也適用於我。我添加了一個高度限制並將其設置爲900,並且瞧。 –

0

在cellForRowAtIndexPath中,您從tableview中請求一個單元格。您獲得的單元格可能是新創建的單元格(大小爲320,44),也可能是已經出隊併發送了prepareForReuse消息的單元格(具有以前的以前的任何大小)。當您將代碼NSLayoutConstraints應用於contentView時,它們在之前被解析爲,該單元格自身適應所提供的tableview空間。這是沒有道理的,但絕對是我的觀察結論。

所以,在我的情況下,我獲得新的細胞44的高度,但我的制約因素之一是爲48.一個固定的高度這是不斷拋出異常,使調試痛苦。我所做的一切,使異常消失是對小區的幀設置爲正確的高度(和寬度我想,如果你是在水平維度上遇到的問題),當我在準備的cellForRowAtIndexPath它。

UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; 
if(cell==nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
// If the cell is new its frame will be (0,0,320,44) 
cell.frame = CGRectMake(0,0,tableview.frame.size.width,calculatedHeightRequiredForLayout); 
[cell.contentView addConstraints:constraints]; 

細胞將自動調整到正確的尺寸會顯示在tableview中,因此,您不會造成任何問題,但您的佈局限制將不「需要被打破」由iOS的應用.. 。

15

我在這裏找到了答案:Auto layout constraints issue on iOS7 in UITableViewCell

我們只需要對內容查看的AutoresizingMask設置爲UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth和...問題解決了!

+2

嘗試按照此處的說明操作時,出現「無法同時滿足約束」警告:http://stackoverflow.com/a/18746930/528620。設置'[self.contentView setAutoresizingMask:UIViewAutoresizingFlexibleHeight]'修復了它。謝謝! – ninjudd

+0

謝謝!你是個救世主。 「我無法同時滿足約束條件」,我正在瘋狂。 – lm2s

相關問題