2011-09-07 8 views
1

グループ化されたテーブルビューでiPhoneアプリのUITableViewCellをカスタマイズしようとしています。私がしたいのは、イメージの幅がパディング(マイナス)(280)とイメージのサイズに基づく高さの変数を取ることです。カスタムUITableViewCellのサイズ変更と画像サイズに基づくUIImageViewの設定

現在、SDWebImageを使用してリモート画像を非同期にダウンロードしています。この場合、これは正しいことではないかもしれません。また、初期化時にカスタムセルにイメージを与える方法を理解するのに問題があります。イメージURLはDetailViewControllerのself.beerPhotoに格納されます。

私はこれをいくつかの方法で検索しましたが、私が探しているものを正確に見つけられませんでした。一番近いのはHow to scale a UIImageView proportionallyでしたが、このコードは動作させようとしましたが、初期化後にイメージを設定すると空白のセルが残っていたため、このメソッドは初期化時にイメージを持つ必要がありました。

現在のコードには、縦方向の画像を近似するように設定された定数が含まれています。実際には、画像の一部は肖像画であり、一部は風景の向きです。

知りたいことがあれば教えてください。カスタムUITableViewCellのため

ヘッダ:カスタムUITableViewCellの

#import "BeerDetailHead.h" 


@implementation BeerDetailHead 

@synthesize beerName, beerImage; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 
     //beerName = [[UILabel alloc]init]; 
     //beerName.textAlignment = UITextAlignmentLeft; 
     //beerName.font = [UIFont systemFontOfSize:14]; 
     beerImage = [[UIImageView alloc]init]; 
     //[self.contentView addSubview:beerName]; 
     [self.contentView addSubview:beerImage]; 
    } 
    return self; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 
    CGRect contentRect = self.contentView.bounds; 
    CGFloat boundsX = contentRect.origin.x; 
    CGRect frame; 
    frame= CGRectMake(boundsX+10 ,10, 280, 375); 
    beerImage.frame = frame; 
} 

DetailViewControllerのcellForRowAtIndexPathのための実装の

#import <UIKit/UIKit.h> 


@interface BeerDetailHead : UITableViewCell { 
    UILabel *beerName; 
    UIImageView *beerImage; 
} 

@property(nonatomic, retain)UILabel *beerName; 
@property(nonatomic, retain)UIImageView *beerImage; 

@end 

関連部分tableView:heightForRowAtIndexPath:デリゲートメソッドを実装し、ための計算高さを返し

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

    NSArray *listData =[self.tableContents objectForKey: 
         [self.sortedKeys objectAtIndex:[indexPath section]]]; 

    NSLog(@"listData = %@", listData); 

    NSUInteger row = [indexPath row]; 

    if ([self.sortedKeys objectAtIndex:[indexPath section]] == @"header"){ 
     static NSString *headerTableIdentifier = @"HeaderTableIdentifier"; 
     BeerDetailHead * headerCell = (BeerDetailHead*)[tableView 
                 dequeueReusableCellWithIdentifier: headerTableIdentifier]; 

     if(headerCell == nil) { 

      headerCell = [[[BeerDetailHead alloc] initWithFrame:CGRectZero reuseIdentifier:headerTableIdentifier] autorelease];     
     } 

     headerCell.beerName.text = [listData objectAtIndex:row]; 
     [headerCell.beerImage setImageWithURL:[NSURL URLWithString:self.beerPhoto] 
         placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; 
     //NSLog(@"frame = %@", headerCell.beerImage.frame); 

     return headerCell; 
    } 
    else{ 
     //use standard UITableViewCell 
    } 
} 

答えて

1

このメソッドの各行あなたのtableView上の各画像コールreloadDataをロードした後
OR変更をアニメーション化したい場合は、呼び出し:

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

また、あなたは一つに、いくつかのシーケンスの高さの更新を組み合わせることもできます。私はこれを行うために私は少し遅れを使用します:

// triggerUpdates calls the above code 
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(triggerUpdates) object:nil]; 
[self performSelector:@selector(triggerUpdates) withObject:nil afterDelay:0.1]; 
+0

私はtableView:heightForRowAtIndexPathを定数で実装しました。それをここにリストするのを忘れた。現時点では、カスタムUITableViewCellは、イメージの幅、高さ、および一定のサイズ変更された幅280を使用して、UIImageViewフレームの正しい高さを計算します。viewDidAppearでreloadDataを呼び出すと、正しいイメージが得られます。ただし、heightForRowAtIndexPathは、イメージの高さが正しくなる前に計算されます。まだ高さのための適切な解決策を探しています。 – scottoliver

+0

ちょっと好奇心が強いのはなぜですか?何か特別な理由はありますか? – fatih