2012-01-11 35 views
11

tôi cần phải làm cho tế bào tùy chỉnh trong UITableViewStyleGrouped table.It phải trông như UITableViewCellStyleValue1 nếu textLabel và detailTextLabel được thể hiện mà không cần cắt ngắn, hoặc như UITableViewCellStyleSubtitle (nhưng với detailTextLabel width = contentView.frame.size.width và UITextAlignmentRight) nếu trong Value1 phong cách một trong các nhãn được cắt ngắn.Cách lấy chiều rộng contentView của UITableViewCell?

Tôi cần biết chiều rộng của cell.contentView trong phương thức - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath để quyết định chiều cao của ô là bao nhiêu. Tôi so sánh cell.contentView.width và tổng chiều rộng nhãn (tôi nhận được chúng bằng cách sử dụng phương pháp sizeThatFits:) để quyết định nó.

Vì vậy, Cách lấy đúng cell.contentView.frame.size.width trước khi tạo ô?

UPD: một số mã để làm rõ câu hỏi.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat cellHeight = 44; 

    CGSize textSize = [[arrayOfTextData objectAtIndex:indexPath.row] 
          sizeWithFont:[UIFont systemFontOfSize:14] 
          constrainedToSize:CGSizeMake(1000, 100) 
          lineBreakMode:UILineBreakModeCharacterWrap]; 
    CGSize detailedTextSize = [[arrayOfDetailTextData objectAtIndex:indexPath.row] 
            sizeWithFont:[UIFont systemFontOfSize:14] 
            constrainedToSize:CGSizeMake(1000, 100) 
            lineBreakMode:UILineBreakModeCharacterWrap]; 
    if (textSize.width + detailedTextSize.width > /* I need here cell.contentView.frame.size.width*/ 300) { 
     cellHeight = textSize.height + detailedTextSize.height; 
    } 
    return cellHeight; 
} 

UPD2: Vấn đề là khi tôi tạo tế bào các cell.frame.size.width bằng cell.contentView.frame.size.width và bình đẳng 320, nhưng sau khi tế bào xuất hiện cell.contentView.frame Các thay đổi .size.width phụ thuộc vào chiều rộng tableView và kiểu tableView.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"tmpCell"; 
    CustomTableViewCellValue1OrSubtitle *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[CustomTableViewCellValue1OrSubtitle alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];  
    } 
    //--Configure the cell 
     cell.textLabel.text = [arrayOfTextData objectAtIndex:indexPath]; 
     cell.detailTextLabel.text = [arrayOfDetailTextData objectAtIndex:indexPath.row]; 

    [cell layoutIfNeeded]; 

    CGSize textSize = [cell.textLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode]; 
    CGSize detailedTextSize = [cell.detailTextLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode]; 
    CGFloat cellHeight = cell.contentView.frame.size.height; 

    NSLog(@"contentView.frame.size.width = %f",cell.contentView.frame.size.width); 
    //out: contentView.frame.size.width = 320.0 
    //Always print 320, even if I set Simulator on iPad 

    if (textSize.width + detailedTextSize.width > cell.contentView.frame.size.width) { 
     cellHeight = textSize.height + detailedTextSize.height; 
    } 
    return cellHeight; 
} 
+0

Bạn đã bao giờ tìm được giải pháp cho điều này chưa? Tôi có một vấn đề tương tự khi 'contentView.frame.size.width' trả về 320 trên iPhone trong khi khởi tạo. – cod3monk3y

+1

Tôi đã kết thúc triển khai 'layoutSubviews' để thay đổi kích thước nội dung ô tùy chỉnh của mình. – cod3monk3y

+0

Tôi đã làm điều tương tự. – Alexander

Trả lời

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

    if (indexPath.section == 0) 
     return 60.0f; 
    else 
     return 50.0f; 

} 

bằng cách áp dụng với bạn điều này có thể thiết lập các tế bào -> contentView. Và nếu bạn cần chiều rộng ô động, hãy sử dụng cờ ở phương pháp trên

+0

Tôi không hiểu ý bạn là gì. Tôi không cần chiều rộng ô động. Tôi muốn biết chiều rộng cell.contentView để hiểu: Các nhãn có phù hợp cho ô không cắt xén không? Nếu không thì tôi muốn trở lại trong '- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath' chiều cao khác. – Alexander

4

Nếu tôi không nhầm, heightForRowAtIndexPath: được gọi trước hoặc sau khi ô được khởi tạo, vì vậy không có thời gian để đổi kích thước.

này nên làm việc cho bạn:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"%f", cell.contentView.frame.size.width); 
} 

Thật không may, điều này được gọi sau khi heightForRowAtIndexPath. Cách duy nhất tôi đã tìm thấy để điều chỉnh chiều cao dựa trên chiều rộng không cố định là đặt biến thể cho chiều rộng lần đầu tiên phương thức này được gọi, sau đó tải lại chế độ xem bảng và sử dụng biến mẫu chiều rộng bên trong heightForRowAtIndexPath.

+1

mã này lúc đầu ra 320 cho iPhone và 750 cho iPad, nhưng chiều rộng contentView thực là 300 cho iPhone và 698 cho iPad (cho chiều dọc, chiều rộng màn hình) và sau khi tôi cuộn bảng lên và xuống giá trị đúng – Alexander

+0

Bạn ngay tại một số điểm, nhưng nó là lạ để tải lại bảng từ các đại biểu, mà chịu trách nhiệm cho tải lại;) Và tôi sẽ phải tải lại bảng mỗi khi nó muốn hiển thị tế bào mới, mà chưa được hiển thị. – Alexander

+0

Đây là một giải pháp kinh tởm, phải tải lại toàn bộ xem bảng của bạn để tính toán điều này thực sự là không thể chấp nhận được! – simonthumper

0

Chiều rộng contentView của tế bào trong một UITableView không được thiết lập khi các tế bào được tạo ra, vì vậy bạn có thể thiết lập các autoresizingMask cho nhãn, như thế này:

label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 

Đối với tôi nó đã làm việc.

Các vấn đề liên quan