ฉันจะตัดข้อความใน UITableViewCell ได้อย่างไรโดยไม่มีเซลล์ที่กำหนดเอง


151

นี่คือบน iPhone 0S 2.0 คำตอบสำหรับ 2.1 ก็ใช้ได้เช่นกัน แต่ฉันก็ไม่ทราบถึงความแตกต่างใด ๆ เกี่ยวกับตาราง

รู้สึกเหมือนเป็นไปได้ที่จะได้รับข้อความห่อโดยไม่ต้องสร้างเซลล์ที่กำหนดเองเนื่องจากUITableViewCellมีประกอบด้วยUILabelโดยค่าเริ่มต้น ฉันรู้ว่าฉันสามารถทำให้มันทำงานได้ถ้าฉันสร้างเซลล์ที่กำหนดเอง แต่นั่นไม่ใช่สิ่งที่ฉันพยายามที่จะบรรลุ - ฉันต้องการที่จะเข้าใจว่าทำไมวิธีการปัจจุบันของฉันไม่ทำงาน

ฉันพบว่าฉลากถูกสร้างขึ้นตามความต้องการ (เนื่องจากเซลล์รองรับการเข้าถึงข้อความและรูปภาพดังนั้นจึงไม่สร้างมุมมองข้อมูลจนกว่าจะจำเป็น) ดังนั้นถ้าฉันทำสิ่งนี้:

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

จากนั้นฉันจะได้รับป้ายกำกับที่ถูกต้อง แต่การตั้งค่าnumberOfLinesนั้น (และ lineBreakMode) ไม่ทำงาน - ฉันยังได้รับข้อความบรรทัดเดียว มีมากมายของความสูงในการเป็นUILabelข้อความที่จะแสดงผล - heightForRowAtIndexPathฉันแค่กลับค่าขนาดใหญ่สำหรับความสูงใน

คำตอบ:


277

นี่เป็นวิธีที่ง่ายกว่าและใช้ได้กับฉัน:

ภายในcellForRowAtIndexPath:ฟังก์ชั่นของคุณ ครั้งแรกที่คุณสร้างเซลล์ของคุณ:

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

คุณจะสังเกตเห็นว่าฉันตั้งค่าจำนวนบรรทัดสำหรับป้ายกำกับเป็น 0 ซึ่งช่วยให้สามารถใช้บรรทัดได้มากเท่าที่ต้องการ

ส่วนถัดไปคือการระบุว่าคุณต้องการให้ตัวเองมีขนาดใหญ่เพียงUITableViewCellใดดังนั้นให้ทำในheightForRowAtIndexPathหน้าที่ของคุณ:

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

ฉันเพิ่มความสูงของเซลล์ที่ส่งคืน 20 เนื่องจากฉันชอบบัฟเฟอร์เล็กน้อยรอบข้อความของฉัน


17
คุณไม่จำเป็นต้องตั้งค่า cell.textLabel.numberOfLines เป็นจำนวนที่สูงมาก การตั้งค่าเป็น 0 หมายถึง "มีหลายบรรทัดตามที่แสดง"
mmc

ขอบคุณฉันจะแก้ไขโพสต์ของฉันคืนนี้หลังจากที่ฉันมีโอกาสตรวจสอบในโครงการของฉันเอง
ทิมรูปี

1
การตั้งค่าจำนวนสายที่จะทำงานได้ดี 0 (ตามที่เป็นหลายสายที่ใช้ในการแสดงผล)
Prakash

1
cagreen: จะเปิดออกผมสามารถทำซ้ำนี้ แต่เพียงว่าถ้าผมใช้ iPhone OS 3.0 ในการจำลอง เมื่อฉันใช้ 3.1+ การปรับขนาดของ detailTextLabel จะตรงกับขนาดของ sizeWithFont ดังนั้นวิธีการของ Tim ทำงานได้ดีมาก - เพียง 3.1+ (น่าจะเกิดจากข้อผิดพลาด / ความผิดพลาดในการเรนเดอร์เซลล์เริ่มต้น 3.0) สำหรับบันทึกฉันใช้ระยะขอบบน / ล่างแนวตั้ง 12 (แต่ละอัน) ขนาดป้ายข้อความรายละเอียด (188.0, CGFLOAT_MAX) และตัวหนาตัวหนา SystemFontOfSize 15.
Joe D'Andrea

17
UILineBreakModeWordWrap เลิกใช้แล้วใน iOS 6 ใช้ NSLineBreakByWordWrapping แทน
Ethan Allen

16

