2009-08-30 18 views
14

İçerideki dizelerin uzunluğuna bağlı olarak yüksekliklerini değiştirmesi gereken bazı UITableViewCells var. Gerekli yüksekliği tableView:cellForRowAtIndexPath: içinde hesaplıyorum ve daha sonra bir değişkende saklıyorum (self.specialRowHeight). Sonra var: Bunun dışındaTableView alın: heightForRowAtIndexPath: tableView sonra gerçekleşmesi için: cellForRowAtIndexPath :?

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

tableView:cellForRowAtIndexPath: bit önce denilen almak gibi görünüyor, bu yüzden her zaman sıfır var.

Bunun çevresinde bir yol var mı, belki de bunu yapmanın farklı bir yolu var mı?

Teşekkürler!

cevap

11

bize, buradaki kendi soruya cevap:

Başlangıçta yüksekliği hesaplamaları tableView:cellForRowAtIndexPath: yönteme bağlıydı ve başka yerlerdeki hareket olamazdı oldukça emin oldu. Yine de bir dizi yeniden yapılanma ile, o şeyleri oradan çıkarabildim ve her şeyi çözen tableView:heightForRowAtIndexPath:'a ulaşabildim. ,

// 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 
    } 
} 

Uygun hücre yüksekliğini hesaplamak için daha doğru bir yol düşünemiyorum yapabiliyorsanız: Otomatik yükseklik ayarlı hücreler işe almaya çalışıyor herkesten için

, burada yardımcı olabilecek bazı kod Can kulağı ile dinliyorum. :)

+0

şöyle tableView:heightForRowAtIndexPath: uygulanması içine tableView:cellForRowAtIndexPath: aramak oldu rect yüksekliğini 18 ile ayırırsınız ve tekrar çoğaltırsınız, fakat bunun dışında hemen hemen aynı şekilde yaparım. –

+0

Eh, ilk bölüm kaç satır gerekli olduğunu bulmaktır, bu yüzden 'cell.textLabel.numberOfLines 'doğru ayarlayabilirim; Bunu yapmazsam, hepsi tek bir satıra yazdırılır. Ama evet, sanırım sadece "sonucunda" theSize.height "yi kullanabilirim," self.numberOfTextRows "yerine. – Triz

+0

Netlik ve basitleştirme için cevabı düzenledik. Şimdi gerçekten iyi çalışıyor. – Triz

0

Self.numberOfLines öğesini bir kez 0'a ayarlayabilirsiniz ve aynı şekilde çalışır. (NumberOfLines 0'a ayarlanırsa gerektiği gibi daha sonra etiket sayısı kadar satır kullanır.)

+0

Um ... numberOfTextRows özel bir sınıf özelliğidir, bu yüzden söylediklerimden başka bir şey yapmayacaktır. Cell.textLabel.numberOfLines'i mi düşünüyorsunuz? – Triz

+0

Her halükarda, evet, 'cell.textLabel.numberOfLines' öğesini '0 'olarak ayarlayabilirsiniz, ancak kullanılacak gerçek sayıyı bulmak için hala yararlıdır (örneğin, uygun satır yüksekliğini hesaplamak için) . Ayrıca, ortaya çıkan kodun daha net olmasını sağlıyorum, çünkü "0" bir bakışta anlamsal olarak yararlı değil. – Triz

-7

Çözümümün neden gerçekten emin değilim

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

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

'tablo Görünümü: heightForRowAtIndexPath:' tablonuzdaki her (!) Tek sıra için çağrılır. Bu nedenle, 'tableView: cellForRowAtIndexPath: 'gibi pahalı çağrılar kullanılmamalıdır. –

+0

Etiketin tek içerik olmasa bile, bu yöntem neden oy kullandığını bilmediğinden, bu yöntem hücrenin gerçek yüksekliğine karşı test yapmanızı sağlar. Ancak bu çok pahalıdır. – Kyle