2012-02-10 12 views
3

私はTableViewでカスタムセルを使用しています。可変高さのカスタムセル

セルの高さは、セルのUILabelにロードされているNSStringに基づいて計算されます。 サイズは

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
{ 
NSString *text = [self getTableViewRow:tableView index:indexPath]; 

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; 

CGFloat height = MAX(size.height, 44.0f); 

return height + (CELL_CONTENT_MARGIN * 2) + 60; 

}

サイズを正しく計算が、細胞がのUITableViewにロードされたときに、行が正しい高さを有しているが、細胞が持っていない。この機能を使用して計算されます。

私は私のセル

//Com Custom Cell 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *simpleTableIdentifier = @"CustomCellIdentifier"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

if (cell == nil) 
{ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellApresentacao" owner:self options:nil]; 

    if ([nib count] > 0) 
     cell = self.tvCell;  
    else 
     NSLog(@"Falhou a carregar o xib"); 
}  

NSInteger row = [indexPath row]; 

if(self.myTableView1 == tableView) 
    labelDescricaoApresentacao.text = [listData1 objectAtIndex:row]; 
else if (self.myTableView2 == tableView) 
    labelDescricaoApresentacao.text = [listData2 objectAtIndex:row]; 
else 
    labelDescricaoApresentacao.text = [listData3 objectAtIndex:row]; 

return cell; 
} 

を作成する場所です私は

cell.frame.size.height 

を使用して、この方法では、セルの高さを変更しようとしましたが、それはまだ正しいheigthをロードdidn't。

私はcustomCellのxibで何かする必要がありますか? セルの高さを同じサイズに更新するにはどうすれば行がありますか?

答えて

4

ここで、cell.frame.size.heightを設定しましたか?私はここでそれを置くしようとして推薦する:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    cell.frame = CGRectMake(0,0,320.0f,30.0f); 
} 

この方法は、セルが表示される直前に呼び出されると、セルへの視覚的な変更を加えるのに良い場所ですされます。

+0

cell.frame.size.height = 30.0fを入力した場合など、「表現が割り当てられない」というエラーが表示されます。 – bruno

+1

cell.frame = CGRectMake(0,0、width、height) – NeverBe

+0

ああもちろん、修正のおかげで – picciano

0

正しく行の高さをheightForRowAtIndexPathに設定しても、ペン先からセルがロードされているため、セルの内容は常に固定高さになります。セルのコンテンツの高さを動的に変更するには、代わりにセルとそのサブビューをプログラミングでheightForRowAtIndexPath:に使用してheightForRowAtIndexPath:

+0

それは私が試してみようとしていた別の解決策でした... – bruno

0

で編集する必要があります。セルを正しく

セルのフレームが設定されているのはわかりませんが、tableView:cellForRowAtIndexPath:メソッドからセルを返すと設定されていると推測しています。つまり、セルが作成または再利用され、設定されています。

あなたがすべきことは、セルのsetFrame:メソッドをオーバーライドし、superを呼び出した後に、新しいサイズに合わせてサブビューフレームを変更することです。

Interface Builderのサブビューに自動サイズ変更マスクを使用して、自動的に新しいフレームに適応させることもできます。

2

NIB(またはストーリーボード)からプロトタイプセルを読み込むと、それらはUITableViewで定義されたものと同じ高さになります。

ピチアノのソリューションが私のアプリで動作していません。

は私の代わりに、このデリゲートの機能を使用し、それが動作します:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexpath{ 
     CGFloat *theCellHeight=xxx; 
     //determine here which section/row it is, and the desired height for it, put it in "theCellHeight" 
     return theCellHeight; 
} 

は、それはあなたを助けたホープは、

備考:それにもかかわらず、cellAtIndexPathため、セルの内容/参照を取得する方法はありませんようですその関数内で呼び出されたときにアプリケーションをフリーズします。ですから、プログラムで配列を作成して作成しなければならないので、NIBの有用性は低くなります。

関連する問題