11

我正在实现UIScrollViewDelegate并用它做很多事情。但是,我刚刚发现了一个烦人的问题。

我希望scrollViewDidEndDecelerating:总是在scrollViewWillBeginDecelerating:之后被调用。但是,如果我只是触摸我的 ScrollView(实际上我正在触摸 scrollView 内的一个按钮),scrollViewDidEndDecelerating:会被调用,而scrollViewWillBeginDecelerating:不会被调用。

那么如何避免在我只需按下 UIScrollView 内的按钮时调用scrollViewDidEndDecelerating:呢?

谢谢!

4

2 回答 2

1

创建一个名为 buttonPressed 或类似名称的成员 BOOL,并在您的init:方法中将其初始化为 false。

每当按下按钮时将 BOOL 设置为 true,然后执行以下检查:

-(void)scrollViewDidEndDecelerating: (UIScrollView*)scrollView
{
    if (!buttonPressed)
    {
        // resume normal processing
    }
    else
    {
        // you will need to decide on the best place to reset this variable.
        buttonPressed = NO;
    }
}
于 2011-12-01T09:40:56.167 回答
1

我遇到了同样的问题,我通过创建一个保存当前页面编号的变量并将其与本地当前页面变量进行比较来修复它,如果它们 r 相等则不要继续。

var currentPage : CGFloat = 0.0
var oldPage : CGFloat = 0.0

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView){
    // Test the offset and calculate the current page after scrolling ends

    let pageWidth:CGFloat = scrollView.frame.width
    let currentPage:CGFloat = floor((scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1
    // Change the indicator
    print("that's the self.currentPage \(self.currentPage) and that's the current : \(currentPage)")

    guard  self.currentPage != currentPage else { return }
    oldPage = self.currentPage
    self.currentPage = currentPage;

    print("that's the old \(oldPage) and that's the current : \(currentPage)")

       //Do something
}
于 2017-07-28T13:16:45.783 回答