2010-11-16 53 views
11

看來,只有觸摸開始於該視圖範圍內時纔會調用UIView的所有觸摸方法。有沒有辦法讓視圖響應已觸及視圖外的用戶,但將手指拖入視圖?UIView,如何確定觸摸什麼時候進入視圖

萬一它很重要,我的具體應用是拖動MKPinAnnotationView(使用內置4.0拖動)。如果用戶將一個pin拖動到另一個視圖(這恰好也是AnnotationView,但它可能是任何東西),我希望發生一些事情。直到我鬆開銷釘,纔會調用拖動方法;並沒有方法沒有UIView被拖到似乎被調用,除非我開始在視圖內觸摸。

因爲superview是一個MKMapView,所以很難只使用touchesMoved事件並檢查用戶是否在正確的位置。謝謝!

+0

@Joe - MKMapView的子類沒有收到TouchesBegan或TouchesMoved ...我猜是因爲它需要做它自己的東西來滾動和縮放?這個問題在這裏概述:http://stackoverflow.com/questions/1049889/how-to-intercept-touches-events-on-a-mkmapview-or-uiwebview-objects – GendoIkari 2010-11-17 22:11:00

回答

3

因此,在玩了一段時間之後,我發現here給出的答案實際上給了我我需要的東西,即使被問到的問題是不同的。

事實證明,你可以繼承UIGestureRecognizer;並讓它處理所有添加到視圖中的觸摸(包括MKMapView)。這允許所有普通的MKMapView交互仍然沒有任何問題;但也提醒我觸動。在touchesMoved,我只是檢查觸摸的位置;看看它是否在我的另一種觀點的範圍內。

從我試過的一切;這似乎是在用戶拖動MKAnnotation時攔截touchesMoved的唯一方法。

0

每個視圖都繼承了UIResponder,所以每個視圖都有touchesBegan/Moved/Ended - 我不認爲在視圖之外開始觸摸意味着當觸摸移到視圖上時視圖不會獲得任何事件。如果你想得到一個通知,說明有東西被拖到你的MKMapView上,你應該創建一個處理觸摸的子類,然後把事件傳遞給super,這樣層次結構就可以做任何它需要的觸摸操作。你不需要捕捉或修改事件只是觀察它。

+0

我已經證實了一個簡單的測試視圖,觸摸在視圖之外並將手指拖入它不會導致touchesBegan或touchesMoved被調用。 – GendoIkari 2010-11-17 15:58:40

1

你肯定可以:

(HitstateView.h)

#import <UIKit/UIKit.h> 


@interface HitstateView : UIView { 
    id overrideObject; 
} 

@property (nonatomic, retain) id overrideObject; 

@end 

(HitstateView.m)

#import "HitstateView.h" 


@implementation HitstateView 

@synthesize overrideObject; 

- (void)dealloc { 
    self.overrideObject = nil; 

    [super dealloc]; 
} 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *hitView = [super hitTest:point withEvent:event]; 
    if (hitView == self) { 
     return overrideObject; 
    } 
    return hitView; 
} 

@end 

使這個觀點你的觸摸區域的大小。將overideObject設置爲您想要觸摸的視圖。 IIRC它應該是HitstateView的子視圖。

+1

似乎只有當用戶第一次按下按鈕時纔會調用hitTest;它不會在用戶移動/拖動時調用。 – GendoIkari 2010-11-17 16:04:23

0

這取決於您的視圖如何設置。一般來說,利用響應者鏈是最好的選擇。它允許你玩技巧,雖然它可能太具體以至於不能滿足你的特殊需求。

您也可以玩小聰明與覆蓋着事件的點擊測試:

http://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.html%23//apple_ref/doc/uid/TP40009541-CH3-SW3

你的具體情況聽起來相當特殊的,所以你可能要玩花招就像它的框架是足夠大,父視圖包含有問題的兩個視圖。

相關問題