0

我的应用程序中有一个UIImageView,并且我已将手势识别器附加到该图像视图。

我的问题是,只有在触摸其可见区域时才需要调用它的操作,而不是在其透明部分发生触摸时。

我怎样才能做到这一点?

4

3 回答 3

1

这些代码片段应该可以帮助您入门。第一篇文章是一个类别UIView(我在 SO 上的某个地方,但我不记得在哪里)。This gets you the color under the touch point.

@interface UIView (ColorOfPoint)

- (UIColor *) colorOfPoint:(CGPoint)point;

@end


- (UIColor *) colorOfPoint:(CGPoint)point
{
    unsigned char pixel[4] = {0};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast);

    CGContextTranslateCTM(context, -point.x, -point.y);

    [self.layer renderInContext:context];

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0];

    return color;
}

第二部分展示了我如何在自定义图像视图类中调用此方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint loc = [touch locationInView:self];
    self.pickedColor = [self colorOfPoint:loc];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ColorPicked" object:self userInfo:nil];
}

我在这里使用了一个通知,因为我需要让另一个类知道所选择颜色的值。

于 2012-08-08T05:42:59.577 回答
0

您可以使用它来获取接触点的 Alpha

-(UIColor*) getPixelColorAtLocation:(CGPoint)point
{

    CGImageRef inImage;
    UIColor *color = nil;


        inImage = [self.imageView.image CGImage];


    CGContextRef context = [self createARGBBitmapContextFromImage:inImage];
    如果(上下文 == NULL)返回零;
    size_t w = CGImageGetWidth(inImage);
    size_th = CGImageGetHeight(inImage);
    CGRect 矩形 = {{0,0},{w,h}};
    // 将图像绘制到位图上下文。一旦我们画画,记忆
    // 分配给渲染的上下文将包含
    // 指定颜色空间中的原始图像数据。
    CGContextDrawImage(context, rect, inImage);
    // 现在我们可以获得一个指向与位图关联的图像数据的指针
    // 语境。
    无符号字符 * 数据 = CGBitmapContextGetData(上下文);
    如果(数据!= NULL)
    {

        //offset 从 x,y 定位数据中的像素。
        //4代表每像素4字节数据,w为一行数据的宽度。
        整数偏移量;



            偏移量 = 4*((w*round(point.y))+round(point.x));


        int alpha = 数据[偏移量];
        诠释红色=数据[偏移+1];
        诠释绿色=数据[偏移+2];
        诠释蓝色=数据[偏移+3];
        //NSLog(@"%@",name);
        NSLog(@"offset: %i 颜色: RGB A %i %i %i %i ",offset,red,green,blue,alpha);
        color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];

    // 完成后,释放上下文
    CGContextRelease(上下文);
    // 为上下文释放图像数据内存
    如果(数据)
    {
        免费(数据);
    }
    返回颜色;
}
-(CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage
{

    CGContextRef 上下文 = NULL;
    CGColorSpaceRef 颜色空间;
    无效*位图数据;
    整数位图字节计数;
    int bitmapBytesPerRow;

    // 获取图片的宽度,高度。我们将使用整个图像。
    size_t 像素宽度 = CGImageGetWidth(inImage);
    size_t 像素高 = CGImageGetHeight(inImage);

    // 声明每行的字节数。此位图中的每个像素
    //例子用4个字节表示;红、绿、蓝和各 8 位
    // α。
    bitmapBytesPerRow = (pixelsWide * 4);
    bitmapByteCount = (bitmapBytesPerRow * pixelHigh);

    // 使用通用 RGB 颜色空间。
    colorSpace = CGColorSpaceCreateDeviceRGB();//CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
    如果(颜色空间 == NULL)
    {
        fprintf(stderr, "分配色彩空间时出错\n");
        返回空值;
    }

    // 为图像数据分配内存。这是记忆中的目的地
    // 任何绘制到位图上下文的地方都会被渲染。
    bitmapData = malloc(bitmapByteCount);
    如果(位图数据 == NULL)
    {
        fprintf (stderr, "内存未分配!");
        CGColorSpaceRelease(颜色空间);
        返回空值;
    }

    // 创建位图上下文。我们想要预乘 ARGB,8 位
    // 每个组件。无论源图像格式是什么
    //(CMYK、灰度等)它将被转换为格式
    // 这里由 CGBitmapContextCreate 指定。
    上下文 = CGBitmapContextCreate(位图数据,
                                     像素宽,
                                     像素高,
                                     8, // 每个组件的位数
                                     bitmapBytesPerRow,
                                     色彩空间,
                                     kCGImageAlphaPremultipliedFirst);
    如果(上下文 == NULL)
    {
        免费(位图数据);
        fprintf (stderr, "上下文未创建!");
    }

    // 在返回之前确保并释放颜色空间
    CGColorSpaceRelease(颜色空间);

    返回上下文;
}


于 2012-08-10T05:12:07.000 回答
0

看看 github 上的 OBSHAPED 按钮。它将解决您的问题快乐编码。:)

于 2013-05-05T17:08:49.260 回答