2013-02-19 18 views
19

cellForRowAtIndexPathの前にはheightForRowAtIndexPathが呼び出されているようです。私は現在cellForRowAtIndexPathを使用して各セルの高さを計算しています(変数の高さはUILabelで、その中にさまざまな量のテキストがあります)。cellForRowAtIndexPath内からheightForRowAtIndexPathを呼び出しますか?

セルの高さを正しく設定する方法は正確にはわかりませんセットは高さがそれを計算メソッドの前に呼び出されるメソッドの場合。

私はNSStringのカテゴリを作成した、と一緒に働いているUILabelの他は、UILabel右のサイズを確認します。問題をこれらのラベルを含むインスタンスのサイズが変更されていないため、ラベルは各ラベルの終わりに掛かり、そのラベルの下に重なります。

私はセルの高さをラベルの高さと余分な余白を加えたものにすることを知っていますが、ラベルの高さになる前に高さを設定する方法については困惑しています計算された。 heightForRowAtIndexPathを使わずに高さを設定することはできますか?そうでなければ、他の場所の細胞の高さを計算できますか?私は現在、それを実現するためにindexPath.rowを使用していますので、事前に行うのは難しいでしょう。あなたはheightForRowAtIndexPathにセルの高さを計算する必要が

cellForRowAtIndexPath

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath 
{ 
    FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"]; 
    if (_customCell == nil) { 
     _customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"]; 
    } 

    _customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name]; 
    _customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f]; 

    UIView *backView = [[UIView alloc] initWithFrame: CGRectZero]; 
    backView.backgroundColor = [UIColor clearColor]; 
    _customCell.backgroundView = backView; 

    _customCell.myLabel.frame = CGRectMake(5, 5, 265, 65); 

    [_customCell.myLabel sizeToFitMultipleLines]; 
    return _customCell; 
} 
+0

iOS 8以降、自動的に計算された動的行の高さを使用することもできます。 http:// stackoverflow。com/questions/18746929/use-auto-layout-in-uitableview-for-dynamic-cell-layouts-variable-row-height – Suragch

答えて

15

、あなたはラベルサイズにいくつかの制約を設定することができます

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *theText=[[_loadedNames objectAtIndex: indexPath.row] name]; 
    CGSize labelSize = [theText sizeWithFont:[UIFont fontWithName: @"FontA" size: 15.0f] constrainedToSize:kLabelFrameMaxSize]; 
    return kHeightWithoutLabel+labelSize.height; 
} 

のようなもの:ここではコードの私cellForRowAtIndexPathです設定すると、kLabelFrameMaxSize

#define kLabelFrameMaxSize CGSizeMake(265.0, 200.0) 

次に、可変ラベルの高さで一定の高さを加えて高さを返します。

はまた、一貫して、あなたの代わりにCellForRowAtIndexPathその後、最初に呼び出され、すべてのセルheightforRowAtIndexPathについて sizeToFitMultipleLines

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath 
{ 
    FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"]; 
    if (_customCell == nil) { 
     _customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"]; 
    } 

    _customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name]; 
    _customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f]; 

    UIView *backView = [[UIView alloc] initWithFrame: CGRectZero]; 
    backView.backgroundColor = [UIColor clearColor]; 
    _customCell.backgroundView = backView; 

    CGSize labelSize = [_customCell.myLabel.text sizeWithFont:_customCell.myLabel.font constrainedToSize:kLabelFrameMaxSize]; 
    _customCell.myLabel.frame = CGRectMake(5, 5, labelSize.width, labelSize.height); 

    return _customCell; 
} 
+0

パーフェクト、よろしく! :) – Luke

-1

を使用してのcellForRowAtIndexPathにフレームを設定するために、同じ方法論を使用する必要があります。したがって、まず高さを計算してから、すべてのセルのCellForRowAtIndexPathにデータを入力します。

+5

あなたはちょうど私が質問で言ったことを正確に述べました。 – Luke

1

heightForRowAtIndexPathメソッドでセルの高さを計算する必要があります。 JP Hribovsekの回答ではheightForRowAtIndexPathの実装と同じように、UILabelを使用せずに行う必要があります。

cellForRowAtIndexPathでは、サブビューのフレームを設定せず、sizeToFitMultipleLinesというラベルのメソッドを呼び出さないでください。その代わりに、layoutSubviewsメソッドをFQCustomCellに実装して、サブビューフレームがセルの可能な範囲に対して正しく設定されるようにします。この方法でテキストやフォントのサイズを気にする必要はありません。ラベルの余白が正しいことを確認してください。 heightForRowAtIndexPathメソッドでセルの高さが正しく計算されている場合、ラベルのサイズは正しくなります。

関連する問題