0

私の見解では、サブビューはほとんどありません。これが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 を選択する必要があります。

今のところ、ピクセルを確認しますが、メソッドが間違った値を返します。

4

1 に答える 1

1
  1. UIImage (Cocoa Touch) または CGImage (Core Graphics) からピクセル データを取得する方法についてのディスカッションでは? 、使用しているルーチンに修正があります。malloc の代わりに calloc を使用しないと、任意の結果が得られるようになります。
  2. クラスが画像をスケーリングする場合Pieceは、画像が表示されているスケールで x および y 入力をスケーリングする必要があります。
  3. メソッドはtouchesBegan奇妙なことに、それ自体ではなく、含まれている他のビューを調べます。これには理由がありますか?何科touchesBeganですか?
  4. サブビューは後ろから前への描画順で保存されるため、サブビューを反復処理するときは、一番後ろのオブジェクトを最初に確認 (および場合によっては選択) します。代わりに、 の最後の要素からsubviews前に向かって繰り返します。
  5. これが機能した後でも、ユーザーがタップするたびにすべてのピース画像をレンダリングするため、非常に非効率的です。最終的には、すばやく検索できるように、すべてのピースのピクセル データをキャッシュする必要があります。
于 2012-04-09T04:27:45.710 に答える