如何在没有子类化的情况下设置UIView触摸处理程序

时间:2010-08-30 05:00:51

标签: iphone objective-c uiview

如何在不继承UIView或使用UIViewControllers的情况下捕获- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event等触摸事件。

我发生了一个以编程方式创建的简单UIView,我需要检测基本的点击事件。

4 个答案:

答案 0 :(得分:4)

如果您正在为iOS 4编写应用程序,请使用UIGestureRecognizer。然后你可以做你想做的事。识别手势而不进行子类化。

否则,子类化是要走的路。

答案 1 :(得分:1)

没有理由不这样做。如果你继承并添加任何东西,它只是由另一个名称调用的UIView。你所做的就是拦截你感兴趣的那些函数。不要忘记你可以在你的子类'[super touchesBegan:touches]touchesBegan做{{1}}如果你不想阻止响应者进入链中事件也是如此。

答案 2 :(得分:1)

我不是为什么你不想使用普通的子类化UIView来捕捉触摸事件的方法,但如果你真的需要做一些奇怪或偷偷摸摸的事情,你可以捕捉所有事件(包括触摸事件)之前它们通过在UIWindow级别捕获/处理sendEvent:方法而被发送到视图层次结构中。

答案 3 :(得分: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];