2009-07-15 9 views
19

UITableView を使用して作成したセルに UITableViewCellStyleSubtitleを使用しています。すべてのセルの高さを動的にラベルはUITableViewCellで整列します

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

デリゲートメソッドを使用して調整されます。

あなたは絵

注:画像を更新)で見ることができる問題のセルの先頭にtextLabelとdetailTextLabelの整列を設定する方法

http://img.skitch.com/20090715-g7srxgee2d7fhi5rab2wufrdgm.png

ありがとう

+0

あなたの字幕テキストがセルの一番下に流れているように見えますが、これは私が見ているものですか?また、これはデバイスやシミュレータだけで発生しますか? – jbrennan

+0

heightForRowAtIndexPathの実装を投稿できますか? –

+4

スクリーンショットでうまく触れる。 –

答えて

8

ここでは、セルをサブクラス化しない別の解決策があります。異なるテーブルスタイルで動作することは確かです。 (私は他のソリューションをチェックしていません)タイトルと詳細文字列は、私のUITableViewControllerヘッダーで宣言され、既に定義されています。彼らは非常に長くはありません、確かに高さ4000以内に!

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    CGRect frame = [UIScreen mainScreen].bounds; 
    CGFloat width = frame.size.width; 

    int section = indexPath.section; 
    int row = indexPath.row; 

    NSString *title_string = [title_strings_array objectAtIndex:row]; 
    NSString *detail_string = [detail_strings_array objectAtIndex:row]; 

    CGSize title_size = {0, 0}; 
    CGSize detail_size = {0, 0}; 

    if (title_string && [title_string isEqualToString:@""] == NO) { 
     title_size = [title_string sizeWithFont:[UIFont systemFontOfSize:22.0] 
           constrainedToSize:CGSizeMake(width, 4000) 
            lineBreakMode:UILineBreakModeWordWrap]; 
    } 

    if (detail_string && [title_string isEqualToString:@""] == NO) { 
     detail_size = [detail_string sizeWithFont:[UIFont systemFontOfSize:18.0] 
           constrainedToSize:CGSizeMake(width, 4000) 
            lineBreakMode:UILineBreakModeWordWrap]; 
    } 

    CGFloat title_height = title_size.height; 
    CGFloat detail_height = detail_size.height; 

    CGFloat content_size = title_height + detail_height; 

    CGFloat height; 

    switch (section) { 

     case 0: 
      height = content_size; 
      break; 

     //Just in case 
     default: 
      height = 44.0; 
      break; 

    } 

    return height; 

} 
1

あなたはあなたの細胞のサイズを設定しているしかし、あなたはNSStringののさまざまなサイジング方法でそれを行う必要があります(私は実際のUITableViewCellのサブクラスを作成し、layoutSubviewsをオーバーライドすることでそれを行うには習慣はありません)。こうすることで、セルを作成して空白を避けることができます。

36

これは私に午後の費用がかかるが、私はそれを理解したと思う。私が知る限り、これはUITableViewCellがtextLabelとdetailTextLabelをどのようにレイアウトしているかのバグです。行の高さを設定すると、2つのラベルに同じ高さが割り当てられているように見えます。つまり、detailTextLabelの余裕が増えていても、上記の動作を正確に取得できます。問題を解決するために私がした2つのことがあります。私はそれを修正するためにUITableViewCellをサブクラス化しなければならなかったが、最小限のコード量だった。

まず、各行の高さを正しく計算していることを確認します。このメソッドをテーブルビューのデリゲートに配置します。その後

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellDetailText = [[self itemForIndexPath: indexPath] detailDescription]; 
    NSString *cellText = [[self itemForIndexPath: indexPath] description]; 
    // The width subtracted from the tableView frame depends on: 
    // 40.0 for detail accessory 
    // Width of icon image 
    // Editing width 
    // I don't think you can count on the cell being properly laid out here, so you've 
    // got to hard code it based on the state of the table. 
    CGSize constraintSize = CGSizeMake(tableView.frame.size.width - 40.0 - 50.0, CGFLOAT_MAX); 
    CGSize labelSize = [cellText sizeWithFont: [self cellTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 
    CGSize detailSize = [cellDetailText sizeWithFont: [self cellDetailTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 

    CGFloat result = MAX(44.0, labelSize.height + detailSize.height + 12.0); 
    return result; 
} 

、サブクラスのUITableViewCellとlayoutSubviewsをオーバーライドします:あなた自身の持つフォントのメソッドを置き換え

#import "UITableViewCellFixed.h" 


@implementation UITableViewCellFixed 
- (void) layoutSubviews { 
    [super layoutSubviews]; 
    self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x, 
             4.0, 
             self.textLabel.frame.size.width, 
             self.textLabel.frame.size.height); 
    self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x, 
              8.0 + self.textLabel.frame.size.height, 
              self.detailTextLabel.frame.size.width, 
              self.detailTextLabel.frame.size.height); 
} 
@end 
+1

偉大な答え、完璧に働いた。 Nice touch:detailTextLabel.text == nilの場合、4.0を12.0に置き換えて、セルのdetailTextがないときにtextLabelを垂直に中心に配置します。 –

+0

それは魅力のような鍋です! – wal

+0

これは本当に便利なトリックです。ありがとう! –

-2

それはtextLabelとdetailTextLabelが自動サイズ変更マスクを使用してレイアウトされていることが判明した場合は、多分あなたが行うことができますこれは、セルを返すときです:

これがうまくいくと、セルのサブクラス化より少し簡単です。私はそれを試していない。

+0

もちろん簡単ですが、仕事をしません。 layoutSubviewsオーバーライドは正しい方法です。 – slatvick

関連する問題