Я думал о решении с помощью метода scrollViewDelegate: scrollViewDidScroll. В методе я проверяю скорость и применяю пейджинг только в том случае, если скорость прокрутки меньше определенного значения, поэтому она будет поддерживать инерцию. Я не использую обычный пейджинг UIScrollView, но вместо этого вызываю метод setContentOffset, поэтому я могу применить пейджинг в нужное время. Код может выглядеть чересчур сложным, но вы, вероятно, можете разделить его на более мелкие методы и сделать его более привлекательным. Поиграйте с двумя константами и посмотрите, что лучше всего работает. Надеюсь, он по крайней мере помог вам в правильном направлении.
Маттиас
#define SPEED_MIN = 2
#define SPEED_MAX = 10
{
CGFloat prevX;
BOOL dragging;
NSInteger page;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat nextX = scrollView.contentOffset.x;
CGFloat speedX = nextX - prevX;
speedX = (speedX < 0 ? -speedX : speedX);
prevX = nextX;
if (dragging)
{
if (speedX < SPEED_MIN && page < 0)
{
page = [self getClosestPage:scrollView];
[scrollView setContentOffset:CGPointMake(page * scrollView.frame.size.width, 0) animated:YES];
[scrollView setScrollEnabled:NO];
}
else if (scrollView.contentOffset.x == page * scrollView.frame.size.width)
{
page = -1;
dragging = false;
[scrollView setScrollEnabled:YES];
}
}
else
{
dragging = speedX > SPEED_MAX;
}
}
- (NSInteger)getClosestPage:(UIScrollView *)scrollView
{
CGFloat x = scrollView.contentOffset.x;
CGFloat w = scrollView.frame.size.width;
NSInteger nbrOfPages = scrollView.contentSize.width/w;
for (int i = 0; i < nbrOfPages; i++) {
CGFloat dx1 = x - i*w;
CGFloat dx2 = (i+1)*w - x;
if (dx1 > 0 && dx2 > 0) {
if (dx1 >= dx2) {
return i;
} else {
return (i+1 < nbrOfPages ? i+1 : i);
}
}
}
return 0;
}
Как вы хотите работать? Если вы промахнетесь очень быстро, вы хотите, чтобы он прокручивался некоторое время, не останавливаясь на следующей странице? – Macondo2Seattle
именно это, но когда он останавливается, я хочу, чтобы он остановился на странице. – Andres
Достаточно легко сделать что-то подобное, но это может приложить определенные усилия, чтобы он чувствовал себя хорошо. Я думаю, вам нужно будет полностью или частично переопределить кривую замедления, поэтому она останавливается там, где вы хотите. – Macondo2Seattle