Quiero que UIScrollView se desplace rápidamente después del barrido rápido, like this. Aunque, cuando se activa la búsqueda, el desplazamiento funciona one page at a time. ¿Es posible desplazarse rápidamente, cuando la búsqueda está habilitada con un simple movimiento de dedo sin una implementación manual utilizando reconocedores de gestos?Sensibilidad/velocidad de desplazamiento de UIScrollView con paginación
Respuesta
Esto es bastante sencillo, sin embargo, debe implementar el aspecto de paginación usted mismo (que es bastante simple). No necesitas reconocedores de gestos.
Swift
En primer lugar, ajuste su UIScrollView tasa de desaceleración:
scrollView.decelerationRate = UIScrollViewDecelerationRateFast
Asumamos que tenemos una gran variedad de contenidos - llamémoslo yourPagesArray
. En su UIScrollViewDelegate, aplicar el siguiente método:
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
//This is the index of the "page" that we will be landing at
let nearestIndex = Int(CGFloat(targetContentOffset.pointee.x)/scrollView.bounds.size.width + 0.5)
//Just to make sure we don't scroll past your content
let clampedIndex = max(min(nearestIndex, yourPagesArray.count - 1), 0)
//This is the actual x position in the scroll view
var xOffset = CGFloat(clampedIndex) * scrollView.bounds.size.width
//I've found that scroll views will "stick" unless this is done
xOffset = xOffset == 0.0 ? 1.0 : xOffset
//Tell the scroll view to land on our page
targetContentOffset.pointee.x = xOffset
}
También tendrá que aplicar el siguiente método delegado, para manejar el caso en que el usuario levanta su dedo suavemente sin causar ningún desaceleración de desplazamiento:
(actualización:.. es posible que no tenga que hacer esto bajo el último SDK de iOS parece que el método anterior delegado ahora se llama cuando hay velocidad cero)
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
{
if !decelerate
{
let currentIndex = floor(scrollView.contentOffset.x/scrollView.bounds.size.width)
let offset = CGPoint(x: scrollView.bounds.size.width * currentIndex, y: 0)
scrollView.setContentOffset(offset, animated: true)
}
}
Objective-C
Configuración de la velocidad de desaceleración:
scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
Luego, su desplazamiento implantación vista delegado:
- (void) scrollViewWillEndDragging:(UIScrollView *)scroll withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
//This is the index of the "page" that we will be landing at
NSUInteger nearestIndex = (NSUInteger)(targetContentOffset->x/scrollView.bounds.size.width + 0.5f);
//Just to make sure we don't scroll past your content
nearestIndex = MAX(MIN(nearestIndex, yourPagesArray.count - 1), 0);
//This is the actual x position in the scroll view
CGFloat xOffset = nearestIndex * scrollView.bounds.size.width;
//I've found that scroll views will "stick" unless this is done
xOffset = xOffset==0?1:xOffset;
//Tell the scroll view to land on our page
*targetContentOffset = CGPointMake(xOffset, targetContentOffset->y);
}
- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if(!decelerate)
{
NSUInteger currentIndex = (NSUInteger)(scrollView.contentOffset.x/scrollView.bounds.size.width);
[scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width * currentIndex, 0) animated:YES];
}
}
creo que podemos establecer scrollView.userInteractionEnabled = NO cuando nuestro dedo que toque. Y luego, cuando la animación se detenga, ábrela. Funciona para mí. Espero que te ayude.
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
scrollView.userInteractionEnabled = NO;
}
// at the end of scroll animation, reset the boolean used when scrolls originate from the UIPageControl
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
scrollView.userInteractionEnabled = YES;
}
- 1. Paginación UIScrollView con diferentes anchos de página
- 2. UITableViewController dentro de UIScrollView con paginación horizontal
- 3. Paginación UIScrollView con dos dedos y zoom
- 4. Paginación de UIScrollView personalizada con scrollViewWillEndDragging
- 5. Sincronización de desplazamiento UIScrollView
- 6. Desplazamiento programático de UIScrollView
- 7. UIScrollView dirección de desplazamiento
- 8. Color de desplazamiento UIScrollView?
- 9. UIScrollView con paginación + mostrando parte de las páginas anteriores/siguientes
- 10. Vista de desplazamiento con paginación en android
- 11. Desplazamiento animado de UIScrollView con CoreAnimation
- 12. Desplazamiento horizontal UIScrollView con gesto de desplazamiento vertical
- 13. Paginación UIScrollView con páginas vecinas que miran a escondidas
- 14. Desplazamiento horizontal infinito UIScrollView
- 15. UIScrollView no desplazamiento horizontal
- 16. iPhone - Anidar UIScrollViews para paginación horizontal y desplazamiento vertical
- 17. Limpiar transiciones de autorrotación en una paginación UIScrollView
- 18. Desplazamiento de una UITableView dentro de UIScrollView
- 19. UITextView dentro de UIScrollView problema de desplazamiento
- 20. UIScrollView: con la paginación habilitada, ¿puedo "cambiar" el ancho de página?
- 21. problema con uiscrollview paginación en iOS 6 usando storyboard
- 22. Desplazamiento continuo entre UIPanGestureRecognizer y reactivado UIScrollView
- 23. Extender UIScrollView y supervisar eventos de desplazamiento
- 24. UIScrollView: el desplazamiento no funciona
- 25. UIScrollView no mostrar el indicador de desplazamiento
- 26. Desplazamiento horizontal de UIScrollView en incrementos escalonados?
- 27. UIScrollView deshabilita el desplazamiento mientras gira en iPhone/iPad
- 28. Fuerza uiscrollview para rebotar desplazamiento incluso con un solo elemento
- 29. Cómo cancelar el desplazamiento en UIScrollView
- 30. UIScrollview setContentOffset con animación no lineal?
¿Alguna vez encontró una solución a esto? – Eric
Ojalá hubiera una buena solución para esto. Parece que hay dos formas de implementar esto: implementar manualmente reconocedores de gestos o implementar paginación manualmente. – UrK
Sí Es posible que lo haya implementado antes de 6 meses. puedes hacer manualmente los reconocedores de gestos ... – JohnWhite