2013-09-27 13 views
6

Ich entwickle eine App, wo ich eine unendlich scrollende UICollectionView von Bildern habe. Wenn der Benutzer den unteren Rand der Seite erreicht, erkundige ich mich nach der nächsten Seite der Bilder, besorge die neuen indexPaths und füge sie zur UICollectionView mit [collectionView insertItemsAtIndexPaths:newIndexPaths] hinzu.iOS 7: insertItemsAtIndexPaths: scrollt die UICollectionView

Das alles funktioniert perfekt in iOS 6. In iOS 7 funktioniert es, aber es scrollt den Benutzer jedes Mal bis an den Anfang der CollectionView. Ich habe versucht, reloadData stattdessen zu verwenden, und die gleiche Sache geschieht.

Irgendeine Idee, wie ich dieses Scrollen verhindern kann?

UPDATE: Einschließlich meinen Code

ich eine UICollectionView haben, die Thumbnails von Bildern in einem Mosaikmuster zeigt (jedes Bild eine andere Größe, also bin ich RFQuiltLayout für diese Verwendung Das glaube ich nicht. Dies hat etwas mit dem Scrollen zu tun, da der Quellcode nicht zu scrollen scheint.

Ich lade jeden Satz von 12 Bildern aus unserem Parse-Backend mit dem folgenden Code. (Wenn isRefresh ist wahr, ich clear aus dem Array von Bildern und laden Sie die erste Seite erneut):

- (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; 
    }]; 
} 

ich dann erkennen, wenn der Benutzer einen Bildlauf zum unteren Rand der Seite und den nächsten Satz mit diesem Code laden:

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

Ich kann das nicht reproduzieren. Sie können die Ansicht der unbegrenzten Scroll-Sammlung sehen, die ich hier [gespottet] habe (https://dl.dropboxusercontent.com/u/2183704/Infinite%20Scroll%20Collection%20View.zip). Jedes Mal, wenn du den Boden erreichst, werden 200 weitere Zellen hinzugefügt. Also, können Sie Ihren Code zeigen? –

Antwort

1

Schwierig, ohne zu sehen, Ihren Code zu beantworten.

Können Sie versuchen, scrollToItemAtIndexPath Methode zu verwenden?

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

Sie können zu jeder beliebigen Position blättern.

+2

Meinst du für mich, diese Methode zu verwenden, um die Bildlaufposition nach dem Einfügen der neuen Elemente auf einen bestimmten Punkt zu setzen? Ich habe das versucht und es hat das Problem nicht gelöst ... es hat zuerst die neue Scroll-Position gesetzt und dann ist das Ganze wieder hochgescrollt. – Andrew

Verwandte Themen