2012-04-09 5 views
0

私の見解では、サブビューはほとんどありません。これはUIImageViewです。coord(iOS)でピクセルを確認する

各UIImageViewにはアルファチャンネルの画像が含まれています。

これはイメージである: enter image description here

I場所ビューで私のタッチを検出するための下方にこの方法を使用する:

- (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に触れる必要があります。 - >私はこのCOORDで次UIImageViewに移動して確認する必要があり

Iアルファピクセルに触れた場合今は最初UIImageViewに

を確認する必要があります。私はUIImageViewを積層しており、私が最初に触れた場合、例えば

それはアルファピクセルのためです。

2番目の3番目、4番目、または5番目のピクセルがアルファピクセルでない場合は、このUIImageViewを選択する必要があります。

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

答えて

1
  1. How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?のディスカッションでは、使用している ルーチンの修正があります。 mallocの代わりにcallocを使うと、 の結果が得られます。
  2. Pieceクラスで画像のスケールを変更する場合は、その画像が表示されているスケールでxとyの入力を拡大する必要があります。
  3. touchesBeganメソッドは、それ自体ではなく、それが含んでいる他のビューを奇妙に見ます。これには理由がありますか? touchesBeganはどのクラスですか?
  4. サブビューは、先頭から順に描画順に格納されるため、サブビューを反復処理するときは、最初に最後のオブジェクトを調べます(潜在的に選択する)。代わりにsubviewsの最後の要素から前面に向かって繰り返します。
  5. これが機能した後でも、非常に非効率的で、ユーザーがタップするたびにすべてのピースイメージをレンダリングします。迅速なルックアップのために、すべてのPieceのピクセルデータをキャッシュする必要があります。
+0

本当にありがとうございました。 –

関連する問題