2009-07-21 37 views
7

Tôi có UITableView (Được nhóm lại!) Và cần tính chiều cao của hai kiểu ô: UITableViewCellStyleDefaultUITableViewCellStyleValue2.heightForRowAtIndexPath cho chuỗi dài hơn NSStrings

Đây là cách tôi làm điều đó cho UITableViewCellStyleDefault:

CGSize textSize = {300.f, 200000.0f}; 
CGSize size = [myTextString1 sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap]; 
size.height += 30.0f; 
result = MAX(size.height, 44.0f); 

Và đối với UITableViewCellStyleValue2:

CGSize textSize = {207.f, 200000.0f}; 
CGSize size = [myTextString2 sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap]; 
size.height += 30.0f; 
result = MAX(size.height, 44.0f); 

Vấn đề của tôi nó rằng họ trở lại đỉnh cao không chính xác và tôi nghĩ rằng đó là textSize nơi Tôi sử dụng số không chính xác. Với văn bản dài, phần dưới được cắt ngắn (thường chỉ là một dòng với một vài từ), và cho cả hai kiểu ô, chúng có khoảng cách kỳ lạ bên trên và bên dưới văn bản trong ô.

Đối với UITableViewCellStyleValue2 Tôi đã nhận kích thước chiều rộng (207.0f) từ việc tạo văn bản.backgroundColor đỏ và sau đó chỉ cần tính kích thước của hộp. 300.0f chiều rộng cho UITableViewCellStyleDefault là ô lớn đến mức nào với .

Có ai biết giá trị nào tôi cần sử dụng để tính toán đúng kích thước của NSString và do đó có được chiều cao thích hợp cho các ô của tôi không?

Cảm ơn

Trả lời

9

Đây là mã tôi đang sử dụng cho việc này. Nó hoạt động như một sự quyến rũ cho một loại tế bào. Nó có thể có một số phần hữu ích cho ứng dụng của bạn.

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { 
AppAppDelegate *appDelegate = (AppAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSString *Text = ([[appDelegate.myTextSectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"Text"]); 

    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; 
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); 
    CGSize labelSize = [Text sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 
    return labelSize.height + 15;} 
+1

Cảm ơn. Tôi đã làm một điều gì đó một mình với cùng một dòng. Tôi phát hiện ra mình đã gặp sự cố với các ô Value2, vì tôi cho rằng chúng là fontSize 14, trong khi chúng thực sự là 15. Đối với mã của bạn, bạn có thể muốn thêm: result = MAX (labelsize.height + 15 , 44.0f); Chỉ trong trường hợp nếu ô trống hoặc nhỏ hơn thì 2 dòng sẽ trả về với chiều cao tối thiểu là 44.0f, đó là bình thường. Nếu chỉ có một dòng, nó sẽ làm cho nó nhỏ hơn 44.0f. – runmad

2

Khi bạn tạo tế bào của bạn, bạn đang sử dụng phông chữ giống như bạn sử dụng để đo lường?

Tôi đã sử dụng hướng dẫn trên this page và mọi thứ đã hiệu quả đối với tôi. Nó cũng hữu ích cho bạn:

+0

Có, tôi sử dụng cùng cỡ và loại phông chữ (in đậm/không in đậm). Tôi sẽ xem xét liên kết và xem liệu nó có giải quyết được không và cho bạn biết. – runmad

+0

Tôi phát hiện ra tôi đã không sử dụng đúng phông chữ! Tôi phát hiện ra mình đang gặp vấn đề với các ô Value2, bởi vì tôi cho rằng chúng là fontSize 14, trong khi chúng thực sự là 15. Kiểu di động khác mà tôi cần để chơi xung quanh với chiều cao nó thêm vào chiều cao văn bản. – runmad

2

Có vẻ như bạn đã tìm ra rằng bạn đang sử dụng sai kích thước văn bản. Bạn có thể chỉ muốn sử dụng các thuộc tính fontlineBreakMode của nhãn để tránh sự cố này trong tương lai, đặc biệt nếu bạn thay đổi chúng trong ô sau này. Ngoài ra, vì lợi ích của khả năng đọc, tôi sẽ tránh thêm chiều cao trước khi trả về một số. Thay vào đó tôi muốn thử một cái gì đó như thế này:

CGSize textSize = CGSizeMake(300.0, 1979); 
CGSize size = [ myTextString1 sizeWithFont:[[ cell textLabel ] font ] 
         constrainedToSize:textSize 
          lineBreakMode:[[ cell textLabel ] lineBreakMode ]]; 

result = MAX(size.height + 30, 44.0f); 

tôi đã sử dụng 1979 vì theo các tài liệu, ta không nên trở về giá trị lớn hơn so với năm 2009.

+0

Cảm ơn. Vâng, tôi đặt một số hằng số cho kích thước phông chữ, vì vậy nếu tôi thay đổi nó cho ô, nó sẽ cập nhật ở khắp mọi nơi. – runmad

0

Khi đang làm việc đối với tôi là để tính toán dựa trên constraintSize chiều rộng của xem bảng:

CGSize constraintSize = CGSizeMake(tableView.frame.size.width * 0.6, 2009); 
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 
0

cách dễ nhất để làm điều này:

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

CGFloat result = 10.0f; 
if(indexPath.section == 1) // here i compare the sections 
{ 
    result = 400.0f; 
} 
return result; 
} 

Trả về các giá trị dựa trên các phần bạn có. Điều này sẽ cung cấp cho bạn chiều cao hàng tùy chỉnh.

2

Nếu bạn muốn tính toán chiều cao đúng cách cho cellvalue2 bạn nên sử dụng: [UIFont boldSystemFontOfSize:15.0f] và như lineBreakMode: NSLineBreakByTruncatingTail

Nếu bạn không sử dụng đậm, văn bản sẽ điền chính xác nhưng bạn sẽ mất đệm dọc đúng .

Phần còn lại của phép tính của bạn là chính xác.

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