[英]Check if UIImage is on the top of view
我有一個小問題,我有一個代碼可以在隨機的位置和旋轉中生成200個UIImages
。
我需要在這些圖像上檢測觸摸事件,但是我需要檢查觸摸的UIImage
是否未被任何其他圖像覆蓋(即使它們在較小區域內相交)。
有人可以幫我嗎?
順便說一句:我正在嘗試做與此游戲類似的事情: 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方法以確定視圖順序。
您可以使用以下代碼段確定子視圖在其父視圖中的順序:
NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview];
order
越少, subview
就“越高”。 最頂層的子視圖將具有零order
。
雖然我建議數學上這樣做會更快,將鈔票定義為矩形,並使用諸如分隔軸定理之類的東西進行重疊測試,但這顯然不是您要的,也不適合一般情況的圖像。
因此,我建議您創建一個與游戲區域大小相同的CGBitmapContext
,並在播種游戲區域時為放置的每個音符執行以下操作:
隨后,當游戲開始時,運行通過緩沖區並計算每種指定顏色的數量。 所有存儲的編號與當前可見編號相同的所有注釋位於頂部。 每當刪除便箋時,請依次重畫所有其他便箋,並進行一次顏色計數。
請注意,您不會在每個音符上對總緩沖區進行顏色計數,而只是對總數進行一次。 因此,這是固定成本,並且每次點擊的發生頻率可能少於一次。
將圖形繪制為單色的最簡單方法可能是在加載每個圖形時為其創建遮罩版本,然后使用適當的色調對其進行繪制。 這里有一個介紹阿爾法口罩在這里 ; 您可能想要創建一個自定義位圖圖像上下文,而不是使用UIGraphicsGetCurrentContext
返回的隱式上下文,並發布過濾器以測試輸出alpha值-如果其小於某個閾值則下推至0,否則下推至255。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.