2012-11-05 8 views
6

Trong một lớp con UITableViewCell tôi ghi đè layoutSubviews vì tôi cần tính toán các khung của một vài bản phụ. Cơ sở cho tất cả các tính toán của tôi là chiều rộng của chế độ xem nội dung. Đây là cách đầu thực hiện của tôi layoutSubviews trông giống như:Sai chiều rộng nội dung trong UITableViewCell tùy chỉnh?

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; // invoke this to set up the content view's bounds 

    CGFloat contentViewWidth = self.contentView.bounds.size.width; 

    [...] // calculate and assign frames to subviews 
} 

Tôi đã bắt đầu thử nghiệm này trong một cái nhìn bảng nhóm trong mô phỏng iPhone. Các tế bào là nghĩa vụ phải bao gồm chỉ những gì bên trong xem nội dung, tức là tôi đã tắt tất cả các công cụ ưa thích xung quanh. Cụ thể, tôi đã tắt chế độ xem phụ kiện bằng cách đặt loại phụ kiện thành UITableViewCellAccessoryNone. Do đó, chế độ xem phụ kiện bị ẩn, mặc dù thuộc tính giới hạn/khung hình của nó vẫn báo cáo kích thước 20/20.

Dựa trên tất cả điều này, và hình minh họa đơn giản sau đây, tôi mong chờ chiều rộng xem nội dung trong đoạn mã trên được báo cáo là 300.

<----------- screen width = 320 -----------> 
+------------------------------------------+ 
|           | 
| <--- content view width = 300 ---> | 
| +--------------------------------+ | 
|<-->|   table view cell  |<-->| 
| 10 +--------------------------------+ 10 | 
|           | 
|     [...]     | 

Nhưng nó không phải là, nội dung xem chiều rộng đó là thực sự được báo cáo là 270!

Một chút nghiên cứu cho thấy 30 điểm bị thiếu bao gồm a) 20 chiều rộng của giao diện phụ kiện và b) 10 khoảng cách giữa chế độ xem nội dung và chế độ xem phụ kiện. Tôi đã thử đặt kích thước khung nhìn phụ kiện thành 0/0, hiệu quả là chiều rộng xem nội dung hiện được báo cáo là 290. Hơi tốt hơn, nhưng vẫn giảm 10 điểm. Tôi cũng đã thử đặt thuộc tính accessoryView thành nil, nhưng chế độ xem chỉ được tạo lại bởi [super layoutSubviews].

Cuối cùng, câu hỏi: Có cách nào để thực sự tắt chế độ xem phụ kiện để nó không được bao gồm trong việc tính chiều rộng của chế độ xem nội dung không? Ngoài ra, có an toàn khi bỏ qua việc gọi [super layoutSubviews] và chỉ cần tính toán chiều rộng cho chính mình?

+0

không phải là một giải pháp nhưng nếu bạn bỏ bê để gọi siêu ở đây bạn bị mất các góc tế bào cong trong một bảng nhóm xem để thats không phải là một tùy chọn – jackslash

+0

'layoutSubviews' có thể sẽ được gọi một vài lần trước khi ô cuối cùng xuất hiện trong bảng. Bạn đã xác minh kích thước của 'contentView' cho cuộc gọi cuối cùng hay bạn chỉ nhìn vào cuộc gọi ban đầu? – rmaddy

+0

@rmaddy: Trong trường hợp thử nghiệm của tôi, UIKit chỉ gọi 'layoutSubviews' một lần. – herzbube

Trả lời

7

Sau khi xem lại câu hỏi này, tôi thấy rằng tôi không còn có thể tái tạo hành vi được mô tả trong câu hỏi. Các hành vi hiện nay như mong đợi:

  • Giá trị mặc định phụ kiện theo phong cách của tế bào xem bảng là UITableViewCellAccessoryNone
  • Thuộc tính accessoryView trả nil
  • Chiều rộng xem nội dung được báo cáo là 302

tôi hiện đang thử nghiệm điều này trong Xcode 4.2 trên trình giả lập iPhone 5.1. Khi tôi hỏi câu hỏi tôi tin rằng tôi vẫn còn có giả lập iPhone 4.3 chạy. Bây giờ tôi phải giả định rằng sự cố hoặc chỉ tồn tại trong trình mô phỏng 4.3 hoặc do một số cấu hình sai Xcode trên phần của tôi hoặc hoàn toàn là tưởng tượng ngay từ đầu.

Đối với hồ sơ: workaround của tôi là để áp dụng một chiều rộng mới để xem nội dung trong layoutSubviews:

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    CGRect contentViewFrame = self.contentView.frame; 
    contentViewFrame.size.width = 302; 
    self.contentView.frame = contentViewFrame; 

    [...] 
}