2011-02-17 108 views
3

短版我的問題:爲UIGestureRecognizers自定義操作(使用自定義參數)

我無法弄清楚如何使我的UITapGestureRecognizer的「行動」採取額外的參數,和實際使用它們。

這裏是我的問題的破敗:

我試圖讓這個我的iPad應用程序記錄(含的NSLog)時,他們按我的應用程序的UIButtons之一發生的UITouch的座標。觸摸的位置需要相對於被觸摸的按鈕。

我做了什麼:

我實現了一個UITapGestureRecognizer並將其添加到我的每一個按鈕。我的問題是使用動作,因爲它需要對每個按鈕都是動態的。

我現在有這樣的代碼:

UITapGestureRecognizer *iconClickRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(logIcon:withTag:)]; 
[iconClickRecognizer setNumberOfTapsRequired:1]; 
[iconClickRecognizer setNumberOfTouchesRequired:1]; 
[iconClickRecognizer setDelegate:self]; 
[[self.view viewWithTag:1] addGestureRecognizer:iconClickRecognizer]; 

[iconClickRecognizer release]; 

當我知道這個作品,我會用一個for循環通過其標籤的iconClickRecognizer添加到所有的按鈕。

logIcon:(INT)withTag方法如下所示:

-(void)logIcon:(UIGestureRecognizer *)gestureRecognizer withTag:(int)tag { 
    NSLog(@"tag X: %f", [gestureRecognizer locationInView:(UIView*)[self.view viewWithTag:tag]].x); 
    NSLog(@"tag Y: %f", [gestureRecognizer locationInView:(UIView*)[self.view viewWithTag:tag]].y); 
} 

什麼不工作:

當我硬編碼標籤進入logIcon方法,它記錄正確的信息。但是,我不知道如何使這個方法變爲動態,並且實際上使用了「tag」參數。

任何幫助將不勝感激。

謝謝, 亞歷克斯

回答

4

爲UIGestureRecognizer類的文檔指定動作一定是這樣的形式:

- (void)handleGesture; 
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer; 

不是你的形式:

- (void)logIcon:(UIGestureRecognizer *)gestureRecognizer withTag:(int)tag 

所以,你可以問gestureRecognizer它是整體上窗口,然後與您的按鈕進行比較,或者您可以遍歷按鈕並詢問相對於每個按鈕的位置。

可能最好的辦法是將UIButton子類化並使每個按鈕本身成爲目標;那麼你完全知道你在看什麼。

8

的問題是,你只能從目標/行動樣式註冊一個參數,即發送方(在這種情況下,手勢識別器本身)。你無法傳遞任意的上下文。但是,您可以在您的操作中檢查識別器的view屬性並檢查該視圖的tag

+0

這是處理它的最好方法。標記視圖,並從手勢識別器訪問視圖。很好的答案! – WendiKidd 2012-11-16 18:47:38