2010-09-21 84 views
0

我有一個Masterview.it有很多childviews.I使用下面的代碼來檢測觸摸的視圖,並帶前面相應的view.the代碼工作正常。但是當我添加subview到childview,它沒有工作,請幫忙嗎?(UIView *)hitTest問題?

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 
{ 
self.hitView = nil; 
self.hitView = [super hitTest:point withEvent:event]; 
int x = self.hitView.frame.origin.x; 
int y = self.hitView.frame.origin.y; 
NSLog(@"x = %d",x); 
NSLog(@"y = %d",y); 
if ([self.viewDelegate respondsToSelector: 
     @selector(view:hitTest:withEvent:hitView:)]) 
{ 
    return [self.viewDelegate view:self hitTest:point 
          withEvent:event hitView:hitView]; 
} 
else 
{ 

     [self bringSubviewToFront:self.hitView]; 
    return hitView; 
} 

}

+0

有沒有一個原因,你不能直接在你的子視圖中使用touchesBegan:等方法? – Eiko 2010-09-21 08:12:03

+0

我正在移動childview圍繞ipad ..所以我用這樣的...當childview有子視圖,它沒有工作..這就是問題..(當childview沒有子視圖,它工作正常) – 2010-09-21 08:19:44

+0

你調用的那個委託方法的代碼是什麼?你不會將hitView設置爲[super hitTest:withEvent:]之外的任何東西 - 也許這很重要。 – Eiko 2010-09-21 08:36:39

回答

8

如果我得到它的權利,這是很容易:hitTest總是返回最遠的後裔子視圖在視圖中。如果沒有子視圖,這總是相同的視圖。如果有,那麼可能會返回該子視圖。這裏是你如何可以修復它:

self.hitView = [super hitTest:point withEvent:event]; 
if ([self.hitView isDescendantOfView: self]) 
    self.hitView = self; 

編輯現在,我理解這個問題更好,你也許應該做到以下幾點。此代碼返回這就是外觀圖的直系後裔的上海華:

UIView *hitView = [super hitTest:point withEvent:event]; 
while (hitView && hitView.superview != self) 
    hitView = hitView.superview; 

(請注意,你應該使用局部變量,以後更改您的財產比)。

+0

嗨,我無法移動我的視圖,如果我使用你的代碼?因爲我使用上面的函數將返回視圖移動... – 2010-09-21 09:06:17

+0

啊,我理解你的問題。這個問題並不是最清楚的。我會修復我的答案... – 2010-09-21 09:08:41

+0

查看編輯答案 – 2010-09-21 09:11:11

0

正如你所說,你正在移動UIViews。你應該看看WWDC 2010的視頻,他們用新的GestureRecognizer Class來達到這個效果。

您應該查看的視頻與「手勢識別」命名爲「somthing」。如果你找不到它,我可以在下班回家時把它連接起來。

祝你好運!