iOS操作:@当UIButton添加到另一个UIButton时,选择器问题。动作只在按钮相交的地方起作用

iOS操作:@当UIButton添加到另一个UIButton时,选择器问题。动作只在按钮相交的地方起作用,ios,iphone,objective-c,uibutton,selector,Ios,Iphone,Objective C,Uibutton,Selector,我有一个添加到UIButton1上的UIButton2: 只在UIButton2与UIButton1相交的地方调用@selector操作(“b”)。因此,点击“a”或“c”区域时,不会调用操作方法(AddDockButtoTuchedDown),但点击“b”部分时会调用。下面是一些代码: // button1 is created elsewhere in the code and is a subclass of UIButton for UI layout (has a foote

我有一个添加到UIButton1上的UIButton2:

只在UIButton2与UIButton1相交的地方调用@selector操作(“b”)。因此,点击“a”或“c”区域时,不会调用操作方法(AddDockButtoTuchedDown),但点击“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];

你知道为什么会发生这种情况以及如何解决吗???请不要建议简单地把钮扣变大

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

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

因此,使当前解决方案起作用的唯一方法实际上是将button1变大。但是,更好的选择是创建足够大的superview,以容纳两个按钮,并将两个按钮添加到superview中。

它不适用于“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:我认为无论这如何可行,它的丑陋是设计问题的标志,但这是你的事。

按钮中的按钮。。。有趣的。。。我可以问一下为什么吗?它当然不需要而且会被修复。我只是认为它会工作,并想知道为什么它没有工作,因为它是正确绘制的(下面由Scott解释)。按钮2是按钮1的UI删除(或添加)。button2的动作会特别影响button1。这就是为什么我认为可以这样做。好吧,这是有道理的。动态添加按钮2(仅通过长按按钮1添加)。我喜欢你的建议,要有一个足够大的superview,并在上面添加按钮。