【问题标题】:Why is my subclassed UIView not recieving touches moved when in a UIScrollView?为什么我的子类 UIView 在 UIScrollView 中没有收到移动的触摸?
【发布时间】:2010-01-15 01:46:12
【问题描述】:

我有一个名为 Boards 的类,它是 UIView 的子类,我分配了一个实例并将其放入 UIScrollView,我想而不是他触及到 UIScrollView,但是子视图:Boards(UIView),我只是不知道如何将触摸从UIScrollView 传递到UIView

P.S:我将手动更改UIScrollViewcontentOffset,因此我不需要UIScrollView 中的触摸,而是UIView

P.S:UIView 正在接收 touchesEndedtouchesBegan 事件,而不是 touchesMoved

【问题讨论】:

  • stackoverflow.com/questions/8485853/… 而不是:[self.nextResponder touchesMoved:touches withEvent:event];使用:[[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];

标签: iphone uiview uiscrollview touchesmoved


【解决方案1】:

如果您希望 UIScrollView 仅以编程方式滚动,则必须对其进行子类化并覆盖 touchesBegan/Moved/Canceled/Ended 方法。即使那样,您也可能会遇到问题。 UIScrollView 并非旨在忽略用户输入。

如果可能,您应该将 UIScrollView 替换为自定义视图。您可以更改视图的 transform 属性来移动其内容,而不是更改 contentOffset

或者你可以嵌套两个视图,一个外部视图和一个内部视图。将您的 Boards 视图放在内部视图中。然后,不要更改contentOffset,而是更改内部视图的frame

如果动画很重要,我很确定第二个选项将提供动画过渡,而第一个选项也可能。

【讨论】:

    【解决方案2】:

    为什么不创建 UIScrollView 的子类? 然后,将子类接收到的所有触摸事件传递给 UIView,如下所示。

    @implementation SubclassOfScrollView
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        [self.nextResponder touchesBegan:touches withEvent:event];
    }
    
    @end
    

    【讨论】:

      【解决方案3】:

      关于问题here 的新更新(包括指向 ZoomScrollView 源代码的链接 + 一些关于 UIScrollView 内部的出色解释)。
      另外,请查看 Apple 更新的 ScrollViewSuite 示例。它在第三个示例中有您描述的场景。

      【讨论】:

        【解决方案4】:

        尝试在滚动视图中关闭delaysContentTouches。这将立即将所有子触摸直接转发到子视图,而不检查它是否是 滚动视图触摸

        【讨论】:

        • 这不是一个只是告诉它等待的解决方案。不工作!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多