私の見解では、サブビューはほとんどありません。これがUIImageViewです。
各 UIImageView には、アルファ シャネルを含む画像が含まれています。
これはイメージです:
ロケーションビューでタッチを検出するために、以下のこの方法を使用します。
- (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;
}
}
}
}
}
アルファピクセルを検証するためのこのメソッド
- (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;
}
アルファピクセルが見つかった場合は、以前にタップした UIImageView の下にある他の UIImageView に触れる必要があります。
たとえば、UIImageView を積み重ねていて、最初に触れた場合:
ここで、最初の UIImageView を確認する必要があります
アルファ ピクセルに触れた場合 - > この座標で次の UIImageView に移動し、アルファ ピクセルについても検証する必要があります。
2 番目、3 番目、4 番目、または 5 番目の座標にアルファ ピクセルがない場合は、この UIImageView を選択する必要があります。
今のところ、ピクセルを確認しますが、メソッドが間違った値を返します。