我有一個小問題,我有一個代碼,以隨機位置和旋轉生成200 UIImages
。檢查UIImage是否在視圖頂部
我需要檢測這些圖像上的觸摸事件,但我需要檢查觸及的UIImage
是否未被任何其他圖像覆蓋(即使它們相交於一個小區域)。
有人能幫助我嗎?
BTW:我試圖做類似這樣的遊戲的東西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html
我有一個小問題,我有一個代碼,以隨機位置和旋轉生成200 UIImages
。檢查UIImage是否在視圖頂部
我需要檢測這些圖像上的觸摸事件,但我需要檢查觸及的UIImage
是否未被任何其他圖像覆蓋(即使它們相交於一個小區域)。
有人能幫助我嗎?
BTW:我試圖做類似這樣的遊戲的東西:http://www.dressup247.com/game/1014/Bank-Note-Stack.html
我建議讓所有圖像作爲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方法來確定視圖順序。
真棒 - 謝謝你鈹!你值得的+50! – Ashraf 2012-02-21 06:05:56
您可以使用下面的代碼片段,以確定在其父視圖中的子視圖的順序:
NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview];
越少order
,「高」subview
是。最頂端的子視圖將具有零個order
。
雖然我建議以數學方式進行此操作會更快,但要將紙幣定義爲矩形並使用分離軸定理等測試重疊,這顯然不是您要求的而且不適合一般情況圖片。
所以我建議你創建一個CGBitmapContext
同樣大小的遊樂區和播種的遊樂區時,對於每一個注意你把你做這樣的事情:
隨後,當遊戲開始運行緩衝區並計算每個指定的顏色的數量。與當前可見的存儲號碼相同的所有備註都位於頂部。每當筆記被刪除,重新繪製所有其他的順序,並做一次顏色計數。
請注意,您沒有在每個音符上對總緩衝區進行一次顏色計數,總共只進行一次。所以這是一個固定成本,可能比每次點擊少一次。
大概做繪圖作爲一個單一的顏色最簡單的方法是,當它的加載,然後得出一個合適的色調創建每個圖形的掩膜版。有一個阿爾法面具介紹here;您可能需要創建一個自定義位圖圖像上下文,而不是使用由UIGraphicsGetCurrentContext
返回的隱式位圖,並過濾後測試輸出alpha - 如果小於某個閾值,則將其推低至0,否則最大爲255。
任何代碼片段? – Ashraf 2012-02-20 04:45:42
所以要清楚的是,觸摸是不是觸及'UIImage',而是UIImage是否覆蓋屏幕上的任何位置?你很有意識地說圖像,而不是視圖,大概是因爲透明部分應該適當地說明? – Tommy 2012-02-19 18:16:28
@Tommy,正好,我有一個'UIImages'的一拳,用戶可以觸摸這些圖像,並刪除被觸摸的只有當它是完全免費的(其他'UIImage'完全免費) – Ashraf 2012-02-20 04:43:15