Конфликт методов делегата UIScrollView

Я использую следующие два метода делегата UIScrollView для вызова другого метода в моем UIViewController:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // do something
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    // do something
}

Я пробовал разные способы вызова // делать что-то, но либо оба не вызываются, либо вызываются оба метода делегата, вызывая // делать что-то дважды в определенных ситуациях. Например:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    if(![scrollView isDecelerating] && ![scrollView isDragging]){
        //do something
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    if(!decelerate){
        //do something
    }
}

Итак, с приведенным выше, если я прокручиваю и позволяю ему медленно останавливаться, он вызывает scrollViewDidEndDecelerating :, но если я прокручиваю и останавливаю его касанием, он вызывает как scrollViewDidEndDragging:, так и scrollViewDidEndDecelerating:

Я хочу, чтобы он вызывал один или другой ... могу ли я что-нибудь сделать с scrollViewDidEndDecelerating: и объектом scrollView, чтобы остановить этот двойной вызов метода?


person mootymoots    schedule 02.08.2011    source источник
comment
Не могли бы вы пояснить, чего именно вы хотите?   -  person Praveen S    schedule 02.08.2011
comment
Разве вы не можете просто попробовать scrollViewDidScroll метод, если у вас нет сложных дел?   -  person visakh7    schedule 02.08.2011
comment
scrollViewDidScroll слишком тяжелый. Я разместил решение ниже. Я в основном хочу, чтобы метод срабатывал, когда прокрутка останавливается либо путем естественного замедления, либо когда пользователь останавливает операцию перетаскивания.   -  person mootymoots    schedule 02.08.2011


Ответы (3)


Делегат представления прокрутки выполняет свою работу. Вы не можете предотвратить это. Но с помощью простой логики вы можете добиться того, что пытаетесь сделать.

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

    dragged = YES;
    // do something
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (!dragged) {

         // do something
    }

    dragged = NO;
}
person EmptyStack    schedule 02.08.2011
comment
ВНИМАНИЕ: scrollViewDidEndDecelerating не может быть вызван после scrollViewDidEndDragging - person Peter Lapisu; 14.03.2015

// очень простой

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

    if(!decelerate){
         // Do something 
    }

}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
       // Do something 
}
person Sunil Adhyaru    schedule 18.02.2013

Кажется, это работает. Близко к ответу EmptyStack

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (!dragged) {
        //do something
    }

    dragged = NO;
}

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

    if(!decelerate){
        dragged = YES;
        //do something
    } else {
        dragged = NO;
    }
}
person mootymoots    schedule 02.08.2011