2012-02-16 248 views
1

我有一個小問題,我有一個代碼,以隨機位置和旋轉生成200 UIImages檢查UIImage是否在視圖頂部

我需要檢測這些圖像上的觸摸事件,但我需要檢查觸及的UIImage是否未被任何其他圖像覆蓋(即使它們相交於一個小區域)。

有人能幫助我嗎?

BTW:我試圖做類似這樣的遊戲的東西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html

+0

所以要清楚的是,觸摸是不是觸及'UIImage',而是UIImage是否覆蓋屏幕上的任何位置?你很有意識地說圖像,而不是視圖,大概是因爲透明部分應該適當地說明? – Tommy 2012-02-19 18:16:28

+0

@Tommy,正好,我有一個'UIImages'的一拳,用戶可以觸摸這些圖像,並刪除被觸摸的只有當它是完全免費的(其他'UIImage'完全免費) – Ashraf 2012-02-20 04:43:15

回答

3

我建議讓所有圖像作爲UIButton的背景圖像和所有按鈕一個動作設定。還有一個建議 - 爲每個按鈕設置標籤順序,從大多數低位到最高位(並在某些iVar中存儲最大標籤)。您可以在生成佈局時執行此操作。它允許您檢測點擊視圖上有多少個視圖。

使用CGRectIntersectsRect相交視圖。

-(IBAction)banknotTapped:(UIButton*)sender{ 
    int tag = sender.tag 

    NSMutableArray *highestViews = [NSMutableArray array]; 

    for (int i=sender.tag; i < biggestTag; ++i){ 
     UIView *v = [self.view viewWithTag:i]; 
     if (CGRectIntersectsRect(sender.frame, v.frame)) // it allows to find intersecting views 
      [highestViews addObject:v]; 
    } 
} 

現在highestViews將包含與發件人相交的所有最高的看法。

注意:標籤允許您檢測視圖,但是如果您將從超級視圖中刪除圖像,則可能會導致問題,因爲標籤順序會中斷。隱藏視圖而不是刪除或按照@Costique方法來確定視圖順序。

+0

真棒 - 謝謝你鈹!你值得的+50! – Ashraf 2012-02-21 06:05:56

1

您可以使用下面的代碼片段,以確定在其父視圖中的子視圖的順序:

NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview]; 

越少order,「高」subview是。最頂端的子視圖將具有零個order

+0

不錯,但如何檢查UIImage是否被覆蓋,我想我也要檢查x,y位置。 – Ashraf 2012-02-17 07:15:57

+0

@Mathboy旋轉讓它變得更加困難。如果不檢查交叉點並依賴'UIView'的命中測試,你有沒有可能做到這一點?它應該自動考慮所有轉換。 – Costique 2012-02-17 09:13:58

+0

我試圖做類似於這個遊戲的東西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html – Ashraf 2012-02-17 15:36:51

1

雖然我建議以數學方式進行此操作會更快,但要將紙幣定義爲矩形並使用分離軸定理等測試重疊,這顯然不是您要求的而且不適合一般情況圖片。

所以我建議你創建一個CGBitmapContext同樣大小的遊樂區和播種的遊樂區時,對於每一個注意你把你做這樣的事情:

  • 分配新的,尚未未使用的顏色到銀行註釋
  • 將其繪製到位圖上下文中的目標位置,但作爲指定顏色的實體對象 - 因此,您保留原始形狀的輪廓,但在每個像素上繪製實體,分配顏色或根本沒有顏色
  • 統計現在整個上下文中有多少像素指定的顏色,存儲與您的對象代表筆記

隨後,當遊戲開始運行緩衝區並計算每個指定的顏色的數量。與當前可見的存儲號碼相同的所有備註都位於頂部。每當筆記被刪除,重新繪製所有其他的順序,並做一次顏色計數。

請注意,您沒有在每個音符上對總緩衝區進行一次顏色計數,總共只進行一次。所以這是一個固定成本,可能比每次點擊少一次。

大概做繪圖作爲一個單一的顏色最簡單的方法是,當它的加載,然後得出一個合適的色調創建每個圖形的掩膜版。有一個阿爾法面具介紹here;您可能需要創建一個自定義位圖圖像上下文,而不是使用由UIGraphicsGetCurrentContext返回的隱式位圖,並過濾後測試輸出alpha - 如果小於某個閾值,則將其推低至0,否則最大爲255。

+0

任何代碼片段? – Ashraf 2012-02-20 04:45:42