2012-10-23 9 views
8

mam CollectionViewControllerUtworzenie podklasy UICollectionViewLayout i przypisać do 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; 
} 

Mam też UICollectionViewLayout podklasy: 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; 
} 

Próbuję użyć nową ramkę do komórki, tylko jeden w przypadkowej pozycji. Problem polega na tym, że layoutAttributesForItemAtIndexPath nie jest wywoływany.

Z góry dziękuję za radę.

+0

Czy ktoś wie, gdzie można znaleźć próbki realizacji niestandardową UICollectionViewLayout? – brainondev

+3

Możesz spojrzeć na mój inspirowany przez Pinterest UICollectionViewLayout na https://github.com/jayslu/JSPintDemo –

+0

Naprawdę interesujący Jay ... dzięki za udostępnienie! – brainondev

Odpowiedz

12

Edit: Nie zauważyłem, że już rozwiązane sprawy, ale miałem ten sam problem i oto co pomogło w moim przypadku. Zostawiam to tutaj, może to być przydatne dla kogoś, kto nie ma jeszcze wiele na ten temat.

Podczas rysowania, nie wywołuje metody layoutAttributesForItemAtIndexPath:, ale layoutAttributesForElementsInRect:, aby określić, które komórki powinny być widoczne. Obowiązkiem użytkownika jest wdrożenie tej metody, a stamtąd wywołanie layoutAttributesForItemAtIndexPath: dla wszystkich widocznych ścieżek indeksu w celu ustalenia dokładnych lokalizacji.

Innymi słowy, dodać do tego układu:

- (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

Czy możesz zastąpić "???" z odpowiednimi wartościami? – Philip007

+2

Jeśli 'layoutAttributesForItemAtIndexPath:' nie jest wywoływany przez kod rysunku w 'UICollectionViewLayout', to dlaczego jest on w interfejsie klasy ?! – fatuhoku

+1

Tradycja? Starsze API? Planowany interfejs API? Sugerowanie dobrego wzoru? Dobre pytanie! –

0

Wystąpił problem z parametrami Storyboard. Przypisany niestandardowy UICollectionLayout z panelu Inspector. enter image description here

+0

Skopuję twój kod i uruchom go. Tak jak powiedziałeś, 'layoutAttributesForItemAtIndexPath' nie jest wywoływany. Ale po zmianie klasy układu w serii ujęć problem pozostaje. Czy jesteś pewien, że Twój kod opublikowany tutaj jest identyczny z tym, czego faktycznie używasz? – Philip007

+0

Nigdy nie powiedziałem, że powyższy kod jest działającym kodem. To było tylko miejsce, w którym przypisałem CustomLayout do UICollectionView. Jeśli dobrze działający kod, sugeruję, żebyś spojrzał na link opublikowany przez Jaya Slupesky'ego ... bardzo mi to pomogło. – brainondev

+1

Przyjmujesz własną odpowiedź, która nie naprawia kodu w pytaniu. To wygląda bardzo myląco. – Philip007

Powiązane problemy