我的自定义UIView dos不接收触摸

使用IB,我创build了一个包含几个button的小型子视图。 我的控制器从xib文件读取小视图,并将其作为子视图添加到主视图。 它加载好,我可以看到子视图和所有的button。 据我所知,它也连接到控制器中的IBOutlets和IBActions。

但是,当我按下button什么都没有发生! 事实上,当我按下button超级视图的touchesBegan被调用! 超级视图也包含一个“普通button”(即我的子视图的兄弟),该button工作正常! 问题:为什么我的子视图上的button不起作用?

-(void) loadMultibutt{ self.buttErase = nil; // test if the outlet connects NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"multibutt_ipad" owner:self options:nil]; UIView *viewButts = [arr objectAtIndex:0]; ViewWorkbench* vw = (ViewWorkbench*) self.view; [vw addMultibuttView:viewButts]; // now, buttErase != nil. NSSet *setTest = [self.buttErase allTargets]; NSLog(@"setTest = %@", setTest); // This works! } 

基于你的回复,我感到安全的是,你的问题是你的button的父视图不包含交互区域中的button。 你仍然可以看到他们,因为你没有剪裁子视图,但仍然无法与他们交互。 有两个选项来解决你的问题

a)(推荐)将button放在正确的位置,以便它们位于可见的(和父视图的交互区域)

b)覆盖父视图的hitTestselect器,以便跟踪其子视图中的所有触摸,包括其边界外的所有触摸。 为此你将不得不创build一个UIView的子类并实现以下function:

 -(UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event{ UIView* result = [super hitTest:point withEvent:event]; if (result) return result; for (UIView* sub in [self.subviews reverseObjectEnumerator]) { CGPoint pt = [self convertPoint:point toView:sub]; result = [sub hitTest:pt withEvent:event]; if (result) return result; } return nil; 

}