如何增加UIButton hittest区域?

时间:2012-09-03 15:46:44

标签: ios uibutton hittest

我需要一些快速原型iPad应用程序演示的帮助。

我有一个带有一些图形元素的大背景图像。 然后我在这个视图上创建了一个自定义UIButton。 不幸的是我需要增加该按钮的命中测试区域。 所以用户应该认为触摸该图形背景元素也具有与按下直接放在该细节旁边的按钮相同的功能。

通过覆盖hittest:withEvent方法,该按钮将突出显示,但不幸的是,不会为UIControlEventTouchUpInside调用其目标/选择器。

知道如何让它发挥作用吗? 谢谢你的帮助

更新 在UIControl类引用中,我找到了“sendActionsForControlEvents”方法,我直接在“返回自我”之前将其包括在内:

    [self sendActionsForControlEvents:UIControlEventTouchUpInside];

现在可以识别触摸,但是“Hittest”日志将被调用两次。 我只需要打两次电话。如果有办法,我会没事的。)

更新2:

这是一个示例图表,希望有所帮助。

@implementation HotSpotButton
@synthesize data = _data;  
- (id)initWithDictionary:(HotSpotDataObject*)hotspotData
{        
    self.data = hotspotData;

    UIImage* img = loadImageWithoutCaching(@"infospot.png");     
    CGRect frame = CGRectMake(hotspotData.posX, hotspotData.posY, img.size.width, img.size.height);

    self = [super initWithFrame:frame];
    if (self) {

        [self setBackgroundColor:[UIColor darkGrayColor]];  //clearColor
        [self setAlpha:1];
        [self setBackgroundImage:img forState:UIControlStateNormal];
        [self setAdjustsImageWhenHighlighted:YES];
        [self setShowsTouchWhenHighlighted:YES];    

        // Animate the hotspot itself ==================================
         CABasicAnimation *scale =[CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
        // some pusling 
        [self.layer addAnimation:scale forKey:@"animateScale"];  
    }
    return self;
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    int errorMargin = 30;
    CGRect largerFrame = CGRectMake(0 - errorMargin, 0 - errorMargin, self.frame.size.width + errorMargin + 1024, self.frame.size.height + errorMargin);

    if ((CGRectContainsPoint(largerFrame, point)) == 1){
        NSLog(@"HITTEST");

        [self sendActionsForControlEvents:UIControlEventTouchUpInside];        
        return self;
    }
    else{
        NSLog(@"Outside");
        return nil;
    }

}
@end

3 个答案:

答案 0 :(得分:2)

这更容易!!!

您可以使UIButton的框架比实际上的按钮图像大很多,然后将按钮的图像对齐到您想要的位置:

[someButton setFrame:CGRectMake(0, -9, self.view.frame.size.width+9, self.view.frame.size.height)];
//set image instead of this comment
someButton.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
someButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;

......例如。

如果您希望将图像放在特定的某个位置,则可以将UIControl子类化,并将所需的图像添加到子视图中。容易。

现在,我想,你不再需要hitTest方法......

答案 1 :(得分:1)

如果我理解正确的话。我相信你想增加/减少touchUpInside区域。它从内到外变化的点?

我用UISlider的拇指区域做了这个。在这里查看我的问题和答案Retrieve and change the point at which touchUpInside changes to touchUpOutside 它是通过覆盖UIButton的触摸方法实现的,因此您必须将UIButton子类化。

如果您在touchesEnded方法中绘制坐标,您会看到它在按钮周围创建了一个更大的框,因此您只需更改坐标以满足您的需求。

答案 2 :(得分:0)

我相信您的代码会被调用两次,因为我相信此代码中的“self”是指View?

[self sendActionsForControlEvents:UIControlEventTouchUpInside];

您应该使用:

[self.myButton sendActionsForControlEvents:UIControlEventTouchUpInside];