0

Я должен обновлять текст ярлыка каждый раз, когда я просматриваю UIScrollView ... или каждый раз, когда я прокручиваю и оставляю его в точке на своем собственном. Это обновление текста метки выполняется на основе contentoffset scrollview. Так что теперь я ставлю проверки в каждом методе:Как я могу предотвратить резкую прокрутку UIScrollView, если у меня есть вычисления в EndDecelerating, EndDragging и DidScroll?

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ 
    int one = scrollView.contentOffset.x/21; 
    int two = (21*one)+14; 
    CGPoint point = CGPointMake(two, scrollView.contentOffset.y); 
    [scrollView setContentOffset:point animated:YES]; 
    [self setLabelText:@"scroll"]; 
} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 
    int one = scrollView.contentOffset.x/21; 
    int two = (21*one)+14; 
    CGPoint point = CGPointMake(two, scrollView.contentOffset.y); 
    [scrollView setContentOffset:point animated:YES]; 
    [self setLabelText:@"scroll"]; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    CGPoint offset = scrollView.contentOffset; 
    if (offset.x < minuteScrollMinX) offset.x = minuteScrollMinX; 
    if (offset.x > minuteScrollMaxX) offset.x = minuteScrollMaxX; 
    scrollView.contentOffset = offset; 
} 

Теперь после этого, мой Scrollview становится слишком прерывисто, как я могу предотвратить это прерывистый прокруткой Scrollview? Есть ли общий делегат вместо этих трех методов или даже два лучших метода? Заранее благодарим за любую помощь.

+0

возможно переназначение contentOffset все время не делает его счастливым, попробуйте сделать это, что он только получает переназначен, если смещение на самом деле изменения (в 'scrollViewDidScroll:'). мне кажется, что это должно быть хорошо, хотя – Fonix

ответ

2

Расчеты здесь не должны испортить вашу прокрутку. Проблема вызвана конфликтом между двумя верхними методами:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; 
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; 

Вы должны проверить willDecelarate аргумент в первом методе. Если это правда, ничего не делать - scrollViewDidEndDecelerating будет вызван в конечном итоге. Если это неверно, сделайте здесь calc. Когда значение willDecelarate истинно, вы вызываете свой расчет из обоих методов, что испортит прокрутку.

Так как в обоих случаях календарные вычисления одинаковы, вы также можете разложить их на общий метод.

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ 
     [self calculateScrollOffset]; 
    } 

    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
         willDecelerate:(BOOL)decelerate 
    { 
     if (!decelerate) { 
      [self calculateScrollOffset]; 
      } 
    } 


- (void) calculateScrollOffset 
{ 
    int one = scrollView.contentOffset.x/21; 
    int two = (21*one)+14; 
    CGPoint point = CGPointMake(two, scrollView.contentOffset.y); 
    [scrollView setContentOffset:point animated:YES]; 
    [self setLabelText:@"scroll"]; 
} 
+0

Спасибо большое .. ты сделал мой день :) отрывистый сниженный более чем на 40% ... отдых Я пытаюсь минимизировать вычисления внутри каждого метода. – keepsmiling