Özel bir hücre olmadan bir UITableViewCell'de metni nasıl sararım


151

Bu iPhone 0S 2.0'da. Tablolar ile ilgili herhangi bir farkın farkında olmasam da, 2.1 için cevaplar da gayet iyi.

Varsayılan olarak UITableViewCellbir a içerdiğinden , özel bir hücre oluşturmadan metni sarmanın mümkün olması gerekir UILabel. Özel bir hücre oluşturursam çalıştırabileceğimi biliyorum, ancak elde etmeye çalıştığım şey bu değil - Mevcut yaklaşımımın neden işe yaramadığını anlamak istiyorum.

Etiket talep üzerine oluşturulduğunu anladım (çünkü hücre metin ve görüntü erişimini destekliyor, bu yüzden gerekli olana kadar veri görünümünü oluşturmuyor), eğer böyle bir şey yaparsam:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

sonra geçerli bir etiket almak, ama numberOfLinesbu (ve lineBreakMode) ayar çalışmıyor - Hala tek satır metin olsun. UILabelMetnin görüntülenmesi için bol miktarda yükseklik var - sadece yükseklik için büyük bir değer döndürüyorum heightForRowAtIndexPath.

Yanıtlar:


277

İşte daha basit bir yol ve benim için çalışıyor:

İşinizin içinde cellForRowAtIndexPath:. Hücrenizi ilk oluşturduğunuzda:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

Etiket için satır sayısını 0 olarak ayarladığımı fark edeceksiniz. Bu, gerektiği kadar satır kullanmasını sağlar.

Bir sonraki bölüm, ne kadar büyük UITableViewCellolacağınızı belirtmektir , bunu heightForRowAtIndexPathişlevinizde de yapın:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

Geri döndüğüm hücre yüksekliğine 20 ekledim çünkü metnimin etrafında küçük bir arabellek seviyorum.


17
Cell.textLabel.numberOfLines öğenizi keyfi olarak yüksek bir sayıya ayarlamanız gerekmez. 0 olarak ayarlamak, "görüntülemek için gereken sayıda satır" anlamına gelir.
mmc

Teşekkürler, bu gece kendi projemde doğrulama şansı elde ettikten sonra yazımı düzenleyeceğim.
Tim Rupe

1
Satır sayısının 0 olarak ayarlanması iyi çalışıyor (görüntülenmesi için gereken sayıda satır)
prakash

1
cagreen: Görünüşe göre bunu çoğaltabilirim, ancak sadece simülatörde iPhone OS 3.0 kullanırsam. 3.1+ kullandığımda, detailTextLabel yeniden boyutlandırma sizeWithFont ile gayet iyi eşleşir. Tim'in yöntemi gerçekten iyi çalışıyor - sadece 3.1+ için (3.0 varsayılan hücre oluşturma işlemindeki bir hata / yanlışlık nedeniyle). Kayıt için, 12 (her biri) dikey üst / alt kenar boşluğu, (188.0, CGFLOAT_MAX) bir detay metin etiketi boyutu ve bir kalınSystemFontOfSize 15 kullanıyorum.
Joe D'Andrea

17
UILineBreakModeWordWrap iOS 6'da kullanımdan kaldırılmıştır. Bunun yerine NSLineBreakByWordWrapping kullanın.
Ethan Allen

16

Tim Rupe'nin iOS7 için cevabı güncellendi:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:cellText
            attributes:@
            {
                NSFontAttributeName: cellFont
            }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 20;
}

3

Aynı sorun yaşadığım zaman deneyimimi kaydetmek için kısa bir yorum / cevap. Kod örneklerini kullanmasına rağmen, tablo görünümü hücre yüksekliği ayarlanıyordu, ancak hücrenin içindeki etiket hala doğru ayarlanmıyordu - çözüm, daha sonra gerçekleşen özel bir NIB dosyasından hücrem yüklediğiydi ayarlanan hücre yüksekliğinden .

Ve metin kaydırmak için ayarlarım NIB dosyası vardı ve etiket için sadece 1 satır var; NIB dosya ayarları kodun içinde yaptığım ayarları geçersiz kılıyordu.

