2011-10-25 40 views
0

我正在开发一个应用程序,我的要求是改变点击图像的按钮。图像基本上是国家的地图。所以,问题是我做了一个自定义按钮,但它是检测图像外部的动作(因为图像是弯曲的,并且按钮默认为圆形)。所以,有没有什么方法可以根据图像完全自定义按钮。自定义按钮检测外部图像的动作

感谢

+0

我没有得到任何答案,难道是难以实现? –

回答

0

如果你的意思是使用自定义形状(定制tapable区)按钮,我写了一些方法来检查,在UIImage的那个点是透明与否:

- (BOOL) pointInNontransparentArea:(CGPoint)point { 
    CGImageRef imageRef = [imageView.image CGImage]; 
    NSData* data = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(imageRef)); 

    unsigned char *pixels = (unsigned char *)[data bytes]; 

    size_t width     = CGImageGetWidth(imageRef); 
    size_t bitsPerComponent   = CGImageGetBitsPerComponent(imageRef); 
    size_t bitsPerPixel    = CGImageGetBitsPerPixel(imageRef); 

    size_t numberOfComponents = bitsPerPixel/bitsPerComponent; 

    int pixelNumber = point.y * width + point.x; 
    int byteNumber = pixelNumber * numberOfComponents + numberOfComponents - 1; 

    unsigned char transparencyColor = pixels[byteNumber]; 

    [data release]; 

    if(transparencyColor != 0) 
     return YES; 
    else 
     return NO; 
} 

如果您的按钮图像有透明背景将很容易 - 只需在按钮视图中检查触摸的位置并检查透明区域中的忽略触摸。

你也可以检查奥莱Begemann类: http://oleb.net/blog/2009/10/obshapedbutton-non-rectangular-buttons-on-the-iphone/

+0

感谢您的回答。但我无法理解代码以及它的用途。但是你最后编写的逻辑,我认为是正确的方法,甚至我也尝试了相同的事情与litle不同。 我试图比较按钮(它被点击的位置)和图像的坐标(cgrect参数),如果在图像区域出现了水龙头,那么我会改变其他的颜色。 您认为这是一种正确的方法吗? –

+0

在这个方法中,我检查像素与坐标x,y(CGPoint)从图像(imageView.image)有alpha分量= 0.这意味着这一点是100%透明。首先我从图像复制像素数据。像素数组是我的代码中的一维数组,我必须计算我必须检查哪个像素(pixelNumber)。接下来,取决于图像格式,我计算哪个字节我必须检查像素数据。这将适用于RGBA格式,因为我总是检查一个像素的最后一个字节(alpha值)。如果这个字节= 0,这意味着这个像素是透明的。 是的,你的方法在我看来是正确的。 –

+0

非常感谢。 甚至你发布的链接都非常有帮助,我完成了我的工作。 –