一尘不染

当userInteractionEnabled = YES时如何将触摸事件传递给超级视图?

swift

我有以下设置。

+- XXXCustomControl : UIControl -------+
| A                                    |
|   +- ContentView -------------------+|
|   |                                 ||
|   |  B                              ||
|   |                                 ||
|   +---------------------------------+|
+--------------------------------------+

一个XXXCustomControl,它是UIControl的子类。它包含一个子视图称为内容查看UIView的类型与大小比控制的区域小..这种观点有.userInteractionEnabled = YES;

我需要将该属性设置为YES,因为水平滚动视图会不时地放入其中,并且它们必须是可滚动的。如果超级视图(在我们的示例中,内容视图不允许用户交互,则继承于子视图。)但是XXXCustomControl与此同时,当它的内容视图中不仅在区域A中而且在内容视图中均不包含滚动视图时,必须可以点击此视图B区。

所以我这里有一个“利益冲突”,因为我要么

1)将内容视图设置为userInteractionEnabled = NO,然后我可以在A和B的内容视图区域中点击空白控件,但是我将放置在其中的滚动视图将无法滚动。

2)将内容视图设置为,userInteractionEnabled = YES但是,如果控件为空,我只能点击区域A来触发触摸事件。

我想到的一个想法是,默认情况下我将该属性设置为NO,并且当填充contentView时,将其设置为yes。当我清除contentView时,我将该属性设置为no。基本上,我希望一直将其设置为yes,当它为空时,强制contentView将touchUpInside事件传递到其超级视图。

这可能吗?


阅读 245

收藏
2020-07-07

共1个答案

一尘不染

您可以尝试pointInside:withEvent:在内部视图中覆盖该方法。当您希望将触摸前移到超级视图时,这将使您返回NO:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if( /* You have content, and you want to receive touches */){
        return YES;
    }else{
        return NO;
    }
}
2020-07-07