我有一个视图,其中包含一些自定义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的特定区域?
您可以覆盖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;
}
}
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
}
希望这可以帮助。如果没有,请分享您尝试过的内容。