2009-08-30 7 views
14

私は内部の文字列の長さに応じて高さを変更する必要があるいくつかのUITableViewCellを持っています。私はtableView:cellForRowAtIndexPath:の中で必要な高さを計算し、それを変数(self.specialRowHeight)に格納しています。そして、私が持っている:それを除いてtableViewを取得:heightForRowAtIndexPath:tableViewの後に起こる:cellForRowAtIndexPath :?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == SPECIAL_SECTION) { 
     return self.specialRowHeight; 
    } 
    else { 
     return 44; 
    } 
} 

tableView:cellForRowAtIndexPath:少し前に呼び出さなっているように見えるので、それは常にゼロです。

これを回避する方法はありますか、それとも別の方法ですか?

ありがとうございます!

答えて

11

ゴナはここに自分の質問に答える:

もともと私は高さの計算がtableView:cellForRowAtIndexPath:法に縛られたことをかなり確信していた、と他の場所に移動することができませんでした。しかし、たくさんのリストラをして、私はそこから、そしてすべてを解決するtableView:heightForRowAtIndexPath:にそのものを取り込めました。

自動高さ調整細胞が仕事を得るためにしようとしている他の誰のために、ここに役立つかもしれないいくつかのコードがあります:

// Inside tableView:cellForRowAtIndexPath: 
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
cell.textLabel.numberOfLines = self.numberOfTextRows; 
// numberOfTextRows is an integer, declared in the class 

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

    CGSize theSize = [theObject.theStringToDisplay sizeWithFont:[UIFont systemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, 9999.0f) lineBreakMode:UILineBreakModeWordWrap]; 
    // This gets the size of the rectangle needed to draw a multi-line string 
    self.numberOfTextRows = round(theSize.height/18); 
    // 18 is the size of the font used in the text label 
    // This will give us the number of lines in the multi-line string 

    if ((indexPath.section == FIXED_HEIGHT_SECTION) || (self.numberOfTextRows < 2)) { 
     return 44; 
     // 44 is the default row height; use it for empty or one-line cells (or in other table sections) 
    } else { 
     return theSize.height + 16; 
     // 16 seems to provide a decent space above/below; tweak to taste 
    } 
} 

あなたは適切なセルの高さを計算するためのより正確な方法を考えることができれば、私はすべての耳です。 :)

+0

を以下のようtableView:heightForRowAtIndexPath:の実装内部tableView:cellForRowAtIndexPath:を呼び出すことでしたあなたは矩形の高さを18で割り、それを再び掛けますが、それ以外は同じようにします。 –

+0

さて、最初の部門は、必要な行の数を調べることで、 'cell.textLabel.numberOfLines'を正しく設定できます。それを設定しなければ、すべてが1行に印刷されます。しかし、ええ、私はちょうど 'self.numberOfTextRows'の代わりに最後のビットで' theSize.height'を使うことができたと思います。 – Triz

+0

明快さと簡略化のために答えを編集しました。本当にうまくいきます。 – Triz

0

self.numberOfLinesを0に設定すると、同じことができます。 (numberOfLinesが0に設定されている場合は必要とされて、ラベルは、多くの行を使用しています。)

+0

Um ... numberOfTextRowsはカスタムクラスのプロパティなので、それ以外のことはしません。あなたはcell.textLabel.numberOfLinesを考えていますか? – Triz

+0

とにかく、 'cell.textLabel.numberOfLines'を' 0'に設定することはできますが、実際に使用される数字を見つけることはまだ有効です(例えば、ここでのように適切な行の高さを計算するために) 。また、 "0"は意味論的に一目瞭然ではないので、結果のコードははるかに明確になります。 – Triz

-7

私のソリューションは、私がなぜ本当にわからないんだけど

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

    [self tableView:aTableView cellForRowAtIndexPath:indexPath]; 
    return headerHeight; 
} 
+3

tableView:heightForRowAtIndexPath: 'は、tableViewのすべての(!)単一行に対して呼び出されます。このため、 'tableView:cellForRowAtIndexPath:'のような高価な呼び出しは使用しないでください。 –

+0

ラベルがこの唯一の内容ではない場合でも、この方法で投票が行われた理由が分かりません。セルの実際の高さに対してテストできます。しかし、これは非常に高価です。 – Kyle

関連する問題