2012-11-10 16 views
12

tôi có một cái nhìn bộ sưu tập với kích thước mục khác nhau mà tôi tuyên bố trongUICollectionView: khác nhau mục kích thước không được tính vào các mặt hàng tái sử dụng

- (CGSize)collectionView:(UICollectionView *)collectionView 
        layout:(UICollectionViewLayout*)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 

    FeedItem *item = [_imagesLinkArray objectAtIndex:indexPath.row]; 
    return CGSizeMake(250, 200*item.sizeFactor); 
} 

Khi các tế bào đã được tái sử dụng trong collectionView:cellForItemAtIndexPath: mục đang được trả lại với kích thước mục được đổi lại và không phải là kích thước được chỉ định trong sizeForItemAtIndexPath:.

bất kỳ ý tưởng nào?

+0

thể bạn chia sẻ collectionView của bạn: cellForItemAtIndexPath: phương pháp? Ngoài ra, có thể một trong các bản xem trước trong ô của bạn đang được định kích thước độc lập khỏi ô khiến cho nó trông giống như ô không bị thay đổi kích cỡ? – robhasacamera

+0

Bất kỳ tiến bộ nào về điều này? sizeForItemAtIndexPath: không được tính toán lại khi tôi cuộn và các ô đang được sử dụng lại. – Abdo

+0

Tôi gặp vấn đề tương tự khi tôi cuộn xuống các ô có các sắp xếp khác nhau (như mất khoảng trống tối thiểu giữa các ô) – Qwin

Trả lời

3

Chế độ xem bộ sưu tập dường như tính toán lại các mục ít thường xuyên hơn UITableView. Bạn phải thông báo cho chế độ xem bộ sưu tập về hầu hết các thay đổi đối với mô hình cơ bản, ví dụ: bằng cách gọi [collectionView reloadData] hoặc [collectionView insertItemsAtIndexPaths:indexPaths].

+1

Câu trả lời này đã chỉ cho tôi đúng hướng. Gọi 'reloadData' trước khi trả về' CGSize' trên 'collectionView: layout: sizeForItemAtIndexPath' tạo ra sự kỳ diệu! Cảm ơn! –

+0

Làm thế nào để tuyên truyền cho tế bào? –

5

Dường như collectionView:layout:sizeForItemAtIndexPath: được gọi một lần khi chuẩn bị bố cục, trước khi CollectionView được hiển thị.

Vì vậy, bất cứ khi nào bạn cuộn và một ô bị khử thì nó được thay đổi kích thước theo kích thước được cung cấp bởi collectionView:layout:sizeForItemAtIndexPath: ở giai đoạn chuẩn bị. Bạn có mong đợi phương thức này được gọi bất cứ khi nào một ô có một số indexPath nhất định có thể nhìn thấy được không? Vì vậy, bạn có thể tự động thay đổi kích thước ô? có vẻ như đây không phải là phương pháp này có thể được sử dụng, nó có thể được sử dụng để xác định kích thước của ô một lần ở giai đoạn chuẩn bị bố trí.

Trong trường hợp bạn cần kích thước được tính toán lại vì một lý do nào đó, bạn có thể làm mất hiệu lực bố cục bằng cách sử dụng [UICollectionViewLayout invalidateLayout].

0

Bạn cần Ghi đè chức năng này trong lớp bố cục tùy chỉnh. nếu bạn đang sử dụng bố cục tùy chỉnh.

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { 
return true 
} 
0

Bạn có thể đơn giản ghi đè lên các cuộn xem đại biểu

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    collectionView.collectionViewLayout.invalidateLayout() 
}