-1

我需要一些帮助来进行快速原型 iPad 应用演示。

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

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

知道如何使它工作吗?谢谢你的帮助

更新: 在 UIControl 类参考中,我找到了在“return self”之前直接包含的“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
4

3 回答 3

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 方法了......

于 2012-09-03T18:17:41.707 回答
1

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

我用 UISlider 的拇指区域做到了这一点。在这里查看我的问题和答案检索并更改 touchUpInside 更改为 touchUpOutside 的点 它是通过覆盖 UIButton 的触摸方法来实现的,因此您必须将 UIButton 子类化。

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

于 2012-09-03T18:04:25.920 回答
0

我相信您的代码被调用了两次,因为我相信此代码中的“自我”指的是视图?

[self sendActionsForControlEvents:UIControlEventTouchUpInside];

你应该使用:

[self.myButton sendActionsForControlEvents:UIControlEventTouchUpInside];
于 2012-09-03T18:14:23.400 回答