使用overlay UIView后如何将触摸事件转发给下方的UIScrollView?

6

我有一个关于iOS/Swift中触摸处理的问题:

我的项目看起来像这样

UIViewController
     → UIView
          → OverlayView (UIView)
          → ScrollView (UIScrollView)

OverlayView位于UIScrollView之上,两者都是UIViewController视图的子视图。

我这样做的原因是希望滚动视图在正常情况下(平移、缩放)运作,而遮罩视图不受滚动视图可见内容变化的影响。此外,遮罩视图应处理触摸事件,以显示滚动视图下方内容的指南。

我现在面临的问题是,遮罩视图上的触摸事件(touchesBegan、touchesMoved、touchesEnded、touchesCancelled)未传递到滚动视图(滚动视图不会平移/缩放)。

我找到了一种解决方案,可以通过重写point(inside point: CGPoint, with event: UIEvent?) -> Bool并返回false来将触摸事件转发到下面的视图。但这样遮罩视图上的触摸事件就无法调用。

有没有人有想法如何实现这种行为?我尝试在遮罩视图中调用所有下一个响应者的触摸事件,但这也没有效果。

感谢您的帮助!


不要在滚动视图上使用概述,请创建UIScrollview的子类并在其中处理触摸。 - PlusInfosys
你找到解决方案了吗? - sudoExclaimationExclaimation
2个回答

1

我认为你在point(inside point: CGPoint, with event: UIEvent?) -> Bool方面已经走在了正确的轨道上。

在你的“叠加”视图中,检查点是否在子视图内。如果是,则返回true以允许与子视图交互。如果不是,则返回false以将触摸“传递”到底层滚动视图。

class PassThruOverlayView: UIView {

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {

        for v in subviews {

            let ptInSub = v.convert(point, from: v.superview)
            if v.bounds.contains(ptInSub) {
                return true
            }

        }

        return false

    }

}

你可以在此处查看一个工作示例(显示“重叠的滚动视图”和“UIScrollView上的UIView覆盖”):https://github.com/DonMag/ScrollViewPassThru

谢谢您的回答!问题是,我需要在覆盖视图和滚动视图中都使用触摸事件 :-/ - Lars Petersen
嗯...所以,你想 - 例如 - 在覆盖视图中点击一个按钮并触发一个动作同时在底层滚动视图中也触发同样的点击吗? - DonMag
没错!这样做的目的是,在滚动视图中有一种绘图画布,我想在覆盖视图中插入精确绘制的指南。我这样做的原因是,我不希望指南随着滚动视图的内容缩放。 - Lars Petersen
你能否展示一下你想要做的事情的例子吗?比如说,你在覆盖视图上有一个 UISlider,当你来回拖动滑块时,你是否也希望在“画布”上绘制一条线?我认为你可能希望触摸在覆盖层的某个部分进行注册,或者在画布上进行注册,但不能同时两者都进行。 - DonMag

0
你最好查找一下 hitTest (docs) - 在你的子类(overlay)中创建逻辑,决定何时将触摸事件传递到下面的视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接