2013-12-18 4 views
1

У меня есть горизонтальный UIScrollView, мне нужно, чтобы этот прокрутка просматривался. Но проблема в том, что мне также нужен «инерционный» эффект неопытного UIScrollView. Я уже давно искал поисковые запросы и собирал вещи, и мне не повезло.UIScrollView с «инерцией», но выгружен.

Любая идея или подсказка, чтобы я мог начать читать о том, как выполнить эту задачу?

Спасибо!

+0

Как вы хотите работать? Если вы промахнетесь очень быстро, вы хотите, чтобы он прокручивался некоторое время, не останавливаясь на следующей странице? – Macondo2Seattle

+0

именно это, но когда он останавливается, я хочу, чтобы он остановился на странице. – Andres

+0

Достаточно легко сделать что-то подобное, но это может приложить определенные усилия, чтобы он чувствовал себя хорошо. Я думаю, вам нужно будет полностью или частично переопределить кривую замедления, поэтому она останавливается там, где вы хотите. – Macondo2Seattle

ответ

3

Если подкачки отключен, вид прокрутки будет вызывать делегат при перемещении концов. Используя метод -scrollViewWillEndDragging:withVelocity:targetContentOffset: (iOS 5 и более поздние версии), вы можете определить цель на основе инерции и изменить значение, переданное для его изменения. Например, этот код в вашем делегате изменит цель так, чтобы вид прокрутки автоматически замедлялся до кратного размера границ.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(CGPoint *)targetContentOffset { 
    CGSize pageSize = scrollView.bounds.size; 
    targetContentOffset->x = pageSize.width * 
     round(targetContentOffset->x/pageSize.width); 
    targetContentOffset->y = pageSize.height * 
     round(targetContentOffset->y/pageSize.height); 
} 
+0

Единственный способ показать вам мою благодарность говорит: «Я ЛЮБЛЮ ТЕБЯ». Это работало отлично, я думал о том, чтобы сделать что-то еще труднее! БЛАГОДАРЯ!!!! – Andres

0

Я думал о решении с помощью метода 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; 
} 
+0

благодарит за вашу помощь! – Andres

Смежные вопросы