iOS不规则按钮实现

来源:互联网 发布:求几本好看网络黄书 编辑:程序博客网 时间:2024/04/28 18:02

UIButton 在使用 png 作為按鈕時

即使點到透明的部份依然會觸發 touch 事件

為了達到更準確的點擊效果

需建立繼承 UIButton 的類別 (NonRectButton.h)

覆寫 -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 的觸發條件

和擴展 UIImage 類別的功能 (UIImage+GetPixelRGBA.h)

以配合 UIButton 圖片縮放取得點擊位置 pixel 資料

首先擴展 UIImage 功能 (add new category file)

UIImage+GetPixelRGBA.h
@interface UIImage (GetPixelRGBA)    -(UIColor *)colorAtPoint:(CGPoint)point WithImageSize:(CGSize)size;    -(UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize;@end
UIImage+GetPixelRGBA.m
@implementation UIImage (GetPixelRGBA)//取得 point pixel color-(UIColor*)colorAtPoint:(CGPoint)point WithImageSize:(CGSize)size{    UIImage *resizeimage = [self reSizeImage:self toSize:size];        CGRect rect = CGRectMake(0.0f, 0.0f, resizeimage.size.width, resizeimage.size.height);    if (CGRectContainsPoint(rect, point) == NO)  {return nil;}        CGImageRef image = resizeimage.CGImage;    size_t width = CGImageGetWidth(image);    size_t height = CGImageGetHeight(image);    int bytesPerPixel = 4;    int bytesPerRow = (bytesPerPixel*1);        // 8bpp    unsigned char pixelData[4] = {0, 0, 0, 0};    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();    CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, 8, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrder32Big);    CGColorSpaceRelease(colorSpace);        if (context == NULL)  {        NSLog(@"[colorAtPixel] Unable to create context!");        return nil;    }        CGContextSetBlendMode(context, kCGBlendModeCopy);    CGFloat pointX = point.x;    CGFloat pointY = height-point.y;    CGContextTranslateCTM(context, -pointX, -pointY);    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), image);    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];}//更改 UIImage 大小-(UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize{    UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));    [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];    UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return reSizeImage;}

再來建立 NonRectButton 類別並繼承 UIButton

並覆寫 -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 方法

NonRectButton.h
#import <UIKit/UIKit.h>@interface NonRectButton : UIButton@end
NonRectButton.m
#import "NonRectButton.h"#import "UIImage+GetPixelRGBA.h"@implementation NonRectButton-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event  {    UIImage *image = [self backgroundImageForState:UIControlStateNormal];    if (image == nil)  {return YES;}      CGColorRef color = [[image colorAtPoint:point WithImageSize:self.frame.size] CGColor];      CGFloat alphaValue = CGColorGetAlpha(color);    return (alphaValue >= 0.1f);}@end

End~

0 0
原创粉丝点击