2

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

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

-(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!
}
4

1 回答 1

7

根据您的回复,我可以安全地得出结论,您的问题是按钮的父视图不包含其交互区域中的按钮。您仍然可以看到它们,因为您没有剪切子视图,但您仍然无法与它们交互。有两种选择可以解决您的问题

a)(推荐)将按钮放置在适当的位置,以便它们在可见(和父视图的交互区域)内

b) 覆盖父视图的 hitTest 选择器,以便它跟踪其子视图中的所有触摸,包括其边界之外的触摸。为此,您必须创建 UIView 的子类并实现以下内容:

-(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;

}

于 2013-04-22T08:42:27.337 回答