【问题标题】:scrollViewDidEndDecelerating being called for a simple touchscrollViewDidEndDecelerating 被调用以进行简单的触摸
【发布时间】:2012-01-10 04:44:54
【问题描述】:

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

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

那么,当我在 UIScrollView 中按下一个按钮时,如何避免 scrollViewDidEndDecelerating: 被调用?

谢谢!

【问题讨论】:

  • 有什么解决办法吗?

标签: ios uiscrollview uiscrollviewdelegate


【解决方案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
}

【讨论】:

    【解决方案2】:

    创建一个名为 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;
        }
    }
    

    【讨论】:

    • 嘿,是的,这是一种可能的答案。但是,我真正想要的是不调用该方法,特别是在未调用 scrollViewWillBeginDecelerating: 时。 F 对于这种 hack,我想稍微延迟执行按钮操作可能会更有用,以便完成触摸。我也不能确定是我的按钮触发了该方法调用,所以我永远无法确定我是否在正确的位置重置了那个 var ... :(
    • 听起来你想要一个 hack 答案,但没关系。我会再看一下类参考中委托方法的描述,设置您在问题中列出的所有方法,并了解如何/为什么/何时调用它们。此外,如果您为按钮设置标签并实现 -(void)buttonPressed: (id)sender 方法,您可以更有效地响应独特的按钮按下。
    • 按钮是我发现问题的方式。但问题本身是 scrollViewDidEndDecelerating:* 在仅触摸滚动视图内的按钮时被调用。没有减速,也没有 willBeginDragging: ... 无论如何感谢您的努力。可能每次您只需点击 scrollView 时都会调用该方法,即使您点击了将触摸的内部视图(如 UIButton)
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多