2013-04-16 14 views
15

私のUITableViewで本当に奇妙な問題に直面しています。 私はニュースフィードのようなテーブルビューに表示したいいくつかの異なるセルを持っています。どのようにUITableViewCellContentViewの高さがheightForRowAtIndexPathと異なる可能性がありますか:

そして再使用後に細胞に問題があります。 セルには2つのイメージ、2つのラベル、共有/お気に入り/コメントボタンを含むビューが含まれています。 私はそれを描画するつもりしようとしていますが、私はそれがつもりかなりになるのか分からない:

------------------------------------------------- 
|  | __ ____________________________ | 
|  | |_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]> 

問題が制約[0x1ef2bf50(147)UITableViewCellContentView]があることです。 217

であると私は理解していないことのUITableViewCellの高さが正確であることです正しい値を返します。奇妙です何

はheightForRowAtIndexPathがということです!

(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の高さ制約が右、それは同じタイプの別のセルの高さであるが、それは209に変更する必要が147であることも可能であるかを理解していませんか?

これがどのように起こるかについての洞察があれば(多分私は間違ったことをしたかもしれません)、私はうれしいでしょう。

おかげで、

+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

できません。あなたは、テーブルビューのセル上の制約にマスクを自動サイズ変更することを無効にするために、この変更を行う必要があります:http://stackoverflow.com/a/12941256/180445これはアサーションの失敗を修正します。これはOPへの私の究極の解決策でした。 –

7

(/ some)高さを低い優先度(たとえば@ 900)に設定できます。私も同様の問題がありました(私のUITableViewCellContentViewが小さすぎて、制約を満たすことができませんでした)。私が「間違った」高さの優先順位を下げた後、それは意図した高さにうまくレイアウトされていました。

+2

これは私のために働いた。境界を変更するか、またはUIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidthを設定しませんでした。 – giampaolo

+0

これも私のために働いた。私は高さの制約を加え、それを900に設定しました。 –

0

cellForRowAtIndexPathでは、テーブルビューからセルを要求します。取得したセルは、新しく作成されたセル(サイズ320,44)またはデキューされ、prepareForReuseメッセージ(サイズが(以前は)だったもの)を送信したセルのいずれかになります。コンテンツビューにコードNSLayoutConstraintsを適用すると、の前にのセルが提供されたテーブルビュースペースに適合します。これは意味をなさないが、間違いなく私の観察の結論である。

だから、私のインスタンスで私は44の高さで新しい細胞を得ていたが、私の制約の1つは、これは常に例外をスローし、痛みをデバッグ作っていた48の固定の高さのためでした。私が例外を除外するためにしたのは、cellForRowAtIndexPathで準備していたときに、セルのフレームを正しい高さに設定することでした(そして、横の寸法に問題があると思われます)。それはあなたがすべての問題を起こさないように、テーブルビューで表示しますが、あなたのレイアウト制約がiOS版で「破られるために必要」なしで適用される前に

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]; 

セルは自動的に正しい寸法に自分自身のサイズを変更します。.. 。

15

私はここで答えを見つけました:私たちはちょうどUIViewAutoresizingFlexibleHeightにcontentViewのAutoresizingMaskを設定する必要がAuto layout constraints issue on iOS7 in UITableViewCell

を| UIViewAutoresizingFlexibleWidthと...問題解決!

+2

ここに記載されている手順に従うときに、「制約を同時に満たすことができません」という警告が表示されていました:http://stackoverflow.com/a/18746930/528620 '[self.contentView setAutoresizingMask:UIViewAutoresizingFlexibleHeight]'をセットするとそれが修正されました。ありがとう! – ninjudd

+0

ありがとう!あなたは救い主です。私は「制約を同時に満たすことができません」という言葉で、ナッツをやっていました。 – lm2s

関連する問題