2013-09-27 16 views
6

Pracuję nad aplikacją, w której mam nieskończenie przewijany UICollectionView obrazów. Gdy użytkownik dotrze do dolnej części strony, wyszukuję następną stronę obrazów, otrzymam nowe pola indexPaths i dodaję je do UICollectionView z [collectionView insertItemsAtIndexPaths:newIndexPaths].iOS 7: insertItemsAtIndexPaths: przewija UICollectionView

Wszystko to działa doskonale w systemie iOS 6. W systemie iOS 7 działa, ale przewija użytkownika z powrotem na szczyt kolekcji za każdym razem. Próbowałem użyć zamiast tego reloadData i to samo się dzieje.

Każdy pomysł, jak zapobiec temu przewijaniu?

UPDATE: W tym kodzie

Mam UICollectionView który wyświetla miniaturki obrazów w mozaikowy (każdy obraz jest inny rozmiar, więc używam RFQuiltLayout na to nie sądzę. to nie ma nic wspólnego z kwestią przewijania, ponieważ kod źródłowy nie wydaje się wiązać przewijanie.

załadować każdego zestawu 12 obrazów z naszej Parse backend z następującego kodu. (Jeśli isRefresh jest prawdą, wyczyścić się szereg obrazów i ponownie załaduj pierwszą stronę):

- (void)loadImagesStartingAtNum:(int)num withRefresh:(BOOL)isRefresh { 
    NSLog(@"Starting query..."); 

    [PFCloud callFunctionInBackground:@"homeFeed" withParameters:@{@"startNum": [NSNumber numberWithInt:num]} block:^(id objects, NSError *error) { 

     if(!error) { 

      //NSLog(@"Got back home feed objects: %@", objects); 

      NSMutableArray *newIndexPaths = [[NSMutableArray alloc] init]; 

      if (isRefresh) { 
       [imagesArray removeAllObjects]; 
       [imageURLsArray removeAllObjects]; 

       page = 0; 

       for (PFObject *object in objects) { 
        [imagesArray addObject:object]; 
        [imageURLsArray addObject:[XSUtilities urlForImageObject:object]]; 

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:([imagesArray count] - 1) inSection:0]; 
        NSLog(@"New row: %d", indexPath.row); 
        [newIndexPaths addObject:indexPath]; 
       } 

       if ([newIndexPaths count] > 0) { 
        [feed reloadData]; 
        [refreshControl endRefreshing]; 

        page += 1; 
       } 
      } else { 
       for (PFObject *object in objects) { 
        [imagesArray addObject:object]; 
        [imageURLsArray addObject:[XSUtilities urlForImageObject:object]]; 

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:([imagesArray count] - 1) inSection:0]; 
        NSLog(@"New row: %d", indexPath.row); 
        [newIndexPaths addObject:indexPath]; 
       } 

       if ([newIndexPaths count] > 0) { 
        [UIView animateWithDuration:0.25 animations:^{loadingLabel.alpha = 0.0;}]; 
        [feed insertItemsAtIndexPaths:newIndexPaths]; 
        //[feed scrollToItemAtIndexPath:newIndexPaths[0] atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; 

        NSLog(@"imagesArray count: %d", [imagesArray count]); 

        //[feed reloadData]; 

        page += 1; 
       } else { 
        NSLog(@"Got back no objects"); 
       } 
      } 

     } 
     isLoadingNextPage = NO; 
    }]; 
} 

I wtedy wykryć, kiedy użytkownik przewija do dołu strony i załaduj kolejny zestaw z tym kodem:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView { 

    CGPoint offset = aScrollView.contentOffset; 
    CGRect bounds = aScrollView.bounds; 
    CGSize size = aScrollView.contentSize; 
    UIEdgeInsets inset = aScrollView.contentInset; 

    float y = offset.y + bounds.size.height - inset.bottom; 
    float h = size.height; 

    float reload_distance = 480; 
    if(y > h - reload_distance) { 
     NSLog(@"Hit the load point"); 

     if (!isLoadingNextPage) { 
      NSLog(@"Loading page %d", page); 
      isLoadingNextPage = YES; 
      [self loadImagesStartingAtNum:(page * 12) withRefresh:NO]; 
     } 

    } 

} 
+0

Nie mogę tego odtworzyć. Możesz zobaczyć widok kolekcji nieskończonej przewijania I [wyśmianie tutaj] (https://dl.dropboxusercontent.com/u/2183704/Infinite%20Scroll%20Collection%20View.zip). Za każdym razem, gdy trafisz na dół, dodaje 200 dodatkowych komórek. Czy możesz pokazać swój kod? –

Odpowiedz

1

trudno odpowiedzieć nie widząc swój kod.

Czy możesz spróbować użyć metody scrollToItemAtIndexPath?

- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:NO 

Możesz przewijać do dowolnej pozycji.

+2

Czy chcesz używać tej metody do ustawienia pozycji przewijania do określonego elementu po wstawieniu nowych elementów? Próbowałem tego i to nie rozwiązało problemu ... najpierw ustawił nową pozycję przewijania, a potem całość przewinęła się ponownie na szczyt. – Andrew

Powiązane problemy