2014-09-29 17 views
21

Ho una situazione strana con il mio UItableView.ios8 UITableView scolling indietro durante lo scorrimento

Sto caricando immagini da Internet e presentandole in una uitableviewcell in modo asincrono. Quando scorro verso il basso (cioè da 1 a 6 righe) lo scorrimento scorre verso il basso in modo uniforme proprio come mi aspetto.

Tuttavia, quindi si scorre verso l'alto (ad esempio riga 6 a 1) lo scorrimento salta indietro. per esempio se faccio scorrere dalla riga 6 alla riga 5, tornerò alla riga 6. La seconda volta che cerco di scorrere verso l'alto mi permette di risalire fino alla riga 4, ma poi mi riporta alla riga 5 o 6 ma di solito solo 5.

Quello che non capisco è perché questo sta accadendo in una sola direzione.

sembra essere effettuare ios 8 ma non ios 7.

Quindi è una differenza implementazione in quanto iOS 8 e 7 gestire l'UITableView.

Come posso risolvere questo?


Ecco il codice per darvi qualche contesto

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CVFullImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 
    CVComicRecord *comicRecord = self.comicRecords[indexPath.row]; 
    [cell.loaderGear stopAnimating]; 
    [cell.text setText:comicRecord.title]; 
    NSString *UUID = comicRecord.fullImagePageURL.absoluteString; 
    [cell setUUID:UUID]; 
    //Check if image is in the cache 
    UIImage *fullImage = [self.contentViewCache objectForKey:UUID]; 
    [cell setComicFullImage:fullImage]; 

    if (fullImage) { 
     return cell; 
    } 

    [cell.loaderGear startAnimating]; 

    [self requestImageForIndexPath:indexPath]; 
    return cell; 
} 

- (void)requestImageForIndexPath:(NSIndexPath *)indexPath { 
    CVComicRecord *comicRecord = self.comicRecords[indexPath.row]; 
    NSString *UUID = comicRecord.fullImagePageURL.absoluteString; 

    if ([self.contentViewCache objectForKey:UUID]) { 
     //if it is already cached, I do not need to make a request. 
     return; 
    } 

    id fd = CVPendingOperations.sharedInstance.fullDownloadersInProgress[UUID]; 

    if (fd) { 
     //if it is in the queue you do no need to make a request 
     return; 
    } 

    comicRecord.failedFull = NO; 
    CVFullImageDownloader *downloader = [[CVFullImageDownloader alloc] initWithComicRecord:comicRecord withUUID:UUID]; 
    [CVPendingOperations.sharedInstance.fullDownloaderOperationQueue addOperation:downloader]; 
    //when operation completes it will post a notification that will trigger an observer to call fullImageDidFinishDownloading 
} 

- (void)fullImageDidFinishDownloading:(NSNotification *)notification { 
    CVComicRecord *comicRecord = notification.userInfo[@"comicRecord"]; 
    NSString *UUID = notification.userInfo[@"UUID"]; 
    UIImage *fullImage = notification.userInfo[@"fullImage"]; 

    comicRecord.failedFull = NO; 

    [self.contentViewCache setObject:fullImage forKey:UUID]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     for (NSIndexPath *indexPath in [self.tableView indexPathsForVisibleRows]) { 
      CVFullImageTableViewCell *cell = (id)[self.tableView cellForRowAtIndexPath:indexPath]; 
      if (cell) { 
       if ([cell.UUID isEqualToString:UUID]) { 
        [cell.loaderGear stopAnimating]; 
        [cell setComicFullImage:fullImage]; 
        [cell layoutIfNeeded]; 
       } 
      } 
     } 
    }); 
} 

#pragma mark - Scroll 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    static int oldOffset = 0; 
    int newOffset = scrollView.contentOffset.y; 

    int dy = newOffset- oldOffset; 
    if (dy > 0) { 
     [self hideNavigationbar:YES animationDuration:0.5]; 
    } else if (dy < 0) { 
     [self hideNavigationbar:NO animationDuration:0.5]; 
    } 

    oldOffset = newOffset; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    if (decelerate == NO) { 
     [self prioritizeVisisbleCells]; 
     //currentPage is a property that stores that last row that the user has seen 
     [self setCurrentPage:[self currentlyViewedComicIndexPath].row]; 
    } 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    [self prioritizeVisisbleCells]; 
    //currentPage is a property that stores that last row that the user has seen 
    [self setCurrentPage:[self currentlyViewedComicIndexPath].row]; 
} 

- (void)prioritizeVisisbleCells { 
    NSArray *ips = [self.tableView indexPathsForVisibleRows]; 
    NSArray *activeIndexPaths = [CVPendingOperations.sharedInstance.fullDownloadersInProgress allKeys]; 

    //add visible cells to queue first 
    NSSet *visible = [NSSet setWithArray:ips]; 
    NSMutableSet *invisible = [NSMutableSet setWithArray:activeIndexPaths]; 
    [invisible minusSet:visible]; 

    for (NSIndexPath *ip in invisible) { 
     NSOperation *op = CVPendingOperations.sharedInstance.fullDownloadersInProgress[ip]; 
     [op setQueuePriority:NSOperationQueuePriorityNormal]; 
    } 

    for (NSIndexPath *ip in visible) { 
     NSOperation *op = CVPendingOperations.sharedInstance.fullDownloadersInProgress[ip]; 
     [op setQueuePriority:NSOperationQueuePriorityHigh]; 
    } 
} 
+0

Che aspetto ha il codice per la configurazione delle celle? –

+0

Ho scoperto che questo bug ha effetto su iOS 8 ma non su iOS 7 – DerrickHo328

+0

@ Calimari328 Per favore rispondi alla domanda che ti è stata fatta. Non c'è nessun bug di iOS 8 qui. Questo è qualcosa che stai facendo di sbagliato. Se vuoi aiuto, devi _show_ cosa stai facendo. – matt

risposta

4

ho trovato la risposta in questo post molto utile: Table View Cells jump when selected on iOS 8

cercare di attuare il tableView:estimatedHeightForRowAtIndexPath: nel protocollo UITableViewDelegate. Per me funziona.

+3

In realtà ho implementato questo metodo delegato con un valore hard coded. Sta ancora saltando in giro. Ma forse il bug è legato al fatto che le altezze siano state sovrascritte. Esplorerò cosa succede quando aggiusto tutti gli altri metodi relativi all'altezza – DerrickHo328

+0

Grazie !! Funziona anche per me. –

1

Implementare l'auto-dimensionamento e correggere i vincoli di visualizzazione nello storyboard.

nel codice mettere questo insieme

tableView.rowHeight = UITableViewAutomaticDimension; tableView.estimatedRowHeight = CGFloat valore (il valore iniziale)

-1

Si dovrebbe calcolare l'altezza della riga da soli e si dovrebbe rimuovere tutto sull'altezza di riga stimata nel codice.

1

Questo problema esatto mi stava accadendo mentre stavo usando lo UITableViewAutomaticDimension e lo estimatedRowHeight, come suggerito da @ nferocious76.

Il problema era che il mio estimatedRowHeight era 400.0 mentre l'altezza effettiva della riga era più simile a 80.0 (l'ho copiata/incollata da un'altra vista tabella nella mia app con celle grandi). Non mi sono mai preso la briga di cambiarlo perché avevo letto da qualche parte che lo estimatedRowHeight non importava fino a quando era maggiore di rispetto all'altezza effettiva della riga, ma a quanto pare non è così.

Problemi correlati