2013-01-22 30 views
8

Tôi đang gặp một số vấn đề đã triển khai chiều cao hàng động trong một UITableView - nhưng nó không phải là các ô mà tôi đang gặp vấn đề, đó là UILabel bên trong ô.UILabel trong một UITableViewCell Với chiều cao động

Ô chỉ chứa UILabel để hiển thị văn bản. TableView của tôi: heightForRowAtIndexPath: là thay đổi kích thước chính xác mỗi ô bằng cách tính chiều cao của nhãn sẽ nằm trong nó bằng cách sử dụng phương thức sizeWithFont: của NSString.

Tôi có một lớp con của UITableViewCell chỉ giữ thuộc tính UILabel được nối trong bảng phân cảnh. Trong bảng phân cảnh, tôi đã thiết lập các dòng của nó thành 0 vì vậy nó sẽ sử dụng nhiều dòng như nó cần, và tôi đã thiết lập lineBreak của nó thành Word Wrap.

Dưới đây là cách tôi đang thiết lập các tế bào:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    SomeObject *object = self.tableObjects[index.row]; 

    cell.myLabel.text = [object cellText]; 

    [cell.myLabel sizeToFit]; 

    return cell; 
} 

Khi tôi xây dựng này, tôi nhận được cái nhìn bàn của tôi với của tế bào tất cả các kích thước với chiều cao chính xác cho nội dung của họ, mặc dù các hãng đều 1 dòng chỉ chạy bên cạnh các ô. Tuy nhiên, nếu tôi cuộn bảng để ô rời khỏi màn hình và sau đó cuộn lại cho chúng, nhãn của chúng sẽ được định lại kích thước chính xác và ô sẽ trông như thế nào tôi dự kiến ​​ban đầu.

Tôi cũng đã thử tính toán khung nhãn với cùng phương pháp Tôi tính chiều cao hàng với và tôi nhận được cùng một hành vi - nó không vẽ chính xác cho đến khi nó cuộn ra khỏi màn hình và bật lại.

Tôi đã tìm thấy hai cách để giải quyết vấn đề này và không phải là giải pháp có thể chấp nhận được.

Đầu tiên, nếu ở chế độ xemDidAppear: Tôi gọi reloadData trên chế độ xem bảng, các ô và nhãn vẽ chính xác lần đầu tiên. Điều này sẽ không làm việc cho tình hình của tôi bởi vì tôi sẽ thêm và loại bỏ các tế bào vào bảng này, và tôi không muốn gọi reloadData mỗi khi một tế bào được thêm vào.

Cách giải quyết thứ hai có vẻ rất lạ đối với tôi - nếu tôi để cài đặt phông chữ ở System Font 17 mặc định trên UILabel, các ô sẽ tự vẽ chính xác. Ngay sau khi tôi thay đổi kích thước phông chữ, nó trở lại hành vi của nó không vẽ một nhãn chính xác cho đến khi nó rời khỏi màn hình và quay trở lại, hoặc được tải lạiData được gọi trên tableView.

Tôi đánh giá cao bất kỳ trợ giúp nào về vấn đề này.

+0

bài này trả lời một cách chính xác vấn đề của bạn: http://stackoverflow.com/questions/8903369/dynamic- uitableviewcell-chiều cao. Nó có thể hơi rắc rối nếu bạn chưa từng tạo ra các ô có kích thước động trước đây, nhưng không quá khó. – macandyp

+0

Tôi không hiểu làm thế nào mã trong câu trả lời đó là làm bất cứ điều gì khác với những gì tôi đang làm. Tôi đang thiết lập khung của nhãn của tôi trong cellForRowAtIndexPath, nhưng nó không áp dụng khung đó cho đến khi nó được vẽ lại lần sau. Hay tôi đang thiếu một cái gì đó? – alivingston

+0

Bạn có đang triển khai heightForRowAtIndexPath không? – macandyp

Trả lời

8

Tôi đã kết thúc việc giải quyết vấn đề này bằng cách cấp phát/bắt đầu nhãn trong cellForRowAtIndexPath. Tôi không hoàn toàn chắc chắn tại sao đây là một giải pháp - nhưng nó xuất hiện vấn đề tôi đã trải qua đã làm với cách storyboard (hoặc khi nào, có lẽ?) Tạo ra các đối tượng trong tế bào. Nếu tôi phân bổ/init nhãn trong ô trong cellForRowAtIndexPath, mọi thứ tải và kích cỡ chính xác.

Vì vậy, ... bản sửa lỗi hiện tại của tôi là kiểm tra xem ô có nhãn tùy chỉnh của tôi trong đó hay không. Nếu không, tôi phân bổ/init nhãn và đặt nó vào ô. Nếu nó có một, như trong một tế bào của nó đã được dequeued, sau đó tôi chỉ cần thiết lập các văn bản trong nhãn đó đã có.

Không chắc chắn nếu đó là giải pháp tốt nhất, nhưng nó hoạt động ngay bây giờ.

+0

Tôi gặp sự cố tương tự. Tôi giải quyết nó bằng cách loại bỏ [cell.myLabel sizeToFit] từ tableView: cellForRowAtIndexPath :. Và sau đó sử dụng bảng phân cảnh, thêm các ràng buộc Không gian trên để Superview, Không gian dưới để giám sát. – jemeshsu

+0

Bạn đã tiết kiệm thời gian của tôi. cảm ơn bạn – NightFury

3

Tôi đã kết thúc việc giải quyết vấn đề này bằng cách bỏ chọn hộp kiểm Tự động kích hoạt trong IB. Không rõ lý do tự động bố cục đã gây ra sự cố này.

2

Tôi chạy trên cùng một vấn đề và tôi kết thúc giải quyết nó bằng cách gọi [cell layoutIfNeeded] trước khi trở lại phòng giam

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
SomeObject *object = self.tableObjects[index.row]; 

cell.myLabel.text = [object cellText]; 

[cell layoutIfNeeded]; 

return cell; } 
Các vấn đề liên quan