อัพเดตคำตอบของ Tim Rupe สำหรับ 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

ความคิดเห็นสั้น ๆ / คำตอบเพื่อบันทึกประสบการณ์ของฉันเมื่อฉันมีปัญหาเดียวกัน แม้จะใช้ตัวอย่างรหัสความสูงของเซลล์มุมมองตารางถูกปรับ แต่ฉลากภายในเซลล์ยังคงปรับไม่ถูกต้อง - วิธีแก้ไขคือฉันโหลดเซลล์จากไฟล์ NIB ที่กำหนดเองซึ่งเกิดขึ้นหลังจากปรับความสูงของเซลล์แล้ว

และฉันมีการตั้งค่าของฉันภายในไฟล์ NIB เพื่อไม่ห่อข้อความและมีเพียง 1 บรรทัดสำหรับป้ายกำกับ การตั้งค่าไฟล์ NIB จะแทนที่การตั้งค่าที่ฉันปรับภายในโค้ด

บทเรียนที่ฉันทำคือต้องจำไว้เสมอว่าสถานะของวัตถุในแต่ละจุดนั้นเป็นอย่างไร - อาจยังไม่ได้สร้างขึ้น! ... hth บางคนลงมา


2

หากเราต้องการเพิ่มข้อความในUITableViewเซลล์เราต้องมีผู้รับมอบสิทธิ์เพียงสองคนเท่านั้นที่จะทำงานด้วย (ไม่จำเป็นต้องเพิ่มพิเศษUILabels)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

วิธีนี้ใช้ได้ผลสำหรับฉัน: -

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

นี่คือสตริงmutArrเป็นอาร์เรย์ที่ไม่แน่นอนซึ่งฉันได้รับข้อมูลของฉัน

แก้ไข: -นี่คืออาร์เรย์ที่ฉันเอา

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


0

ฉันใช้โซลูชันต่อไปนี้

ข้อมูลมีให้แยกต่างหากในสมาชิก:

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

การจัดการสามารถทำได้อย่างง่ายดายcellForRowAtIndexPathมา กำหนดเซลล์ / กำหนดแบบอักษรและกำหนดค่าเหล่านี้ให้กับผลลัพธ์ "เซลล์" โปรดทราบว่าการnumberoflinesตั้งค่าเป็น "0" ซึ่งหมายถึงใช้สิ่งที่จำเป็น

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

ในheightForRowAtIndexPathฉันคำนวณความสูงของข้อความที่ห่อ ขนาดการเข้ารหัสจะต้องเกี่ยวข้องกับความกว้างของเซลล์ของคุณ สำหรับ iPad จะเป็น 1024 สำหรับ iPhone และ 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

ฉันพบว่าสิ่งนี้ค่อนข้างเรียบง่ายและตรงไปตรงมา:

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

สำหรับเช่น:

[self.tableView setRowHeight:80.0f];

นี่อาจจะใช่หรือไม่ใช่วิธีที่ดีที่สุด / มาตรฐานในการทำเช่นนั้น แต่มันใช้ได้ในกรณีของฉัน


ดังที่ฉันเข้าใจแล้วคุณสมบัติ rowHeight ตั้งค่าความสูงคงที่ซึ่งจะใช้สำหรับเซลล์ทั้งหมดในมุมมองตาราง การใช้ rowHeight จะดีกว่าสำหรับการทำงานในตารางขนาดใหญ่ แต่ถ้าคุณต้องการความสูงของแต่ละเซลล์จะแตกต่างกันไปตามเนื้อหาของมันดูเหมือนว่า tableView: heightForRowAtIndexPath: ต้องใช้เมธอด
jk7

0

ลองรหัสของฉันอย่างรวดเร็ว รหัสนี้จะใช้ได้กับ UILabels ปกติด้วย

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

ตอนนี้เรียกแบบนี้

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

-1

ฉันคิดว่านี่เป็นวิธีที่ดีกว่าและสั้นกว่า เพียงแค่จัดรูปแบบUILabel( textLabel) ของเซลล์เพื่อคำนวณความสูงโดยอัตโนมัติด้วยการระบุsizeToFitและทุกอย่างน่าจะดี

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

ฉันไม่คิดว่าคุณสามารถจัดการฐานUITableViewCell'sส่วนตัวUILabelเพื่อทำสิ่งนี้ คุณสามารถเพิ่มใหม่UILabelให้กับเซลล์ด้วยตัวเองและใช้numberOfLinesกับsizeToFitขนาดที่เหมาะสม สิ่งที่ต้องการ:

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];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.