2011-09-27 27 views
10

Có thể là bản sao nhưng tôi không thể tìm thấy câu hỏi cụ thể trên SO, vì vậy, đây là.Thực tiễn tốt nhất để vẽ chiều cao hàng UITableView động

Tôi tò mò về chiều cao thay đổi động cho tất cả các hàng, thông thường, bởi vì bạn không biết độ dài của NSString được sử dụng cho nhãn.

Tôi biết bạn phải sử dụng phương pháp đại biểu này để thay đổi chiều cao dòng:

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

Vấn đề là phương pháp đại biểu này được gọi là TRƯỚC tế bào được tạo ra (ví dụ: gọi trước khi cellForRowAtIndexPath). Vì vậy, những gì tôi đã nghĩ là tạo ra một tế bào giả trong viewWillAppear và một phương pháp thêm chiều cao ô vào một mảng ánh xạ tới nguồn dữ liệu của chế độ xem bảng (trong trường hợp của tôi cũng là một mảng).

viewWillAppear thực hiện một phương pháp quan trọng này để có được chiều cao:

[NSString sizeWithFont: constrainedToSize: lineBreakMode:]

Sau đó, trong heightForRowAtIndexPath tôi có thể trả lại chiều cao tế bào như vậy:

//cellHeights is an ivar populated in viewWillAppear 
return [[cellHeights objectAtIndex:indexPath.row] floatValue]; 

tôi đã tự hỏi nếu có một cách tốt hơn để tự động thay đổi chiều cao hàng?

Tôi nhận thấy điều này sẽ làm giảm hiệu suất cho một số lượng lớn hàng (lớn hơn 1000, tôi tin). Nhưng trong trường hợp của tôi, các hàng của tôi sẽ không bao giờ đến gần con số đó. Vì vậy, hiệu suất đạt được là không đáng kể.

Cảm ơn trước!

Trả lời

8

Câu hỏi hay! Trong thực tế, tôi đã làm một cái gì đó tương tự trong một số ứng dụng của tôi.

Tôi có thể nghĩ đến một vài lựa chọn thay thế, nhưng tất cả những thứ này đều nằm trong cùng một chủ đề. Bạn cũng có thể chỉ sử dụng sizeWithFont: bên trong của heightForRowAtIndexPath: và loại bỏ mảng đó. Trong trường hợp đó, bạn có thể thực hiện lần truy cập hiệu suất để tính toán lại kích thước mỗi lần, nếu hoạt động đó tốn kém.

Bạn có thể làm "bốc lười biếng" của cellHeights mảng bên trongheightForRowAtIndexPAth: để nó có thể trông giống như thế này:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([cellHeights objectAtIndex:indexPath.row] == nil) { 
     ... calculate height and store it in the array at the correct index... 
    } 

    return [[cellHeights objectAtIndex:indexPath.row] floatValue]; 
} 

Ưu điểm tôi đang nghĩ đến việc ở đây là bạn sẽ chỉ tính toán chiều cao cho các ô chắc chắn sẽ được tải. Nếu bạn tính toán trong viewWillAppear, tôi đoán bạn sẽ làm việc đó cho mọi ô, bất kể nó được hiển thị?

Cuối cùng, bạn có thể đặt kích thước trong chính mô hình dữ liệu của mình. Nếu nó là, ví dụ, một mảng các chuỗi, bạn có thể tạo một lớp có hai thuộc tính: một chuỗi và một thuộc tính "representSize". Sau đó, bạn có thể tính toán lại kích thước của chuỗi mỗi khi giá trị của chuỗi được thay đổi. Sau đó, sẽ chỉ có một mảng, không phải hai, ánh xạ vào nguồn dữ liệu của bạn, chứa đầy lớp dữ liệu chứa cả chuỗi và kích thước hiển thị của chuỗi và giá trị sẽ được tính khi chuỗi thay đổi, không phải lúc nào khi khung nhìn xuất hiện.

Dù sao, tôi rất thích nghe một số nhận xét về các cách tiếp cận khác nhau này.

+0

Quá tệ. Tôi cũng hy vọng sẽ có nhiều phản hồi hơn nữa. Cảm ơn vì đầu vào của bạn! –

1

Tôi gặp sự cố trong UITableView, khi tôi cuộn tableview (trên 3gs iPhone). Tôi thấy rất nhiều sự chậm trễ. Vì vậy, tôi mở hồ sơ thời gian (công cụ rất tốt cho tối ưu hóa) và vấn đề là khi tôi gọi chức năng sizeWithFont. Giải pháp tốt nhất để giải quyết vấn đề này là gọi sizeWithFont trong hàm tạo.

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