iOS:如果触摸位于特定区域内,则发送触摸事件以查看背后

问题描述 投票:0回答:2

我有一个视图,其中包含一些自定义UI控件。视图A大于屏幕上显示的UI控件。视图A位于ViewController A中,位于ViewController B的顶部(VC B是VC A的属性)。我想告诉我的手势识别器,当用户点击视图A中的特定区域时,视图A根本不应该响应触摸事件,但应该由VC B内的视图使用和处理。

一旦用户触摸视图A中的特定区域,我尝试将isUserInteractionEnabled设置为false,以便触摸事件将由视图A(或VC A)后面的视图自动处理。问题是,一个isUserInteractionEnabled设置为false,我不再能够在正确的视图A区域内响应触摸事件。

有没有更好的方法将触摸事件发送到视图A后面的视图,只有它位于视图A的特定区域?

enter image description here

ios swift uiview uigesturerecognizer touch-event
2个回答
1
投票

您可以覆盖pointInside方法以在控制器A中创建视图A以避免处理事件,效果就像isUserInteractionEnabled所做的那样。而且您还可以计算特定区域。

例:

class ViewA: UIView{
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        //assume this area has no response
        let areaNoResponses = CGRect(x: 10, y: 10, width: 100, height: 100) 

        if (areaNoResponses.contains(point)) {
            return false;  //no response, like ViewA.isUserInteractionEnabled = NO
        }
        return true;
    }
}

0
投票

VC B是VC A的属性

我假设VC B是VC A的子视图控制器。现在,如果View A掩盖了VC B的视图,那么你别无选择,只能让视图A响应触摸。同样,如果这些是分离的视图控制器和分离的视图,点击视图A将始终使其响应触摸。

您可以做的就是准确检测VC B的视图何时响应视图A上的触摸并将所需信息传递给VC B. VC B中的函数将按您的意图执行所需的任务。

例:

VC A:
let tapGesture = UITapGestureRecognizer(target:action:)
viewA.addGestureRecognizer(tapGesture)

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    //Assuming VC B has been initialized beforehand
    vcB.handleGestureFromVCA()
}

VC B:

@objc func handleGestureFromVCA() {
    // Code for VC B's views go here
}

希望这可以帮助。如果没有,请分享您尝试过的内容。

© www.soinside.com 2019 - 2024. All rights reserved.