2012-10-23 23 views
8

Tôi có một CollectionViewControllersubclassing UICollectionViewLayout và gán cho UICollectionView

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  
    // assign layout (subclassed below) 
    self.collectionView.collectionViewLayout = [[CustomCollectionLayout alloc] init]; 
} 

// data source is working, here's what matters: 
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    ThumbCell *cell = (ThumbCell *)[cv dequeueReusableCellWithReuseIdentifier:@"ThumbCell" forIndexPath:indexPath]; 

    return cell; 
} 

Tôi cũng có một lớp con UICollectionViewLayout: CustomCollectionLayout.m

#pragma mark - Overriden methods 
- (CGSize)collectionViewContentSize 
{ 
    return CGSizeMake(320, 480); 
} 

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    return [[super layoutAttributesForElementsInRect:rect] mutableCopy]; 
} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // configure CellAttributes 
    cellAttributes = [super layoutAttributesForItemAtIndexPath:indexPath]; 

    // random position 
    int xRand = arc4random() % 320; 
    int yRand = arc4random() % 460; 
    cellAttributes.frame = CGRectMake(xRand, yRand, 150, 170); 

    return cellAttributes; 
} 

Tôi đang cố gắng sử dụng một khung mới cho các tế bào, chỉ một ở một vị trí ngẫu nhiên. Vấn đề là layoutAttributesForItemAtIndexPath không được gọi.

Cảm ơn trước vì lời khuyên nào.

+0

Có ai biết nơi để tìm thấy một ví dụ thực hiện tùy chỉnh cho UICollectionViewLayout? – brainondev

+3

Bạn có thể xem UICollectionViewLayout lấy cảm hứng từ Pinterest của tôi tại https://github.com/jayslu/JSPintDemo –

+0

Jay thực sự thú vị ... cảm ơn bạn đã chia sẻ! – brainondev

Trả lời

12

Chỉnh sửa: Tôi không nhận thấy rằng bạn đã giải quyết trường hợp của mình, nhưng tôi đã gặp phải vấn đề tương tự và đây là những gì đã giúp trong trường hợp của tôi. Tôi để nó ở đây, nó có thể hữu ích cho một ai đó cho rằng không có nhiều về chủ đề này được nêu ra.

Khi vẽ, UICollectionView không gọi phương thức layoutAttributesForItemAtIndexPath: nhưng layoutAttributesForElementsInRect: để xác định ô nào sẽ hiển thị. Bạn có trách nhiệm thực hiện phương pháp này và từ đó gọi layoutAttributesForItemAtIndexPath: cho tất cả các đường dẫn chỉ mục có thể nhìn thấy để xác định vị trí chính xác.

Nói cách khác, thêm video này vào bố cục của bạn:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSMutableArray * array = [NSMutableArray arrayWithCapacity:16]; 
    // Determine visible index paths 
    for(???) { 
     [array addObject:[self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:??? inSection:???]]]; 
    } 
    return [array copy]; 
} 
+2

Bạn có thể thay thế "???" với giá trị thích hợp? – Philip007

+2

Nếu 'layoutAttributesForItemAtIndexPath:' không được gọi bởi mã vẽ trong 'UICollectionViewLayout', thì tại sao nó lại nằm trong giao diện của lớp ?! – fatuhoku

+1

Truyền thống? API cũ hơn? API được lập kế hoạch? Đề xuất một mô hình tốt? Câu hỏi hay! –

0

Đã xảy ra sự cố với tham số Storyboard. Đã gán UICollectionLayout tùy chỉnh từ bảng Thanh tra. enter image description here

+0

Tôi sao chép mã của bạn và chạy nó. Như bạn đã nói, 'layoutAttributesForItemAtIndexPath' không được gọi. Nhưng sau khi thay đổi cách bố trí Class trong storyboard, vấn đề vẫn còn. Bạn có chắc là mã của bạn được đăng ở đây giống với những gì bạn thực sự sử dụng không? – Philip007

+0

Tôi chưa bao giờ nói rằng mã được đăng ở trên là mã hoạt động. Đó chỉ là một điểm về cách tôi đã chỉ định CustomLayout cho UICollectionView. Đối với một mã làm việc tốt, tôi đề nghị bạn tìm một liên kết được đăng bởi Jay Slupesky ... nó đã giúp tôi rất nhiều. – brainondev

+1

Bạn chấp nhận câu trả lời của riêng bạn mà không sửa mã trong câu hỏi. Điều đó có vẻ rất gây hiểu lầm. – Philip007

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