我有一个自定义视图,通过单击视图控制器上的按钮或单击表视图单元格(表视图是视图控制器的子级)上的按钮来呈现
要关闭自定义视图,我希望用户能够点击屏幕上的任意位置以将其关闭。但是,由于视图控制器中视图的层次结构很多。一个简单的UITapGuestureRecognizer无法正常工作。这样的情况有解决方法吗?
答案 0 :(得分:1)
创建UIView
的子类,将其命名为MyTapView
。向此类分配父视图,该视图包含所有子视图。
在您的课程中重写以下内容,以拦截对您的view
实例的任何触摸。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
for (UIView *subview in self.subviews.reverseObjectEnumerator) {
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];
if (result != nil) {
return result;
}
}
}
// use this to pass the 'touch' onward in case no subviews trigger the touch
return [super hitTest:point withEvent:event];
}
此方法将忽略隐藏的视图对象,禁用的用户交互或alpha级别小于0.01的视图对象。确定点击次数时,该方法不会考虑视图的内容(可以随意修改)。因此,即使指定点位于该视图内容的透明部分中,该视图仍然可以返回,现在,在覆盖该视图之后,它会接收超出范围的触摸。