2011-10-25 3 views
0

私はアプリケーションを開発しています。私の要求はclick onのボタンの画像を変更することです。画像は基本的には国の地図なので、問題はカスタムボタンを作ったことですイメージの外側のアクションも検出します(イメージはカーブしており、ボタンはデフォルトで丸みを帯びています)。したがって、ボタンをイメージごとに正確にカスタマイズできる方法はありますか。カスタムシェイプ(カスタムtapable面積)でボタンを意味している場合カスタムボタンが画像の外でアクションを検出する

おかげ

+0

、それは難しいが実装するということですか? –

答えて

0

は、私がチェックするために、いくつかの方法を書いて、UIImageのその時点では、透明またはではありません。

- (BOOL) pointInNontransparentArea:(CGPoint)point { 
    CGImageRef imageRef = [imageView.image CGImage]; 
    NSData* data = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(imageRef)); 

    unsigned char *pixels = (unsigned char *)[data bytes]; 

    size_t width     = CGImageGetWidth(imageRef); 
    size_t bitsPerComponent   = CGImageGetBitsPerComponent(imageRef); 
    size_t bitsPerPixel    = CGImageGetBitsPerPixel(imageRef); 

    size_t numberOfComponents = bitsPerPixel/bitsPerComponent; 

    int pixelNumber = point.y * width + point.x; 
    int byteNumber = pixelNumber * numberOfComponents + numberOfComponents - 1; 

    unsigned char transparencyColor = pixels[byteNumber]; 

    [data release]; 

    if(transparencyColor != 0) 
     return YES; 
    else 
     return NO; 
} 

あなたのボタン画像を透明にされている場合バックグラウンドで簡単に操作できます - ボタンの表示でタッチ位置を確認し、透明領域のタッチを無視してチェックします。

また、あなたはオレBegemannクラスを確認することがあります。私はどんな答えを得ていないのです http://oleb.net/blog/2009/10/obshapedbutton-non-rectangular-buttons-on-the-iphone/

+0

答えをありがとう。しかし、私はコードを理解することができないとどのように便利です。 しかし、あなたが最後に書いたロジックは、正しい方法だと思っています。私は同じことをリットルの違いで試していました。 ボタン(タップされている場所)と画像の座標(cgrectパラメータ)を比較しようとしていましたが、画像領域にタップがあれば色を変更しません。 あなたはどう思いますか、正しいアプローチですか? –

+0

この方法では、画像(imageView.image)の座標x、y(CGPoint)のピクセルがアルファ成分= 0であることを確認します。つまり、この点は100%透明です。まず、画像からピクセルデータをコピーします。ピクセル配列は、私のコードでは1次元の配列であり、どのピクセルを調べる必要があるのか​​(pixelNumber)を計算する必要があります。次に、画像フォーマットに依存し、ピクセルデータをチェックする必要があるバイトを計算します。これはRGBA形式で動作します。なぜなら私は常に1ピクセル(アルファ値)の最後のバイトをチェックするからです。このバイトが0の場合、このピクセルは透過的であることを意味します。 はい、あなたのアプローチは私の意見では正しいです。 –

+0

ありがとうございました。 あなたが投稿したリンクでさえ、非常に役に立ちました。 –