(iphone)在以编程方式滚动视图后强制调用ScrollViewDiEndDecelling?

(iphone)在以编程方式滚动视图后强制调用ScrollViewDiEndDecelling?,iphone,animation,uiscrollview,Iphone,Animation,Uiscrollview,我使用scrollRectToVisible:animated: 但是没有调用ScrollViewDiEndDecelling 有没有办法强制调用该函数?正如您所发现的,并不总是调用ScrollViewDiEndDecelling(如果您用手指移动滚动视图并使其停止,也不会调用它) 由于ScrollViewDiEndDecreating是一种委托方法,因此您可以强制按如下方式调用它: [[scrollView delegate] scrollViewDidEndDecelerating:scro

我使用
scrollRectToVisible:animated:

但是没有调用
ScrollViewDiEndDecelling


有没有办法强制调用该函数?

正如您所发现的,并不总是调用
ScrollViewDiEndDecelling
(如果您用手指移动滚动视图并使其停止,也不会调用它)

由于
ScrollViewDiEndDecreating
是一种委托方法,因此您可以强制按如下方式调用它:

[[scrollView delegate] scrollViewDidEndDecelerating:scrollView];

ScrollViewDiEndDecreating
不会为
scrollRectToVisible
setContentOffset
调用(即,以编程方式滚动)。如果您注意到头文件中这个方法的声明,它会清楚地提到它是“在我们移动的时候用手指向上调用的”


现在,为了解决您的问题,将调用
ScrollViewDiEndScrollingAnimation
委托(用于
setContentOffset
scrollRectToVisible
),您可以使用它。

我通过从ScrollViewDiEndScrollingAnimation调用ScrollViewDiEndScrollingAnimation解决了这个问题

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

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

添加下面的代码修复了我案例中的一个问题

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        scrollViewDidEndDecelerating(scrollView)
    }
}
  • 使用
    scrollView.delegate

  • 要使视图的动画非常平滑,应添加代理函数


  • KKK4SO:ScrollViewDidEndDeclaration在scrollRectToVisible scrollViewDidEndScrollingAnimation中不会被调用,在实际手指滚动中不会被调用,这正常吗?@Eugene:是的,非常正常。scrollViewDidScroll:delegate响应这两个选项。OMFG谢谢!我在QA处来回走动,无法重新编程一个bug,结果我只是滚动屏幕,与他们的不同:)你把这个称为什么?如果你同时使用手动滚动和程序滚动(即使用
    setContentOffSet
    ),这也可以工作吗?也就是说,如果您使用此格式,并且手动滚动,则不会调用两次
    ScrollViewDiEndDecelling
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate, decelerate: Bool)  { 
        if decelerate == false {
            scrollViewDidEndDecelerating(scrollView)
        }
    }