4

我怎样才能创建一个给定图像形状的 UIButton。

我可以创建接近它的东西,但图像似乎不适合按钮。我的要求是下面给出的图像。即;半圆

我用来创建按钮的代码如下所示。

我应该对以下图像进行哪些更改才能获得此按钮。ps-add subview 在另一个类中完成..

btnStartGame  =[UIButton buttonWithType:UIButtonTypeCustom];
[btnStartGame setFrame:CGRectMake(60, 200, 200, 200)];

btnStartGame.titleLabel.font=[UIFont fontWithName:@"Helvetica-Bold" size:30];
[btnStartGame setImage:
[UIImage imageNamed:@"Draw button.png"]  forState:UIControlStateNormal];

btnStartGame.titleLabel.textColor=[UIColor redColor];
btnStartGame.clipsToBounds = YES;
btnStartGame.layer.cornerRadius = 50;//half of the width
btnStartGame.layer.borderColor=[UIColor redColor].CGColor;
btnStartGame.layer.borderWidth=2.0f;

btnStartGame.tag=20;
btnStartGame.highlighted=NO;
4

2 回答 2

2

这里有一个非常棒的教程,带有可下载的源代码:

http://iphonedevelopment.blogspot.co.uk/2010/03/irregularly-shape-uibuttons.html

本质上你需要在 UIImage 上创建一个类别,它检查你触摸的点是否是透明图像。这意味着您可以使用它来检查不规则形状的命中测试。

然后你继承 UIButton 并覆盖 hitTest:withEvent:

希望这可以帮助

于 2013-02-07T11:43:00.220 回答
1

尽管由另一个答案链接的 Jeff Lamarche 的解决方案工作正常,但它使用了大量内存,和/或做了很多工作:

  • 如果您NSData在初始化程序中创建一次,您最终会在每个按钮的生命周期内持有相对较大的内存块
  • 如果你让它瞬态,就像它在答案中所做的那样,那么你最终会在每次点击测试按钮时转换整个图像 - 处理数千个像素并在获取单个字节后丢弃结果!

事实证明,通过遵循此答案中概述的方法,您可以在内存使用和 CPU 消耗方面更有效地执行此操作。

子类UIButton,并像这样覆盖它的pointInside:withEvent:方法:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if (![super pointInside:point withEvent:event]) {
        return NO;
    }
    unsigned char pixel[1] = { 0 };
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 1, NULL, (CGBitmapInfo)kCGImageAlphaOnly);
    UIGraphicsPushContext(context);
    UIImage *image = [self backgroundImageForState:UIControlStateNormal] ;
    [image drawAtPoint:CGPointMake(-point.x, -point.y)];
    UIGraphicsPopContext();
    CGContextRelease(context);
    return pixel[0] != 0;
}

上面的代码从按钮的背景图像中获取 alpha。如果您的按钮使用另一个图像,请更改image上面初始化变量的行。

于 2015-04-04T10:56:31.127 回答