UIScrollView: establece el contenido negativo de inicio cuando se inicia la animation de rebote.

Estoy utilizando una UITableView para lograr un efecto de escala / desennetworkingo en la image de perfil de mi usuario (como en la aplicación Spotify) cuando UITableView el UITableView a un contenido negativoOffset.y. Todo funciona bien …

Ahora, cuando un usuario baja a un contentOffset.y más pequeño o igual a un cierto valor -llamamos que maintainOffsetY = 70.0 y él "suelta" la vista, me gustaría mantener este contentOffset hasta que el usuario "empuje" la vista de nuevo, en lugar de la vista para volver automáticamente a contentOffset = (0,0) nuevamente.

Para lograr esto, debo saber cuándo comenzaron y finalizaron los toques, lo que puedo hacer con los siguientes methods de delegado:

 - (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView { // is like touches begin if ([scrollView isEqual:_tableView]) { NSLog(@"touches began"); _touchesEnded = NO; } } - (void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { // is like touches ended NSLog(@"touches ended"); if ([scrollView isEqual:_tableView]) { _touchesEnded = YES; } 

}

Luego en

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 

contentOffset.y si contentOffset.y es menor o igual que maintainOffsetY y si el usuario ya ha "dejado ir" la tabla, por lo que está a punto de rebotar (o ya rebotando) en contentOffset = (0,0) .

No parece posible dejar que se recupere solo al maintainOffsetY . ¿Alguien sabe una solución o tener una idea sobre cómo resolver esto?

¡Cualquier ayuda es muy apreciada!

Para establecer un desplazamiento negativo en una vista de desplazamiento, puede usar esto.

Debe save el recuadro de contenido inicial de la vista de desplazamiento. Ya no puede ser 0, si tiene una barra de navigation translúcida, por ejemplo.

  - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; contentInsetTopInitial = self.tableView.contentInset.top; } 

Luego escribe esto.

 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { CGPoint contentOffset = scrollView.contentOffset; // need to save contentOffset before changing contentInset CGFloat contentOffsetY = contentOffset.y + contentInsetTopInitial; // calculate pure offset, without inset if (contentOffsetY < -maintainOffsetY) { scrollView.contentInset = UIEdgeInsetsMake(contentInsetTopInitial + maintainOffsetY, 0, maintainOffsetY, 0); [scrollView setContentOffset:contentOffset animated:NO]; } } 

Espero que esto te ayude.