0

在我看来,我的子视图很少。这是 UIImageView。

每个 UIImageView 都包含带有 alpha 通道的图像。

这是一张图片: 在此处输入图像描述

我使用下面的这种方法来检测我在位置视图中的触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{   

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    NSArray *views = [self.view subviews];

    for (UIView *v in views) {
        if([v isKindOfClass:[Piece class]]){
            if (CGRectContainsPoint(v.frame, touchLocation) && ((Piece *)v).snapped == FALSE) { 

                UITouch* touchInPiece = [touches anyObject]; 
                CGPoint point = [touchInPiece locationInView:(Piece *)v];
                BOOL solidColor = [self verifyAlphaPixelImage:(Piece *)v atX:point.x atY:point.y];

                if (solidColor) {                    
                    dragging = YES;
                    oldX = touchLocation.x;
                    oldY = touchLocation.y;
                    piece = (Piece *)v;
                    [self.view bringSubviewToFront:piece];
                    break;
                }              

            }
        }
    }
}

以及这种验证 alpha 像素的方法

- (BOOL)verifyAlphaPixelImage:(Piece *)image atX:(int)x atY:(int)y{

    CGImageRef imageRef = [image.image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = malloc(height * width * 4);
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                                 bitsPerComponent, bytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);    
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);    
    // Now your rawData contains the image data in the RGBA8888 pixel format.
    int byteIndex = (bytesPerRow * y) + x * bytesPerPixel;
    //    CGFloat red   = (rawData[byteIndex]     ) ;
    //    CGFloat green = (rawData[byteIndex + 1] ) ;
    //    CGFloat blue  = (rawData[byteIndex + 2] ) ;
    CGFloat alpha = (rawData[byteIndex + 3] ) ;   
    NSLog(@"%f", alpha);
    free(rawData);    
    if(alpha==255.0) return NO;
    else return YES;



}

如果创建了 alpha 像素,我需要触摸 UIImageView 下面的其他 UIImageView,我之前有 tapp 的。

例如,如果我堆叠了 UIImageView 并且我先触摸:

现在我应该先验证 UIImageView

如果我触及 alpha 像素 - > 我应该使用这个坐标移动到下一个 UIImageView 并验证它是否为 alpha 像素。

如果第二个 3、4 或 5 没有我的坐标的 alpha 像素,我应该选择这个 UIImageView。

现在我验证我的像素 - 但我的方法返回错误值。

4

1 回答 1

1
  1. 在讨论如何从 UIImage (Cocoa Touch) 或 CGImage (Core Graphics) 获取像素数据?,对您正在使用的例程进行了更正。使用 calloc 而不是 malloc,否则您将开始得到任意结果。
  2. 如果您的Piece班级曾经缩放图像,您将需要按图像显示的比例缩放其 x 和 y 输入。
  3. touchesBegan方法奇怪地查看了它包含的其他视图,而不是它本身。是否有一个原因?上什么课touchesBegan
  4. 子视图以从后到前的绘制顺序存储,因此当您遍历子视图时,您将首先查看(并可能选择)最后面的对象。而是从 的最后一个元素subviews向前迭代。
  5. 即使在这个工作之后,它也会非常低效,每次用户点击时都会渲染每个 Piece 图像。您最终会希望缓存每个 Piece 的像素数据以便快速查找。
于 2012-04-09T04:27:45.710 回答