当userInteractionEnabled = YES时,如何将触摸事件传递给superview?

我有以下设置。

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

一个XXXCustomControl是UIControl的子类。 它包含一个名为contentView的子视图,其types为UIView,其大小小于控件的区域。该视图具有.userInteractionEnabled = YES;

我需要该属性设置为YES,因为水平滚动视图会放在这里一会儿,他们需要滚动。 如果超级视图(在我们的情况下,内容视图不允许用户交互,这是子视图inheritance)。但是,同时这XXXCustomControl需要是可点击时,它的内容视图不包含滚动视图不仅在区域A,而且还在区域B.

所以我在这里有一个“利益冲突”,因为我也是

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

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

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

这可能吗?

您可以尝试在内部视图中重写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; } } 

你可以子类化你的子视图,并执行

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!touchedContent) { [[self nextResponder] touchesBegan:touches withEvent:event]; } else { [super touchesBegan:touches withEvent:event]; } } 

你可以使用另一个UIView来“隐藏”子视图。

*详细信息:这个UIView是子视图的兄弟。 它具有相同的大小和你的子视图的位置与背景颜色清晰的颜色。

*解释:新的UIView将接触,并自动传递给超级视图。

这种方式不需要子类化你的子视图 – 这是一个故事板的解决scheme。
请试试这个。 玩的开心!