2011-10-25 38 views
0

我正在開發一個應用程序,我的要求是改變點擊圖像的按鈕。圖像基本上是國家的地圖。所以,問題是我做了一個自定義按鈕,但它是檢測圖像外部的動作(因爲圖像是彎曲的,並且按鈕默認爲圓形)。所以,有沒有什麼方法可以根據圖像完全自定義按鈕。自定義按鈕檢測外部圖像的動作

感謝

+0

我沒有得到任何答案,難道是難以實現? –

回答

0

如果你的意思是使用自定義形狀(定製tapable區)按鈕,我寫了一些方法來檢查,在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

感謝您的回答。但我無法理解代碼以及它的用途。但是你最後編寫的邏輯,我認爲是正確的方法,甚至我也嘗試了相同的事情與litle不同。 我試圖比較按鈕(它被點擊的位置)和圖像的座標(cgrect參數),如果在圖像區域出現了水龍頭,那麼我會改變其他的顏色。 您認爲這是一種正確的方法嗎? –

+0

在這個方法中,我檢查像素與座標x,y(CGPoint)從圖像(imageView.image)有alpha分量= 0.這意味着這一點是100%透明。首先我從圖像複製像素數據。像素數組是我的代碼中的一維數組,我必須計算我必須檢查哪個像素(pixelNumber)。接下來,取決於圖像格式,我計算哪個字節我必須檢查像素數據。這將適用於RGBA格式,因爲我總是檢查一個像素的最後一個字節(alpha值)。如果這個字節= 0,這意味着這個像素是透明的。 是的,你的方法在我看來是正確的。 –

+0

非常感謝。 甚至你發佈的鏈接都非常有幫助,我完成了我的工作。 –