2011-08-19 15 views
9

私はiosの開発でこれは新しいです、これはこれまで私の問題です。私は、デリゲート "heightForRowAtIndexPath"を介してカスタムセルの高さを動的に計算することができます。最初のロードでは、すべてのものが完璧に表示されます。IOS:カスタムuitableviewcellを持つ動的な高さ

私の問題は、スクロールを開始するとすぐにすべてが壊れてしまいます。私は、 "heightForRowAtIndexPath"のスクロールは、画面上に表示されるセルごとに呼び出されなくなるため、新しいセルの高さを計算することはできないと考えています。

私はしばらくここにこだわってきました。あなたの誰かが私に手を貸すことができるかどうか疑問に思っていました。前もって感謝します。

コードを関連ファイルに掲載します。これらのファイルには、カスタムセルhおよびmファイルが含まれています。ビュー・コントローラーmファイルの関連する機能

// ###################################################### 
// HelpTableViewCell.h 
#import <UIKit/UIKit.h> 

@interface HelpTableViewCell : UITableViewCell { 
    IBOutlet UILabel *labelName; 
    IBOutlet UILabel *labelDescription; 

    IBOutlet UIView *viewBackground; 
} 

@property (nonatomic, retain) UILabel *labelName; 
@property (nonatomic, retain) UILabel *labelDescription; 

@property (nonatomic, retain) UIView *viewBackground; 

@end 

// ###################################################### 
// HelpTableViewCell.m 
#import "HelpTableViewCell.h" 

@implementation HelpTableViewCell 

@synthesize labelName; 
@synthesize labelDescription; 

@synthesize viewBackground; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (self) { 
    } 

    return self; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    self.labelName.lineBreakMode = UILineBreakModeWordWrap; 
    self.labelName.numberOfLines = 0; 
    self.labelName.font = [UIFont boldSystemFontOfSize:15]; 
    [self.labelName sizeToFit]; 

    self.labelDescription.lineBreakMode = UILineBreakModeWordWrap; 
    self.labelDescription.numberOfLines = 0; 
    self.labelDescription.font = [UIFont fontWithName:@"Arial" size:15]; 
    [self.labelDescription sizeToFit]; 

    [super setSelected:selected animated:animated]; 
} 

- (void) dealloc { 
    [labelName release], labelName = nil; 
    [labelDescription release], labelDescription = nil; 

    [super dealloc]; 
} 

@end 


// ###################################################### 
// in my view controller m file 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"HelpTableViewCell"; 
    HelpTableViewCell *cell = (HelpTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

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

    for (id currentObject in topLevelObjects) { 
     if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
     cell = (HelpTableViewCell *) currentObject; 
     break; 
     } 
    } 

    } 

    cell.labelName.text = [self.instructionName objectAtIndex:indexPath.row]; 
    cell.labelDescription.text = [self.instructionDescription objectAtIndex:indexPath.row]; 

    return cell; 
} 

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *cellText = [self.instructionDescription objectAtIndex:indexPath.row]; 
    UIFont *cellFont = [UIFont fontWithName:@"Arial" size:15]; 
    CGSize constraintSize = CGSizeMake(320.0f, MAXFLOAT); 
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 

    return labelSize.height + 25; 
} 

答えて

4

セル内のテキストを変更しようとしている場合はそれがないとき、あなたはあなたのtableViewにコールreloadDataにする必要があります、それ以外の場合はのtableView:heightForRowAtIndexPathは:呼び出されません。

テーブルビューの仕組みは、すべてのリロード(およびリロードバリアント)ですべての行の高さを収集することです。これは、iOSがテーブル全体の高さを知る方法です。 tableView:heightForRowAtIndexPath:個々のセルをつかむときに再び呼び出します。通常、をreloadDataと呼ぶのはかなり速いです。この方法は、その変形と異なり、スクロールが発生しません。

有用な背景については、stackoverflow question and answerを参照してください。

高さを計算するために多くの作業が必要で、数百または数千の行がある場合は、問題が発生します。私がこれを持っているユースケースでは、適切なパフォーマンスを得るために行の高さの計算をキャッシュします。しかし、それがあなたの場合ではない場合、reloadDataでもう少しリベラルであることができます。

3

テキストに合わせてセルの高さを適切に調整するために必要な高さを決定するプロセスを順を追って説明します。

チュートリアルでは、ここに提供されています:http://www.raddonline.com/blogs/geek-journal/iphone-sdk-resizing-a-uitableviewcell-to-hold-variable-amounts-of-text/

私はチュートリアル自分自身のメソッドをしようとしていませんが、それはかなり徹底的になりそうです。

希望すると便利です。

1

あなたtableView:heightForRowAtIndexPath:は正しいようだが、あなたはあなたのXIBファイルでlabelDescriptionセルのラベルについては、以下をチェックすることをお勧めします:

  • tableView:heightForRowAtIndexPath:方法で使用される幅と一致する必要があります(あなたのケースでは、320)
  • (あなたのケース「ゴシック」サイズ15で)tableView:heightForRowAtIndexPath:方法で使用されるフォントとサイズに一致しなければなりませんNO
  • にラベルの「フィットするように調整」チェックボックスを設定
  • こと(0にラインプロパティの#を設定道それはあなたがスクロールした後tableView:heightForRowAtIndexPath:メソッドが呼び出されない疑いがある場合、あなたは簡単にその方法では、一時的なNSLogステートメントを追加することによって、そのことを確認することができます

)テキストは複数行にまたがることができます。決して呼び出されない場合は、UITableViewUITableViewDelegate代理人としてビューコントローラを設定するのを忘れているかもしれません。

関連する問題