2013-02-07 16 views
4

如何在给定图像的形状中创建UIButton。以给定图像的形状创建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; 
+0

你尝试了什么? – nielsbot

+1

我忘记提及最重要的事情,点击按钮不应该超出图像...严格的图像内.. –

+1

它的东西,但我开发一个小游戏的开始画面。我必须去主页点击这个按钮后,但当我为这个集成图形,我有这个问题,我可以创建一个类似的按钮,但现在的问题是,如果我点击按钮图像外的部分(这应该是按钮)它是一个click.pls帮助 –

回答

2

有一个真正伟大的教程这里下载的源代码:

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

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

然后,您可以继承的UIButton和过度骑则hitTest:withEvent:方法

希望这有助于

+0

你可能想'接受'的答案,然后;-) – Tim

+1

伟大的教程家伙...这是完全working.i从程序中复制2类OBShapedButton和UIImage + ColorAtPixel,导入它们到我的程序,并使按钮成为'OBShapedButton类'的实例。它仅检测到图像,并且我提到的问题没有发生。我还在我给出的代码中注释了以下几行代码即 –

+0

btnStartGame.clipsToBounds = YES; btnStartGame.layer.cornerRadius = 50; //宽度的一半 btnStartGame.layer.borderColor = [UIColor redColor] .CGColor; btnStartGame.layer.borderWidth = 2.0f;任何人都可以使用此方法创建任何形状的按钮,并按照我所做的一样完成任务。 –

1

虽然杰夫·拉马什通过对方的回答链接的解决方案正常工作,它使用了大量的内存, /或做了很多工作:

  • 如果在初始创建NSData一次,你最终持有的内存比较大的块为每个按钮
  • 如果溜溜的寿命你可以使它瞬变,它在答案中完成的方式,然后你每次点击测试按钮时都会转换整个图像 - 处理成千上万像素并在获取单个字节后丢弃结果!

事实证明,通过遵循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; 
} 

上述代码发生阿尔法从按钮的背景图像。如果您的按钮使用其他图像,请更改上面初始化变量image的行。