Bagaimana cara saya membungkus teks dalam UITableViewCell tanpa sel khusus


151

Ini ada di iPhone 0S 2.0. Jawaban untuk 2.1 juga baik-baik saja, meskipun saya tidak mengetahui adanya perbedaan mengenai tabel.

Rasanya seperti mungkin untuk mendapatkan teks untuk dibungkus tanpa membuat sel khusus, karena UITableViewCellmengandung secara UILabeldefault. Saya tahu saya bisa membuatnya bekerja jika saya membuat sel khusus, tapi bukan itu yang saya coba capai - Saya ingin mengerti mengapa pendekatan saya saat ini tidak berhasil.

Saya telah menemukan bahwa label dibuat sesuai permintaan (karena sel mendukung akses teks dan gambar, sehingga tidak membuat tampilan data sampai diperlukan), jadi jika saya melakukan sesuatu seperti ini:

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

kemudian saya mendapatkan label yang valid, tetapi pengaturan numberOfLinesitu (dan lineBreakMode) tidak berfungsi - saya masih mendapatkan teks baris tunggal. Ada banyak ketinggian UILabeluntuk tampilan teks - Saya hanya mengembalikan nilai besar untuk ketinggian heightForRowAtIndexPath.

Jawaban:


277

Ini cara yang lebih sederhana, dan ini berfungsi untuk saya:

Di dalam cellForRowAtIndexPath:fungsi Anda . Pertama kali Anda membuat sel:

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];
}

Anda akan melihat bahwa saya menetapkan jumlah baris untuk label menjadi 0. Ini memungkinkannya menggunakan sebanyak mungkin garis yang diperlukan.

Bagian selanjutnya adalah untuk menentukan seberapa besar Anda UITableViewCellakan, jadi lakukan itu di heightForRowAtIndexPathfungsi Anda :

- (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;
}

Saya menambahkan 20 ke tinggi sel saya yang kembali karena saya suka sedikit buffer di sekitar teks saya.


17
Anda tidak perlu mengatur cell.textLabel.numberOfLines Anda ke beberapa angka tinggi yang sewenang-wenang. Mengaturnya ke 0 berarti "garis yang diperlukan untuk ditampilkan."
mmc

Terima kasih, saya akan mengedit posting saya malam ini setelah saya mendapat kesempatan untuk memverifikasi di proyek saya sendiri.
Tim Rupe

1
Mengatur jumlah baris ke 0 berfungsi dengan baik (sebanyak garis yang diperlukan untuk menampilkan)
prakash

1
cagreen: Ternyata saya bisa meniru ini, tetapi hanya jika saya menggunakan iPhone OS 3.0 di simulator. Saat saya menggunakan 3.1+, ukuran detailTextLabel cocok dengan sizeWithFont. Jadi metode Tim bekerja dengan sangat baik - hanya untuk 3,1+ (kemungkinan karena bug / kesalahan dalam rendering sel 3.0 standar). Sebagai catatan, saya menggunakan margin vertikal atas / bawah 12 (masing-masing), ukuran label teks detail (188.0, CGFLOAT_MAX), dan boldSystemFontOfSize 15.
Joe D'Andrea

17
UILineBreakModeWordWrap tidak digunakan lagi di iOS 6. Sebagai gantinya, gunakan NSLineBreakByWordWrapping.
Ethan Allen

16

Jawaban Tim Rupe yang diperbarui untuk iOS7:

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

Komentar / jawaban singkat untuk mencatat pengalaman saya ketika saya memiliki masalah yang sama. Meskipun menggunakan contoh kode, ketinggian sel tampilan tabel menyesuaikan, tetapi label di dalam sel masih tidak menyesuaikan dengan benar - solusinya adalah saya memuat sel dari file NIB khusus, yang terjadi setelah tinggi sel disesuaikan.

Dan saya memiliki pengaturan di dalam file NIB untuk tidak membungkus teks, dan hanya memiliki 1 baris untuk label; pengaturan file NIB mengesampingkan pengaturan yang saya sesuaikan di dalam kode.

Pelajaran yang saya ambil adalah untuk memastikan untuk selalu mengingat bagaimana keadaan objek pada setiap titik waktu - mereka mungkin belum diciptakan! ... hth seseorang di telepon.


2

Jika kita hanya ingin menambahkan teks dalam UITableViewsel, kita hanya perlu dua delegasi untuk bekerja (tidak perlu menambahkan ekstra UILabels)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Solusi ini bekerja untuk saya: -

-(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);
}

Di sini string mutArradalah array yang bisa berubah dari mana saya mendapatkan data saya.

EDIT: - Berikut ini adalah array yang saya ambil.

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

Sekarang tampilan tabel dapat memiliki sel ukuran sendiri. Atur tampilan tabel sebagai berikut

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

Referensi Apple


0

Saya menggunakan solusi berikut.

Data disediakan secara terpisah di anggota:

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

Penanganan dapat dengan mudah dilakukan di cellForRowAtIndexPath. Tentukan sel / tentukan font dan berikan nilai-nilai ini ke "sel" hasil. Perhatikan bahwa numberoflinesdiatur ke "0", yang berarti mengambil apa yang diperlukan.

- (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;
}

Dalam heightForRowAtIndexPath, saya menghitung ketinggian teks yang dibungkus. Ukuran boding harus terkait dengan lebar sel Anda. Untuk iPad ini adalah 1024. Untuk iPhone dan iPod 320.

- (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

Saya menemukan ini sangat sederhana dan mudah:

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

untuk misalnya:

[self.tableView setRowHeight:80.0f];

Ini mungkin atau mungkin bukan pendekatan terbaik / standar untuk melakukannya, tetapi itu berhasil dalam kasus saya.


Seperti yang saya pahami, properti rowHeight menetapkan ketinggian tetap yang akan digunakan untuk semua sel dalam tampilan tabel. Menggunakan rowHeight lebih baik untuk kinerja dalam tabel besar, tetapi jika Anda membutuhkan tinggi setiap sel bervariasi berdasarkan isinya maka tampaknya tableView: heightForRowAtIndexPath: metode harus digunakan.
jk7

0

Coba kode saya dengan cepat. Kode ini juga akan berfungsi untuk label UIL normal.

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

Sekarang panggil saja seperti ini

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

-1

Saya pikir ini adalah solusi yang lebih baik dan lebih pendek. Cukup format UILabel( textLabel) sel untuk menghitung ketinggian secara otomatis dengan menentukan sizeToFitdan semuanya akan baik-baik saja.

- (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

Saya tidak berpikir Anda dapat memanipulasi basis UITableViewCell'spribadi UILabeluntuk melakukan ini. Anda bisa menambahkan baru UILabelke sel sendiri dan menggunakan numberOfLinesdengan sizeToFitukuran dengan tepat. Sesuatu seperti:

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];
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.