2011-05-07 3 views
2

私は、テキストの長さに基づいてUITableViewで私の行の高さのサイズを変更しようとしています。私は、次のコードを持っている:UITableViewの動的行の高さをフォーマットするのに苦労しています

enter image description here

私はこれをどのように修正すればよい:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellText =[[topics objectAtIndex:indexPath.row] name]; 
    UIFont *cellFont = [UIFont fontWithName:@"ArialMT" size:17.0]; 
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); 
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 

    return labelSize.height + 20; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
     cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
     cell.textLabel.numberOfLines = 0; 
     cell.textLabel.font = [UIFont fontWithName:@"ArialMT" size:17.0]; 
    } 
} 

をしかし、それはUIImageViewとUIDetailText、下記に示すような画像を台無しに?

私が試してみた:

[cell.imageView setContentMode:UIViewContentModeScaleToFill]; 
    [cell.imageView setFrame:CGRectMake(0, 0, 16,16)]; 
    [cell.imageView setBounds:CGRectMake(0, 0, 16,16)]; 
    [cell.imageView setAutoresizingMask:UIViewAutoresizingNone]; 
    [cell.imageView setAutoresizesSubviews:NO]; 

をし、どれも私はImageViewの中に内蔵されてサイズを変更するあなたの試みを無視すると思う

+0

ここで画像を設定しますか? –

+0

cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:URL]]];私はコードにそれを示していません – adit

+0

imageViewのcontentModeを変更しますか? –

答えて

1

の代わりに他の人が示唆するようにサブクラス化すると、セルのコンテンツビューに独自のサブビューを追加することもできます。

Customizing Cellsから:

あなたは、セルが異なる コンテンツコンポーネントを持つようにし、これらの は異なる場所に配置したい、またはあなたは、セルごとに異なる行動 特性をしたい 場合は、あなたが持っている場合 2つの選択肢。サブビュー を セルオブジェクトのcontentViewプロパティに追加するか、UITableViewCellのカスタム サブクラスを作成できます。あなたは、セルのデフォルトの動作を変更する必要がない場合

  • あなたはあなたのコンテンツのレイアウトは適切な自動サイズ設定で完全に指定することができたときに、セルのコンテンツビューにサブビューを追加しなければなりません。
  • コンテンツにカスタムレイアウトコードが必要な場合、または編集モードに応じてセルのデフォルト動作を変更する必要がある場合は、カスタムサブクラスを作成する必要があります。あなたはまだtableView:heightForRowAtIndexPath:を実装する必要があり、明らかに

    #define CUSTOM_IMAGE_TAG 99 
    #define MAIN_LABEL 98 
    
    // Customize the appearance of table view cells. 
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    
        static NSString *CellIdentifier = @"Cell"; 
        UIImageView *customImageView = nil; 
        UILabel *mainLabel = nil; 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
        if (cell == nil) { 
         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
         customImageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 40.0f, 40.0f)] autorelease]; 
         customImageView.tag = CUSTOM_IMAGE_TAG; 
         [cell.contentView addSubview:customImageView]; 
    
         mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(60.0f, 10.0f, 100.0f, 21.0f)] autorelease]; 
         mainLabel.tag = MAIN_LABEL; 
         mainLabel.numberOfLines = 0; 
         [cell.contentView addSubview:mainLabel]; 
        } else { 
         customImageView = (UIImageView *)[cell.contentView viewWithTag:CUSTOM_IMAGE_TAG]; 
         mainLabel = (UILabel *)[cell.contentView viewWithTag:MAIN_LABEL]; 
        } 
    
        // Configure the cell. 
        CGRect frame = mainLabel.frame; 
        frame.size.height = ... // dynamic height 
        mainLabel.frame = frame; 
    
        return cell; 
    } 
    

は、この例を参照してください。

0

を動いていないようにみえ。 UITableViewCellをサブクラス化し、独自のカスタムUIImageViewを追加します。次に、イメージビューのすべての側面を制御することができます。

- wisenomadのソリューションは、独自のカスタムイメージビューとラベルを追加しなくても機能します。 -

また、textLabelのフレームを変更する必要があります。ここに例があります。

- (void)layoutSubviews { 
     [super layoutSubviews]; 
     float sideLength = self.frame.size.height; 
     self.imageView.frame = CGRectMake(0.0, 0.0, sideLength, sideLength); 
     CGRect textLabelFrame = self.textLabel.frame; 
     self.textLabel.frame = CGRectMake(44.0, textLabelFrame.origin.y, textLabelFrame.size.width - 44.0 + textLabelFrame.origin.x, textLabelFrame.size.height); 
    } 
+0

Iこのようなものを手に入れています。skitch.com/kuntul/r6fr8/ios-simulator – adit

+0

私の例を少し変更しました。彼に新しいコードを試してみてください。あなたの問題の原因となっているラップオーバーの見解があります。 – jaminguy

2

セルのサブビューフレームを変更する作業がUITableViewCellクラスの- (void)layoutSubviewsで行われるので、あなたはその動作を変更したい場合は、共通のUITableViewCellをサブクラス化することができ、その後のようになめらかでください:

@implementation MyTableViewCell 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    self.imageView.frame = CGRectMake(-- your own size --); 
} 

@end 
+0

あなたは私が新しいクラスを作成した後、私はUITableViewCellをサブクラス化することを意味します。サイズやすべてを設定するためにlayoutSubviewsを実装する必要がありますか? – adit

+0

それは正しいです。 textLabelのフレームも変更する必要があります。これは、大きなimageViewがまだ存在しているかのように動作します。 – jaminguy

+0

私はtextLabelの例を表示できますか?今のところ、UIImageViewの問題は修正されていますが、textlabelのレイアウトは面倒です。https://skitch.com/kuntul/r6fr8/ios-simulator – adit

関連する問題