2011-09-28 29 views
7

Tôi đã tìm kiếm và tìm kiếm thông qua các blog và bài viết bất tận về cách xác định chiều cao động cho UITableViewCell tùy chỉnh và văn bản chi tiết của nó. Tôi thực sự đã có một thời gian khó khăn tìm kiếm bất kỳ tài liệu tốt về điều này.Custom UITableView Dynamic Cell Height

Những gì tôi cần làm là có tế bào phát triển theo các văn bản bên trong nhưng không bao giờ đi dưới độ cao 70.

Tôi đã thử một số trong những câu trả lời cho loại câu hỏi ở đây trên StackOverflow nhưng không ai trong số họ đã làm việc. Toàn bộ ứng dụng của tôi sắp hoàn tất nhưng tôi thực sự cần phải hoàn thành nó trước khi tôi phát hành và rắc rối của nó.

Đây là những gì tôi đang cố gắng nhưng tôi chỉ nhận được một slop của các tế bào chồng lên nhau. Từ những gì tôi đọc tôi cần phải tìm các khung nếu các tế bào tùy chỉnh hoặc textview trong tế bào là tốt, nhưng tôi không chắc chắn làm thế nào để làm điều đó hoặc trộn chúng lại với nhau để trở về một chiều cao.

Bất kỳ Trợ giúp nào sẽ được đánh giá cao Cảm ơn bạn! phương pháp

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

    CGSize aSize; 
aSize = [[(Tweet*)[tweets objectAtIndex:indexPath.row]tweet] sizeWithFont:[UIFont 
systemFontOfSize:14] 
      constrainedToSize:CGSizeMake(300.0, 1000.0) 
       lineBreakMode:UILineBreakModeTailTruncation]; 

return aSize.height; 
} 
+0

http://imageshack.us/photo/my-images/508/screenshot2011092816313.png – FreeAppl3

+0

Những hình ảnh cho thấy những gì tôi nhận được với chỉ là về mọi phương pháp tôi cố gắng! Có vẻ như nó đang nhận được kích thước của mỗi chuỗi văn bản nhưng không thay đổi kích thước các ô – FreeAppl3

Trả lời

18

Tôi đã có một vấn đề tương tự một khi trở lại và điều này đã giúp tôi rất nhiều.

#define PADDING 10.0f 
- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *text = [self.items objectAtIndex:indexPath.row]; 
    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)]; 

    return textSize.height + PADDING * 3; 
} 
+0

Tôi phải thay thế "PADDING * 3" đầu tiên bằng "PADDING * 4" và sau "PADDING * 3" với "PADDING * 2" .... –

+0

Có bạn sẽ cần phải điều chỉnh theo nhu cầu cụ thể của bạn nhưng đây chỉ là một cơ sở. – WrightsCS

+5

Bạn nên lưu ý rằng 'sizeWithFont: constrainedToSize:' không được chấp nhận trong iOS 7, vì vậy bạn nên sử dụng 'boundingRectWithSize: options: attributes: context:' –

-4

Sử dụng UITableViewDelegate:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// here you need to get height of your textlabel in your custom cell. 
MyCustomCell *myCell = (MyCustomCell *)[tableView cellForRowAtIndexPath:indexPath]; 
return myCell.myTextLabel.frame.size.height + 20; 
} 

Something như thế này

+0

Dòng đầu tiên của mã [tableView cellForRowAtIndexPath: indexPath]; chỉ làm cho các ứng dụng sụp đổ .... cảm ơn bạn đã trả lời mặc dù – FreeAppl3

+0

Nó treo vì bạn chưa có ô. Tôi không nghĩ về điều đó, xin lỗi. Câu trả lời của WrightsCS sẽ giúp –

+0

Nó bị xáo trộn, "EXE_BAD_ACCESS" – HelloWorld

3

Hey có như vậy bạn sẽ cần phải lưu trữ danh sách các chuỗi trong một NSArray và sau đó bạn sẽ cần phải tính chiều cao của chuỗi nsstring bằng cách sử dụng sizeWithFont: constrainedToSize: tài liệu được tìm thấy tại đây http://developer.apple.com/library/ios/#documentation/UIKit/Reference/NSString_UIKit_Additions/Reference/Reference.html

do đó, phương thức tableView shoul của bạn d giống như thế

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
NSDictionary *stringAttributes = [NSDictionary dictionaryWithObject:[UIFont fontWithName:"Helvetica" size:9] forKey: NSFontAttributeName]; 

    CGSize cell_size = [string boundingRectWithSize:CGSizeMake(300,999) 
          options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin  
          attributes:stringAttributes context:nil].size; 
if (cell_size.height > 70) 
{ 
return cell_size.height; 
} 
else 
{ 
return 70; 
} 
} 

EDIT: NÀY đã được cập nhật cho iOS 7

0

Tôi vừa viết về vấn đề này và cách cuối cùng tôi quyết định giải quyết nó. Bạn có thể đọc về nó tại đây: Dynamic UITableView Cell Height Based on Contents

Về cơ bản, tôi đã tạo một lớp con UITableView tự động hóa việc xử lý và tính toán chiều cao ô động cho cả hai ô mặc định và tùy chỉnh. Nó không phải là một viên đạn bạc và có lẽ cần phải được mở rộng và tinh chỉnh, nhưng tôi đã sử dụng nó như là trong một số ứng dụng với kết quả tốt.

Bạn có thể lấy mã tại đây: https://github.com/danielsaidi/AutoSizeTableView

Hy vọng điều đó sẽ hữu ích!

(... và nếu nó không, tôi muốn nghe ý kiến ​​tại sao không)

0

tôi đã cố gắng rất nhiều giải pháp, nhưng một trong đó làm việc là điều này, đề nghị của một người bạn:

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

    int height = [StringUtils findHeightForText:yourLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:17.0f]]; 

    height += [StringUtils findHeightForText:yourOtherLabel havingWidth:yourWidth andFont:[UIFont systemFontOfSize:14.0f]]; 

    return height + CELL_SIZE_WITHOUT_LABELS; //important to know the size of your custom cell without the height of the variable labels 
} 

Các StringUtils.h lớp:

#import <Foundation/Foundation.h> 

    @interface StringUtils : NSObject 

    + (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font; 

    @end 

StringUtils.m class:

#import "StringUtils.h" 

    @implementation StringUtils 

    + (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font { 
     CGFloat result = font.pointSize+4; 
     if (text) { 
      CGSize size; 

      CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) 
               options:NSStringDrawingUsesLineFragmentOrigin 
              attributes:@{NSFontAttributeName:font} 
               context:nil]; 
      size = CGSizeMake(frame.size.width, frame.size.height+1); 
      result = MAX(size.height, result); //At least one row 
     } 
     return result; 
    } 

    @end 

Nó hoạt động hoàn hảo cho tôi. Tôi đã có một ô tùy chỉnh với 3 hình ảnh có kích thước cố định, 2 nhãn có kích thước cố định và 2 nhãn biến. Làm việc như người ở. Hi vọng nó có ích cho bạn.

Trân trọng, Alexandre.

0

iOS 7

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section 
{ 
    NSString *text = @"Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello HelloHello HelloHello HelloHello HelloHello HelloHello Hello"; 

    CGRect rect = [text boundingRectWithSize:CGSizeMake(280.0f, CGFLOAT_MAX) options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin attributes:@{ 
     NSFontAttributeName: [UIFont fontWithName:@"Hellvetica" size:14.0f] 
    } context:nil]; 

    return CGSizeMake(320.0f, ceil(rect.size.height) + 10.0f); 
}