2013-07-31 26 views
5

Tôi có một lớp con UICollectionViewCell tùy chỉnh (MyCell), giao diện của nó được thiết lập trong Trình tạo giao diện sử dụng Bố cục tự động. Ô này có chế độ xem hình ảnh và nhãn.Bố cục tự động: không thể lấy kích thước khung của UICollectionViewCell subViews

Bây giờ, khi tôi định cấu hình ô, tôi cần biết chiều rộng và chiều cao của chế độ xem hình ảnh. Nghe có vẻ khá đơn giản, nhưng có vẻ như không thể.

Trong điều khiển quan điểm của tôi:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath]; 
    cell.itemNumber = indexPath.item; 
    return cell; 
} 

Trong lớp con di động của tôi Tôi đang sử dụng setter tài sản của tôi để tùy chỉnh các tế bào:

- (void)setItemNumber:(NSInteger)itemNumber { 
    _itemNumber = itemNumber; 
    self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber]; 

    // In my actual project I need to know the image view's width and hight to request an image 
    // of the right size from a server. Sadly, the frame is always {{0, 0}, {0, 0}} 
    // (same for the bounds) 
    NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame)); 
} 

Một ví dụ dự án đầy đủ có thể được tìm thấy tại https://github.com/kevinrenskers/CollectionViewAutoLayoutTest.

Vì vậy, vấn đề là: Tôi cần phải biết kích thước của hình ảnh xem vì tôi cần phải yêu cầu một máy chủ để tạo ra một hình ảnh có kích thước chính xác. Và kích thước điểm ảnh là {0,0} ..

Tôi đã cố gắng để làm các tùy biến trong -layoutSubviews phương pháp quá:

- (void)setItemNumber:(NSInteger)itemNumber { 
    _itemNumber = itemNumber; 
} 

- (void)layoutSubviews { 
    if (self.myImageView.frame.size.height) { 
     self.label.text = [NSString stringWithFormat:@"%i", self.itemNumber]; 
     NSLog(@"%@", NSStringFromCGRect(self.myImageView.frame)); 
    } 
} 

Đáng buồn thay, điều này thậm chí nhiều hơn là điều sai lầm. Phương thức này được gọi hai lần, đầu tiên khung là {{0, 0}, {0, 0}} và sau đó khung được đặt chính xác. Do đó câu lệnh if kiểm tra chiều cao. Một khi bạn bắt đầu di chuyển mặc dù, các nhãn sai được hiển thị cho các tế bào sai. Tôi không hiểu chuyện gì đang diễn ra ở đây.

Sự cố có thể có ý nghĩa hơn khi bạn thử trong example project.

Đặt giới hạn chiều rộng và chiều cao và làm IBOutlets thành âm thanh như một tùy chọn tuyệt vời, nhưng đáng buồn là các ô không có kích thước cố định và hình ảnh cần thu nhỏ và phát triển với ô. Xóa bố cục tự động cũng không phải là một tùy chọn.

+0

Đánh giá từ mã của bạn, bạn' không khởi tạo lại nhãn hoặc imageView của bạn. Có đúng không, hoặc bạn đã bỏ qua đoạn mã đó cho dự án ví dụ này? – Maarten

+0

Điều gì xác định kích thước của chế độ xem hình ảnh? – rdelmar

+0

Tôi đang sử dụng bảng phân cảnh, đó là những gì khởi tạo imageView và nhãn. Kích thước được xác định bởi Bố cục tự động, sử dụng các ràng buộc trên cùng, dưới cùng, bên trái và bên phải. –

Trả lời

1

Cuối cùng tôi đã thêm top, right, bottom và để lại những hạn chế khoảng cách trên ImageView (đến SuperView), thêm IBOutlets với họ và sử dụng một cái gì đó như thế này:

CGFloat height = self.contentView.bounds.size.height - self.topConstraint.constant - self.bottomConstraint.constant; 
CGFloat width = self.contentView.bounds.size.width - self.leftConstraint.constant - self.rightConstraint.constant;