2011-08-10 69 views
2

我想實現我自己的手勢識別器,除了MKMapView已經使用的手勢識別器之外。現在我可以點擊地圖並設置一個別針。這種行爲是通過我的UITapGestureRecognizer實現的。當我點擊一個已經存在的引腳時,我的手勢識別器什麼都不做,但是顯示了這個引腳的標註泡泡。 UIGestureRecognizerDelegate看起來像這樣:iPhone:將MKMapView與另一個UITapGestureRecognizer結合

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if (gestureRecognizer == self.tapRecognizer) 
    { 
     bool hitAnnotation = false; 
     int count = [self.mapView.annotations count]; 
     int counter = 0; 

     while (counter < count && hitAnnotation == false) 
     { 
      if (touch.view == [self.mapView viewForAnnotation:[self.mapView.annotations objectAtIndex:counter]]) 
      { 
       hitAnnotation = true; 
      } 
      counter++; 
     } 
     if (hitAnnotation) 
     { 
      return NO; 
     } 

    } 
    return YES; 
} 

這工作正常。我唯一的問題是引腳和雙擊的標註泡泡。通常雙擊是用於放大。這仍然有效,但除此之外,我還得到一個新的引腳。有什麼辦法可以避免這種情況?

另一個問題出現在針的標註泡泡中。我可以通過點擊引腳而不用在這個地方設置一個新的引腳來打開氣泡(見上面的代碼),但是當我想通過點擊它來關閉氣泡時,另一個引腳被設置。我的問題是,我無法檢查touch.view,如果用戶點擊標註泡泡,因爲它不是一個普通的UIView據我所知。任何想法或解決這個問題的方法?

感謝

回答

4

我有同樣的問題,因爲你的第一個問題:區分單個水龍頭雙水龍頭在MKMapView。我所做的是以下幾點:

[doubleTapper release]; 
doubleTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapDoubleTapped:)]; 
doubleTapper.numberOfTapsRequired = 2; 
doubleTapper.delaysTouchesBegan = NO; 
doubleTapper.delaysTouchesEnded = NO; 
doubleTapper.cancelsTouchesInView = NO; 
doubleTapper.delegate = self; 

[mapTapper release]; 
mapTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapTapped:)]; 
mapTapper.numberOfTapsRequired = 1; 
mapTapper.delaysTouchesBegan = NO; 
mapTapper.delaysTouchesEnded = NO; 
mapTapper.cancelsTouchesInView = NO; 
[mapTapper requireGestureRecognizerToFail:doubleTapper]; 

,然後實施了以下的委託方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 

使用requireGestureRecognizerToFail:允許該應用來區分雙水龍頭單一的水龍頭和實施gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:確保雙水龍頭仍然轉發到MKMapView,以便它繼續正常縮放。請注意,doubleTapper實際上沒有做任何事情(在我的情況下,除了日誌調試消息)。這只是一個虛擬的UIGestureRecognizer,用於幫助將雙擊與單擊分開。

+0

嗨charshep,非常感謝您的回答。這使我指出了正確的方向。第一個問題似乎解決了。你對第二個問題有什麼建議嗎? – Lars

相關問題