2010-08-30 47 views
3

如何捕獲觸摸事件,如- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event而沒有子類化UIView或使用UIViewControllers。如何設置UIView觸摸處理程序而不需要子類化

會發生什麼是我有一個簡單的UIView編程創建,我需要檢測基本的輕敲事件。

+2

你爲什麼不想要繼承它... UIView的子類是理想相同作爲UIView ... – 2010-08-30 05:03:12

+0

你可以說我很懶......但子類將有更多的代碼/類/文件。我只想捕捉觸動,並希望有一個我可以分配給UIView的委託。 – samwize 2010-08-30 05:38:33

+0

hmm ..同樣的問題在這裏,我不想爲了接收觸摸事件而繼承子類。 – rraallvv 2014-01-01 03:18:59

回答

4

如果您正在爲iOS 4編寫應用程序,請使用UIGestureRecognizer。然後你可以做你想做的。無需繼承即可識別手勢。

否則,子類化是要走的路。

+0

這是一個解決方案。我可以使用UIView'addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer'。 – samwize 2010-08-30 05:58:58

+0

注意事項 - 在3.2中添加了,所以你也可以在iPad上使用它們。 – 2010-08-30 06:26:57

1

沒有理由不這樣做。如果你繼承和不添加任何東西,它只是一個UIView由另一個名字調用。你所做的只是攔截你感興趣的功能。如果你不希望阻止響應者從鏈接中獲取這些事件,不要忘記你可以在你的子類'touchesBegan中執行[super touchesBegan:touches]

+0

這是一個很好的建議,但不是如上所述回答問題。 – hotpaw2 2010-08-30 05:31:28

+0

看起來他知道答案 - touchesBegan等 – 2010-08-30 05:35:23

1

我不明白爲什麼你不想使用繼承UIView的普通方法來捕獲觸摸事件,但是如果你確實需要做一些奇怪的事情或偷偷摸摸的事情,你可以捕獲所有的事件(包括觸摸事件)然後通過捕獲/處理UIWindow級別的sendEvent:方法將它們發送到視圖層次結構中。

+0

這是有用的提示,但不是我想要的。 – samwize 2010-08-30 05:36:27

+0

如果有附加事件處理程序的方法,那麼有人不想要繼承UIView是非常合乎邏輯的。這是一個更強大的設計模式。但如果沒有辦法做到這一點,就沒有辦法做到這一點。 (儘管看起來UIGestureRecognizer可能是最好的選擇。) – 2011-01-14 03:40:13

1

CustomGestureRecognizer.h

#import <UIKit/UIKit.h> 

@interface CustomGestureRecognizer : UIGestureRecognizer 
{ 
} 

- (id)initWithTarget:(id)target; 

@end 

CustomGestureRecognizer.mm

#import "CustomGestureRecognizer.h" 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@interface CustomGestureRecognizer() 
{ 
} 
@property (nonatomic, assign) id target; 
@end 

@implementation CustomGestureRecognizer 

- (id)initWithTarget:(id)target 
{ 
    if (self = [super initWithTarget:target action:Nil]) { 
     self.target = target; 
    } 
    return self; 
} 

- (void)reset 
{ 
    [super reset]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesBegan:touches withEvent:event]; 

    [self.target touchesBegan:touches withEvent:event]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesMoved:touches withEvent:event]; 

    [self.target touchesMoved:touches withEvent:event]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [super touchesEnded:touches withEvent: event]; 

    [self.target touchesEnded:touches withEvent:event]; 
} 
@end 

用法:

CustomGestureRecognizer *customGestureRecognizer = [[CustomGestureRecognizer alloc] initWithTarget:self]; 
[glView addGestureRecognizer:customGestureRecognizer];