2013-11-25 22 views
8

"sizeWithFont" kullanmak orada birçok çözüm ya da Buradanhesaplayın hücre yüksekliği 7

iOS 7'nin olarak kaldırılacaktır olur benzer bir şey var ben bir araya getirilebilecek bazı kod bulunmaktadır şimdiye kadar. yükseklik değiştirir, ancak hiç de doğru: Başka Örneğin

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

// Configure the cell... 
cell.textLabel.text = "The Cell's Text!"; 
cell.textLabel.numberOfLines = 0; 
[cell.textLabel setLineBreakMode:NSLineBreakByWordWrapping]; 
[cell.textLabel sizeToFit]; 

return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
{ 
CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
CGSize screenSize = screenBounds.size; 

NSAttributedString *aString = [[NSAttributedString alloc] initWithString:"The Cell's Text!"]; 
UITextView *calculationView = [[UITextView alloc] init]; 
[calculationView setAttributedText:aString]; 
CGSize size = [calculationView sizeThatFits:CGSizeMake(screenSize.width, FLT_MAX)]; 
return size.height; 
} 

, burada benzer cevabı: https://stackoverflow.com/a/9828777/693121 önce söylediğim gibi, bu kullanımdan kaldırılmış kodunu kullanır bile.

cevap

-1

Dizenizin boyutunu almak için - (CGSize)sizeWithAttributes:(NSDictionary *)attars'u kullanmalısınız.

Yani örneğin aşağıdakiler gibi metin etiketin yüksekliğini hesaplamak olacaktır:

CGSize *cellSize = [cell.textLabel.text sizeWithAttributes:@{NSFontAttributeName:[cell.textLabel.font]}]; 

veya

CGSize *rowSize = [aString sizeWithAttributes:nil]; 
Sen eskisinin yerine docs belirtilenlerin yöntemi kullanmalısınız
+3

. Apple'ın belgelerinden: "Belirtilen yazı tipiyle tek bir satırda oluşturulacaksa dizenin boyutunu döndürür." Çok satırlı bir etikete göre hücre boyunu değiştirmeye çalışıyorsanız bu kullanışlı değildir. – rdelmar

14

- sınırlayıcıRectWithSize: seçenekler: öznitelikler: bağlam :. İşte bence çalışması gereken bir örnek (zaten çok çizgili etiketlerle çalışıyor).

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSStringDrawingContext *ctx = [NSStringDrawingContext new]; 
    NSAttributedString *aString = [[NSAttributedString alloc] initWithString:@"The Cell's Text!"]; 
    UITextView *calculationView = [[UITextView alloc] init]; 
    [calculationView setAttributedText:aString]; 
    CGRect textRect = [calculationView.text boundingRectWithSize:self.view.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:calculationView.font} context:ctx]; 
     return textRect.size.height; 
    } 

Bu

metin görünümü self.view boyutu olmak istiyorum varsayar. Değilse, metin görünümünüz için initWithFrame kullanmalı ve boundingRectWithSize: parametresi için calculationViewFrame.size değerini geçirmelisiniz.

+0

Herhangi bir nedenden ötürü bu her zaman 13.8'lik bir yüksekliğe sahip mi? "AString" değişkenindeki metin miktarından bağımsız olarak. – Demasterpl

+1

@Demasterpl, üzgünüm, benim cevap yanlış seçenekler parametresini kullanılan bu NSStringDrawingUsesLineFragmentOrigin olmalıdır. Cevabımı düzelttim. yüksekliği çok sayıda bazen rağmen, hala varsayılan yüksekliğini muhafaza etmek gibi görünse de, saygın değeri dönen gibi görünüyor – rdelmar

+0

. Ayrıca, hücre özelliklerini (sizeToFit & setLineBreakMode gibi) kaldırırsam bir fark yaratmıyor gibi görünüyor. :( – Demasterpl

6

Buradaki en kolay sürümüdür, iOS 7 yapar (sadece autolayout tabanlı uitableviewcells için) tüm ağır kaldırma: autolayout kısıtları yeniden değerlendirir ve hücre için mükemmel bir yükseklik döndüren

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"Cell"]; 

    [self configureCell:cell]; 

    // edit: Need to call [cell layoutIfNeeded]; otherwise the layout changes wont be applied to the cell 

    [cell layoutIfNeeded]; 


    return [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height; 
} 

systemLayoutSizeFittingSize. Kolay değil mi?

+0

yöntem [self configureCell: cell]; ? – MiQUEL

+0

Veri nesnesine bağlı hücrenin temel kurulumu (örn., Etiketlerin ayarlanması). bununla birlikte içeriğiyle hücreyi "dolduracağız", böylece otomatik olarak gerekli yüksekliği otomatik olarak belirleyebilir – Wirsing

+1

Bunun çok verimsiz olup olmadığını merak ediyorum. –

2

Meslektaşım (ANIRUDH) ve iyi çalışıyor aldım, faydalı olabilir: Bu işe yaramaz

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

//Calculating height on base of length of text 
    UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
    NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
    initWithString:YOURSTRING //[NSString string withformat:@"\n Yourstring"] \n for: number of lines require for static label in cell 
    attributes:@ 
    { 
    NSFontAttributeName: font 
    }]; 
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){CELL_CONTENT_WIDTH, CGFLOAT_MAX} 
               options:NSStringDrawingUsesLineFragmentOrigin 
               context:nil]; 
    CGSize size = rect.size; 

    // NSString *height = [NSString stringWithFormat: @"%.2f", ceilf(size.height)+22]; 
    return (ceilf(size.height)+22)*0.6; //change 0.6 to 0.9 according to the difference in required and extra calculted height, it works for me every time 
} 
0
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *yourText = [[resultArray objectAtIndex:indexPath.row] valueForKey:@"review_text"]; 
    CGSize lblwidth = CGSizeMake(300, CGFLOAT_MAX); 
    CGSize requiredSize = [yourText sizeWithFont:[UIFont fontWithName:@"CALIBRI" size:17] constrainedToSize:lblwidth lineBreakMode:NSLineBreakByWordWrapping]; 
    int calculatedHeight = requiredSize.height+50; 
    return (float)calculatedHeight; 
}