2015-10-12 55 views
0

我可以通過編碼在任何點通過hittest獲得一個子圖層。但是我想在這一點上獲得所有層次。 問題是: 通過命中測試,我只能得到最頂層的帽子點,它並沒有提供任何關於該頂層下層的信息。GetSublayers by Hit test ios

有什麼方法可以在ios中的特定點找到所有圖層?

回答

1

命中測試用於交付事件。由於事件總是傳遞到最上面的視圖,所以點擊測試無法繼續測試下面的視圖。

但是,如果你想找到一個點所有層,你可以寫自己則hitTest版本作爲CALayer的一個類別,這是否:

-(NSMutableSet*)allLayersAtPoint:(CGPoint)aPoint 
{ 
    NSMutableSet *layers = [[NSMutableSet alloc] init]; 
    if(! CGRectContainsPoint([self frame],aPoint)) 
    { 
     return layers; 
    } 


    [layers addObject:self] 

    for(CALayer *layer in self.sublayers) { 
     CGPoint converted = [self convertPoint:aPoint toLayer:layer] 
     [layers unionSet:[layer allLayersAtPoint:converted]] 
    } 


    return layers 
} 

謹防與子層的變換雖然。不知道如何處理。通常這是在UIViews上完成的,我不確定你爲什麼要在圖層上做這個。如果你想讓它在UIViews上工作,只需在UIView而不是CALayer上實現這個類。

+0

我想要做什麼?我有很多具有模擬器名稱(行)的圖層。我還有其他圖層。我想檢查一個點,即用line命名的圖層是否在該點之下?注意:我必須按照每秒連續執行。所以我不能在所有層上做一個forloop。 –

+0

這有點高級。這是在系統級別實現(幾乎)命中測試的方式。檢查它並告訴我是否有任何性能問題。我們可以在看到瓶頸的位置後對其進行優化。 –