创建给定图像形状的UIButton

时间:2013-02-07 11:21:43

标签: ios ios5 uibutton uiimage

如何在给定图像的形状中创建UIButton。

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

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

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

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;

2 个答案:

答案 0 :(得分:2)

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

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

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

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

希望这有帮助

答案 1 :(得分:1)

尽管Jeff Lamarche通过其他答案链接的解决方案运行良好,但它使用了大量内存,并且/或者做了大量工作:

  • 如果您在初始化程序中创建NSData一次,则最终会在每个按钮的生命周期内保留一个相对较大的内存块
  • 如果你把它变成瞬态,在答案中完成它的方式,那么你每次点击测试按钮时都会转换整个图像 - 处理数千个像素并在获取单个字节后丢弃结果!< / LI>

事实证明,通过遵循this answer中概述的方法,您可以在内存使用和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变量的行。