我正在开发一个应用程序,我的要求是改变点击图像的按钮。图像基本上是国家的地图。所以,问题是我做了一个自定义按钮,但它是检测图像外部的动作(因为图像是弯曲的,并且按钮默认为圆形)。所以,有没有什么方法可以根据图像完全自定义按钮。自定义按钮检测外部图像的动作
感谢
我正在开发一个应用程序,我的要求是改变点击图像的按钮。图像基本上是国家的地图。所以,问题是我做了一个自定义按钮,但它是检测图像外部的动作(因为图像是弯曲的,并且按钮默认为圆形)。所以,有没有什么方法可以根据图像完全自定义按钮。自定义按钮检测外部图像的动作
感谢
如果你的意思是使用自定义形状(定制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/
感谢您的回答。但我无法理解代码以及它的用途。但是你最后编写的逻辑,我认为是正确的方法,甚至我也尝试了相同的事情与litle不同。 我试图比较按钮(它被点击的位置)和图像的坐标(cgrect参数),如果在图像区域出现了水龙头,那么我会改变其他的颜色。 您认为这是一种正确的方法吗? –
在这个方法中,我检查像素与坐标x,y(CGPoint)从图像(imageView.image)有alpha分量= 0.这意味着这一点是100%透明。首先我从图像复制像素数据。像素数组是我的代码中的一维数组,我必须计算我必须检查哪个像素(pixelNumber)。接下来,取决于图像格式,我计算哪个字节我必须检查像素数据。这将适用于RGBA格式,因为我总是检查一个像素的最后一个字节(alpha值)。如果这个字节= 0,这意味着这个像素是透明的。 是的,你的方法在我看来是正确的。 –
非常感谢。 甚至你发布的链接都非常有帮助,我完成了我的工作。 –
我没有得到任何答案,难道是难以实现? –