0

我有一个添加到 UIButton1 的 UIButton2:

按钮相交

操作@selector 仅在 UIButton2 与 UIButton1(“b”)相交的地方被调用。因此,在“a”或“c”区域中点击,操作方法 (addDockButtonTouchedDown) 不会被调用,但是当您在“b”部分中点击时会调用。这是一些代码:

    // button1 is created elsewhere in the code and is a subclass of UIButton for UI layout (has a footer label and title label set). nothing fancy going on.  button1 userInteractionEnabled is set to yes 
    // button2 is below... 
    NSString *dockPath = [[NSBundle mainBundle] pathForResource:@"AddToMyDock" ofType:@"png"];
    UIImage *dockImage = [UIImage imageWithContentsOfFile:dockPath];
    CGRect rect = CGRectMake(-20.0f, -10.0f + dockImage.size.height+1, dockImage.size.width, dockImage.size.height);
    UIButton *button2 = [[UIButton alloc] initWithFrame:rect];
    button2.userInteractionEnabled = YES;
    button2.exclusiveTouch = YES;
    [button2 setBackgroundImage:dockImage forState:UIControlStateNormal];
    [button2 addTarget:self action:@selector(addDockButtonTouchedDown:)
         forControlEvents:UIControlEventTouchDown];
    [button1 addSubview:button2];

任何想法为什么会发生这种情况以及如何解决它???请不要建议简单地使 button1 更大。

4

2 回答 2

2

首先,添加一个按钮作为另一个按钮的子视图并不是很常见的设计,我会避免这样做。只需创建一个包含两个按钮的容器 UIView。

您看到的问题是,虽然您的按钮可能会显示在其超级视图(另一个按钮)的边界之外,但不会注册按钮 1 边界之外的操作。您可以看到 button2 的唯一原因是因为clipsToBounds设置为NOon button1,这允许在其边界之外绘制其子视图。

因此,使您当前的解决方案有效的唯一方法确实是让 button1 更大。但是,更好的选择是创建足够大的超级视图以容纳两个按钮,并将两个按钮添加到其中。

于 2013-11-04T19:41:38.040 回答
0

它不适用于“a”和“c”区域,因为在调用 button1 时,触摸事件的命中测试在此处失败。您应该为 button1 子类化 UIButton 并使用以下内容覆盖命中测试:

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if(CGRectContainsPoint(self.childButton.frame, point)) {
        return [self.childButton hitTest:[self convertPoint:point toView:self.childButton] withEvent:event];
    }
    return [super hitTest:point withEvent:event];
 }

注意:在您的示例中,childButton 是 button2。

注意2:我认为无论如何这应该可行,这丑陋是设计问题的标志,但那是你的事。

于 2013-11-04T19:44:59.770 回答