Подтвердить что ты не робот

(iphone) force scrollViewDidEndDecelerating для вызова после программной прокрутки представления?

Я анимирую свиток с помощью scrollRectToVisible:animated:

Но scrollViewDidEndDecelerating не вызывается.

Есть ли способ заставить функцию вызываться?

4b9b3361

Ответ 1

scrollViewDidEndDecelerating не будет вызываться для scrollRectToVisible или setContentOffset (т.е. прокрутки программно). Если вы заметили объявление этого метода в заголовочном файле, в нем четко указано, что он "вызывается пальцем вверх, когда мы двигаемся".

Теперь, чтобы решить вашу проблему, будет вызван делегат scrollViewDidEndScrollingAnimation (для setContentOffset и scrollRectToVisible), который вы можете использовать.

Ответ 2

Как вы уже нашли, scrollViewDidEndDecelerating не всегда вызывается (если вы переместили прокрутку в свой палец и остановили его, он также не будет вызван).

Так как scrollViewDidEndDecelerating - это метод делегата, вы можете заставить его вызывать вот так:

[[scrollView delegate] scrollViewDidEndDecelerating:scrollView];

Ответ 3

Я решил его, вызвав scrollViewDidEndDecelerating из scrollViewDidEndScrollingAnimation

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

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    //your code
}

Ответ 4

Добавление кода ниже исправлено в моем случае.

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        scrollViewDidEndDecelerating(scrollView)
    }
}

Ответ 5

  1. Используйте scrollView.delegate.

  2. Для очень плавной анимации представления вы должны добавить функцию делегата.

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate, decelerate: Bool)  { 
    if decelerate == false {
        scrollViewDidEndDecelerating(scrollView)
    }
}