5

Sto facendo quella cosa da pull-down a refresh. In scrollViewDidEndDecelerating, controllo se l'offset è passato a un certo punto e in scrollViewDidEndDragging ho impostato contentInset in modo da mantenere visibile la sezione a discesa.UITableView pull per aggiornare causando sfarfallio. Come prevenirlo?

Tuttavia, questo risulta in sfarfallio, probabilmente a causa del reset di contentInset durante l'animazione a scorrimento. Ho pensato che potrei essere in grado di prevenire questo impostando il targetContentOffset in scrollViewWillEndDragging, ma non sembra fare il trucco.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 

    if (scrollView.contentOffset.y < -kRefreshViewDelta) 
    { 
     self.tableView.contentInset = UIEdgeInsetsMake(kRefreshViewHeight, 0.0f, 0.0f, 0.0f); 

    } 
} 

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    if (scrollView.contentOffset.y < -kRefreshViewDelta) 
    { 
      targetContentOffset->y = kRefreshViewHeight ; 
    } 
} 

risposta

10

Se si modifica il frame assegnato al UITableView a tutti (durante lo scorrimento o altro), farà sì che il contentInset per essere ripristinato al valore predefinito (0,0,0,0). C'è qualche stato il controllo per la mia, ma in sostanza questo è quello che ho fatto per la mia ...

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
        willDecelerate:(BOOL)decelerate { 
    if (scrollView.contentOffset.y < -kRefreshDeltaY) { 
    animation = ^{ 
     [self setContentInset:UIEdgeInsetsMake(kRefreshDeltaY, 
                  0, 0, 0)]; 
    }; 

    [UIView animateWithDuration:0.3 
          delay:0 
         options:UIViewAnimationOptionAllowUserInteraction 
        animations:animation 
        completion:completion]; 
    } // if 
} 

Finché non ho lay out subviews o cambiare la cornice del UITableView, si comportava bene per me.

0

Ho provato un meccanismo diverso per questo pull da aggiornare. Si prega di verificare il codice

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    if (!reloading) 
    { 
     checkForRefresh = YES; // only check offset when dragging 
    } 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (reloading) return; 

    if (checkForRefresh) { 
     if (refreshHeaderView.isFlipped 
      && scrollView.contentOffset.y > -65.0f 
      && scrollView.contentOffset.y < 0.0f 
      && !reloading) { 
      [refreshHeaderView flipImageAnimated:YES]; 
      [refreshHeaderView setStatus:kPullToReloadStatus]; 


     } else if (!refreshHeaderView.isFlipped 
        && scrollView.contentOffset.y < -65.0f) { 
      [refreshHeaderView flipImageAnimated:YES]; 
      [refreshHeaderView setStatus:kReleaseToReloadStatus]; 

     } 
    } 
} 
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
        willDecelerate:(BOOL)decelerate 
{ 
    if (reloading) return; 

    if (scrollView.contentOffset.y <= - 65.0f) { 
     if([self.tableView.dataSource respondsToSelector: 
      @selector(reloadTableViewDataSource)]){ 
      [self showReloadAnimationAnimated:YES]; 
      [self reloadTableViewDataSource]; 
     } 
    } 
    checkForRefresh = NO; 
} 


- (void)reloadTableViewDataSource 
{ 
    [self performSelectorOnMainThread:@selector(refresh) withObject:nil waitUntilDone:NO]; 

} 
4

La risposta di Mike ha funzionato per me (ma non ho potuto votare o commentare). Sembra che avvolgere il mio codice nel blocco dell'animazione abbia eliminato lo sfarfallio per me.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (scrollView.contentOffset.y < 0 && scrollView.contentInset.top < 0) 
    { 
     // shows table header view 
     // setting inset without using animation block causes flicker 
     [UIView animateWithDuration:0.1 animations:^ 
     { 
      scrollView.contentInset = UIEdgeInsetsZero; 
     }]; 
    } 

    // hides table header view 
    if (scrollView.contentOffset.y > 44 && scrollView.contentInset.top == 0) 
    { 
     scrollView.contentInset = UIEdgeInsetsMake(-44, 0, 0, 0); 
    } 
} 
+0

Grazie per questo. Presumo dal 44 che stavi anche cercando di ottenere una barra di ricerca come intestazione? – MusiGenesis

+0

@MusiGenesis infatti stavo nascondendo una barra di ricerca che l'utente poteva usare per buttarsi giù ma che sarebbe stata nascosta una volta che l'utente non la usava più. – sc0rp10n

+0

Sì, lo stesso qui. – MusiGenesis