我已经创建了几个自定义 UIGestureRecognizers 没有问题。我决定我想要一个自定义版本的单击手势并着手继承 UIGestureRecognizer。除了一个问题,一切似乎都很好。在我的 Action 处理程序 [gestureRecognizer locationInView:self] 中,x 和 y 总是返回零。当我回到 UITapGestureRecognizer 时, Action 处理程序工作正常。这一定与子类手势识别器有关,这是我的代码:
#import "gr_TapSingle.h"
#define tap_Timeout 0.25
@implementation gr_TapSingle
- (id)init
{
self = [super init];
if ( self )
{
}
return self;
}
- (void)reset
{
}
-(void)gesture_Fail
{
self.state = UIGestureRecognizerStateFailed;
}
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[super touchesBegan:touches withEvent:event];
if ( [self numberOfTouches] > 1 )
{
self.state = UIGestureRecognizerStateFailed;
return;
}
originLocation = [[[event allTouches] anyObject] locationInView:self.view];
[self performSelector:@selector(gesture_Fail) withObject:nil afterDelay:tap_Timeout];
}
-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
[super touchesMoved:touches withEvent:event];
if ( self.state == UIGestureRecognizerStatePossible )
{
CGPoint l_Location = [[[event allTouches] anyObject] locationInView:self.view];
CGPoint l_Location_Delta = CGPointMake( l_Location.x - originLocation.x, l_Location.y - originLocation.y );
CGFloat l_Distance_Delta = sqrt( l_Location_Delta.x * l_Location_Delta.x + l_Location_Delta.y * l_Location_Delta.y );
if ( l_Distance_Delta > 15 )
self.state = UIGestureRecognizerStateFailed;
return;
}
}
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
[super touchesEnded:touches withEvent:event];
if ( self.state == UIGestureRecognizerStatePossible )
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(gesture_Fail) object:nil];
if ( self.state != UIGestureRecognizerStateFailed )
self.state = UIGestureRecognizerStateEnded;
}
-(void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
[super touchesCancelled:touches withEvent:event];
if ( self.state == UIGestureRecognizerStatePossible )
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(gesture_Fail) object:nil];
self.state = UIGestureRecognizerStateFailed;
}
@end
最佳答案
苹果的文档说:
所以我假设每个子类都有它自己的这个方法的特殊实现,适合自己的专业。所以如果你想继承 UIGestureRecognizer
,你必须自己实现它。
编辑:
就像是:
- (CGPoint)locationInView:(UIView *)view
{
if(view == self.view)
{
return originLocation;
}
else
{
//you decide
}
}
关于iphone - 创建自定义 UIGestureRecognizer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10320641/