简单的方法使用不规则形状的button

我终于得到了我的主要应用程序版本(点击播放MMO – 检查出来;-)),我现在正在扩大它。

要做到这一点,我需要一个有四个独立button的圆圈,这些button基本上是四分之一。 我得出的结论是,细胞图像将需要由四个图像构成,每个四分之一,但是由于矩形图像形状的必要性,我将以一些重叠结束,虽然重叠将是透明。

什么是使这个工作的最好方法? 我真的需要一些非常简单的东西,我看过这个http://iphonedevelopment.blogspot.com/2010/03/irregularly-shaped-uibuttons.html

之前,但还没有成功地实现它的工作。 任何人都可以提供一些build议?

如果它有什么区别,我将部署到一个iOS 3.X框架(当4.2出来的iPad将4.2)

我看不出为什么需要重叠。
只要创build4个button,并给每一个你的形象片。

编辑后评论

看到这个伟大的项目 。 一个例子就是你想要做的。

它通过合并覆盖的像素的alpha值来工作

pointInside:withEvent:和UIImage上的类别,添加了这个方法

 - (UIColor *)colorAtPixel:(CGPoint)point { // Cancel if point is outside image coordinates if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) { return nil; } // Create a 1x1 pixel byte array and bitmap context to draw the pixel into. // Reference: http://stackoverflow.com/questions/1042830/retrieving-a-pixel-alpha-value-for-a-uiimage NSInteger pointX = trunc(point.x); NSInteger pointY = trunc(point.y); CGImageRef cgImage = self.CGImage; NSUInteger width = self.size.width; NSUInteger height = self.size.height; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * 1; NSUInteger bitsPerComponent = 8; unsigned char pixelData[4] = { 0, 0, 0, 0 }; CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextSetBlendMode(context, kCGBlendModeCopy); // Draw the pixel we are interested in onto the bitmap context CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height); CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage); CGContextRelease(context); // Convert color values [0..255] to floats [0.0..1.0] CGFloat red = (CGFloat)pixelData[0] / 255.0f; CGFloat green = (CGFloat)pixelData[1] / 255.0f; CGFloat blue = (CGFloat)pixelData[2] / 255.0f; CGFloat alpha = (CGFloat)pixelData[3] / 255.0f; return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; } 

跳过button,只需响应您的视图中包含该圆圈的触摸。

为每个想要捕捉触摸的区域创build一个CGPath,当UIview收到触摸时,检查path中的成员资格。

[编辑答案显示骨架实现细节 – TomH]

下面是我将如何处理这个问题:(我没有testing过这个代码,语法可能不是很正确,但这是一般的想法)

1)使用PS或您最喜爱的图像创build应用程序,创build一个四分之一圆的PNG。 将其添加到您的XCode项目。

2)添加一个UIView到用户界面。 将UIView的图层内容设置为png。

 self.myView = [[UIView alloc] initWithRect:CGRectMake(10.0, 10.0, 100.0, 100,0)]; [myView.layer setContents:(id)[UIImage loadImageNamed:@"my.png"]]; 

3)创build描述你感兴趣的UIView区域的CGPaths。

 self.quadrantOnePath = CGPathCreateMutable(); CGPathMoveToPoint(self.quadrantOnePath, NULL, 50.0, 50.0); CGPathAddLineToPoint(self.quadrantOnePath, NULL, 100.0, 50.0); CGPathAddArc(self.quadrantOnePath, NULL, 50.0, 50.0, 50.0, 0.0, M_PI2, 1); CGPathCloseSubpath(self.quadrantOnePath); // create paths for the other 3 circle quadrants too! 

4)添加一个UIGestureRecognizer和听/观察在视图中的水龙头

 UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; [tapRecognizer setNumberOfTapsRequired:2]; // default is 1 

5)tapRecognizer调用其目标select器时

 - (void)handleGesture:(UIGestureRecognizer *) recognizer { CGPoint touchPoint = [recognizer locationOfTouch:0 inView:self.myView]; bool processTouch = CGPathContainsPoint(self.quadrantOnePath, NULL, touchPoint, true); if(processTouch) { // call your method to process the touch } } 

不要忘记在适当的时候释放所有的东西 – 使用CGPathRelease释放path。

另一个想法是:如果用于表示圆形象限的graphics只是填充颜色(即没有花哨的graphics,图层效果等),则还可以使用在UIView的drawRect方法中创build的path来绘制象限太。 这将解决上述方法的缺陷之一:graphics和用于检查触摸的path之间没有紧密集成。 也就是说,如果换出不同的graphics,改变graphics的大小等,用于检查触摸的path将不同步。 可能是一个高维护的一段代码。

这是一个非常棒的项目,可以轻松解决不规则形状button的问题: http : //christinemorris.com/2011/06/ios-irregular-shaped-buttons/