捕获并记录 UIView 上的触摸事件
Capturing and recording touch events on UIView
我正在尝试子类化 UIView 并设计一个透明视图。这个视图将位于许多其他视图之上,它的唯一任务是捕获和记录用户触摸(点击和平移)。我尝试了许多不同的方法,并在其他用户提出的不同问题中进行了解释,但没有成功。这是我到目前为止在我的实现文件中所做的:
#import "touchLayer.h"
@implementation touchLayer
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) [self commonInit];
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) [self commonInit];
return self;
}
- (void)commonInit
{
self.userInteractionEnabled = YES;
self.alpha = 0.0;
}
- (id)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
id hitView = [super hitTest:point withEvent:event];
if (hitView == self)
{
UITouch *touch = [[event allTouches] anyObject];
if (touch.phase == UITouchPhaseBegan) NSLog(@"touchesBegan");
else if (touch.phase == UITouchPhaseMoved) NSLog(@"touchesMoved");
else if (touch.phase == UITouchPhaseEnded) NSLog(@"touchesEnded");
return nil;
}
else
return hitView;
}
@end
现在这段代码工作得很好,我看到了下层的触摸,但我无法区分 touchBegan、touchMoved 和 touchEnded。 [[event allTouches] anyObject]
returns 无。你知道我如何在不阻塞触摸的情况下捕捉 UIView 上的点击和平移吗?非常感谢。
经过调查,实际上我找不到使用 hitTest
方法和 touchLayer
检测触摸的解决方案。但是你的问题是关于捕获和记录用户触摸,所以我有另一个问题。
我的解决方案是
- 子class
UIWindow
- 将
UIAppDelegate
的 window
替换为使用您的 window class. 创建的新的
- 重写
UIWindow
的 sendEvent
方法,在此方法中捕获并记录用户触摸。
这是我 UIWindow
的子class,用于检测触摸。我试过了,它起作用了。
@implementation DetectTouchWindow
- (void)sendEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
switch ([touch phase]) {
case UITouchPhaseBegan:
NSLog(@"Touch Began");
break;
case UITouchPhaseMoved:
NSLog(@"Touch Move");
break;
case UITouchPhaseEnded:
NSLog(@"Touch End");
break;
case UITouchPhaseCancelled:
NSLog(@"Touch Cancelled");
break;
default:
break;
}
[super sendEvent:event];
}
@end
为了更详细和更容易,我创建了一个演示回购来检查它。你可以看看这个linkhttps://github.com/trungducc/Whosebug/tree/recording-touch-events
希望这对您有所帮助 ;)
我正在尝试子类化 UIView 并设计一个透明视图。这个视图将位于许多其他视图之上,它的唯一任务是捕获和记录用户触摸(点击和平移)。我尝试了许多不同的方法,并在其他用户提出的不同问题中进行了解释,但没有成功。这是我到目前为止在我的实现文件中所做的:
#import "touchLayer.h"
@implementation touchLayer
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) [self commonInit];
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) [self commonInit];
return self;
}
- (void)commonInit
{
self.userInteractionEnabled = YES;
self.alpha = 0.0;
}
- (id)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
id hitView = [super hitTest:point withEvent:event];
if (hitView == self)
{
UITouch *touch = [[event allTouches] anyObject];
if (touch.phase == UITouchPhaseBegan) NSLog(@"touchesBegan");
else if (touch.phase == UITouchPhaseMoved) NSLog(@"touchesMoved");
else if (touch.phase == UITouchPhaseEnded) NSLog(@"touchesEnded");
return nil;
}
else
return hitView;
}
@end
现在这段代码工作得很好,我看到了下层的触摸,但我无法区分 touchBegan、touchMoved 和 touchEnded。 [[event allTouches] anyObject]
returns 无。你知道我如何在不阻塞触摸的情况下捕捉 UIView 上的点击和平移吗?非常感谢。
经过调查,实际上我找不到使用 hitTest
方法和 touchLayer
检测触摸的解决方案。但是你的问题是关于捕获和记录用户触摸,所以我有另一个问题。
我的解决方案是
- 子class
UIWindow
- 将
UIAppDelegate
的window
替换为使用您的 window class. 创建的新的
- 重写
UIWindow
的sendEvent
方法,在此方法中捕获并记录用户触摸。
这是我 UIWindow
的子class,用于检测触摸。我试过了,它起作用了。
@implementation DetectTouchWindow
- (void)sendEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
switch ([touch phase]) {
case UITouchPhaseBegan:
NSLog(@"Touch Began");
break;
case UITouchPhaseMoved:
NSLog(@"Touch Move");
break;
case UITouchPhaseEnded:
NSLog(@"Touch End");
break;
case UITouchPhaseCancelled:
NSLog(@"Touch Cancelled");
break;
default:
break;
}
[super sendEvent:event];
}
@end
为了更详细和更容易,我创建了一个演示回购来检查它。你可以看看这个linkhttps://github.com/trungducc/Whosebug/tree/recording-touch-events
希望这对您有所帮助 ;)