2012-02-27 16 views
5

Estoy haciendo lo de desplegar para refrescar. En scrollViewDidEndDecelerating compruebo si el desplazamiento ha pasado cierto punto y en scrollViewDidEndDragging configuré el contentInset para mantener visible la sección desplegada.UITableView tire para actualizar causando parpadeo. ¿Cómo prevenirlo?

Sin embargo, esto produce un parpadeo, probablemente debido a que el contenido se reinicia durante la animación de desplazamiento. Pensé que podría evitar esto estableciendo el targetContentOffset en scrollViewWillEndDragging, pero no parece ser el truco.

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

Respuesta

10

Si cambia la estructura asignada a la UITableView en absoluto (durante el desplazamiento o de otra manera), que hará que el contentInset que desea restablecer a los valores predeterminados (0,0,0,0). No está comprobando algún estado de la mía, pero en esencia, esto es lo que he hecho por el mío ...

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

Mientras que no puse a cabo subvistas o cambiar el marco de la UITableView, se comportó bien para mi.

0

He intentado con un mecanismo diferente para que este tirón se actualice. Verifique el código

- (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 respuesta de Mike funcionó para mí (pero no pude votar ni comentar sobre ella). Parece que envolver mi código en el bloque de animación eliminó el parpadeo para mí.

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

Gracias por esto. Supongo desde el 44 que también estabas tratando de obtener una barra de búsqueda como encabezado? – MusiGenesis

+0

@MusiGenesis, de hecho, estaba ocultando una barra de búsqueda que el usuario podría desplegar para usar pero que se ocultaría una vez que el usuario ya no la usara. – sc0rp10n

+0

Sí, lo mismo aquí. – MusiGenesis

Cuestiones relacionadas