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];
}
}
}
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? –