Aldığım ders, zamanın her noktasında nesnelerin durumunun her zaman akılda tutulduğundan emin olmaktı - henüz yaratılmamış olabilirler! ... hatta birileri.


2

UITableViewHücreye yalnızca metin ekleyeceksek , çalışmak için yalnızca iki temsilciye ihtiyacımız var (ekstra eklemeye gerek yok)UILabels )

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Bu çözüm benim için çalıştı: -

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;

    [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    cell.textLabel.text = [mutArr objectAtIndex:indexPath.section];
    NSLog(@"%@",cell.textLabel.text);

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    CGSize labelSize = CGSizeMake(200.0, 20.0);

    NSString *strTemp = [mutArr objectAtIndex:indexPath.section];

    if ([strTemp length] > 0)
        labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap];

    return (labelSize.height + 10);
}

İşte dize mutArr ben verilerimi alıyorum mutable bir dizidir.

EDIT: - İşte aldığım dizi.

mutArr= [[NSMutableArray alloc] init];

[mutArr addObject:@"HEMAN"];
[mutArr addObject:@"SUPERMAN"];
[mutArr addObject:@"Is SUPERMAN powerful than HEMAN"];
[mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"];
[mutArr addObject:@"Where are BATMAN and SPIDERMAN"];

2

Artık tablo görüntülerinde kendi boyutlarını belirleyen hücreler olabilir. Tablo görünümünü aşağıdaki gibi ayarlayın

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

Apple Referansı


0

Aşağıdaki çözümleri kullanıyorum.

Veriler bir üyede ayrı olarak sağlanır:

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

Elleçleme kolayca yapılabilir cellForRowAtIndexPath. Hücreyi tanımlayın / yazı tipini tanımlayın ve bu değerleri sonuca "cell" a atayın. numberoflines"0" olarak ayarlandığını unutmayın , bu da gerekli olanı almanız anlamına gelir.

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

    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    cell.textLabel.text= [self getRowData:indexPath.section];
    cell.textLabel.font = cellFont;
    cell.textLabel.numberOfLines=0;
    return cell;
}

Burada heightForRowAtIndexPath, kaydırılan metnin yüksekliklerini hesaplıyorum. Gövde boyutu hücrenizin genişliği ile ilgili olmalıdır. İPad için bu 1024 olacaktır. İPhone ve iPod 320 için.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX);
    CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap];
    return requiredSize.height;    
}

0

Bunu oldukça basit ve düz buldum

[self.tableView setRowHeight:whatEvereight.0f];

örneğin:

[self.tableView setRowHeight:80.0f];

Bu, bunu yapmak için en iyi / standart yaklaşım olabilir veya olmayabilir, ancak benim durumumda işe yaradı.


Anladığım kadarıyla, rowHeight özelliği tablo görünümündeki tüm hücreler için kullanılacak sabit bir yükseklik ayarlar. Büyük tablolarda performans için rowHeight kullanmak daha iyidir, ancak her hücrenin yüksekliğinin içeriğine göre değişmesi gerekiyorsa tableView: heightForRowAtIndexPath: yönteminin kullanılması gerekir.
jk7

0

Hızlı bir şekilde kodumu deneyin. Bu kod normal UILabel'ler için de çalışır.

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Şimdi şöyle deyin

cell.textLabel.lblFunction()//Replace your label name 

-1

Bunun daha iyi ve daha kısa bir çözüm olduğunu düşünüyorum. Yükseklik için otomatik olarak hesaplamak üzere hücrenin UILabel( textLabel) değerini belirterek biçimlendirin sizeToFitve her şey iyi olmalıdır.

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = @"Whatever text you want to put here is ok";
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    [cell.textLabel sizeToFit];

    return cell;
}

-2

Bunu yapmak için UITableViewCell'sözel bir üssü manipüle edebileceğinizi sanmıyorum UILabel. UILabelHücreye kendiniz yenisini ekleyebilir ve uygun şekilde boyutlandırmak için numberOfLinesile kullanabilirsiniz sizeToFit. Gibi bir şey:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.