我正在为iPhone编写Objective-C程序。
我正在尝试实现UILongPressGestureRecognizer
,并且无法让它按照我想要的方式运行。
我想要做的事情很简单:
回应屏幕上按住的触摸。
只要触摸移动和触摸开始时,UILongPressGestureRecognizer
就可以正常工作,但如果我在同一个地方按住触摸,则没有任何反应。
为什么?
我如何处理触摸开始,而不是移动,并保持在完全相同的位置?
这是我目前的代码。
// Configure the press and hold gesture recognizer
touchAndHoldRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(touchAndHold:)];
touchAndHoldRecognizer.minimumPressDuration = 0.1;
touchAndHoldRecognizer.allowableMovement = 600;
[self.view addGestureRecognizer:touchAndHoldRecognizer];
答案 0 :(得分:12)
您描述的行为是您的手势识别器在您不移动时未接收到对您的处理程序的进一步调用的行为是标准行为。移动时这些手势的state
属性属于UIGestureRecognizerStateChanged
类型,因此如果事情没有改变,则不会调用您的处理程序。
你可以
state
UIGestureRecognizerStateBegan
state
打电话给您的手势识别器时,启动重复计时器; UIGestureRecognizerStateCancelled
UIGestureRecognizerStateFailed
,UIGestureRecognizerStateEnded
或invalidate
然后locationInView
致电您的手势识别器并释放计时器; @interface ViewController ()
@property (nonatomic) CGPoint location;
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
gesture.minimumPressDuration = 0.1;
gesture.allowableMovement = 600;
[self.view addGestureRecognizer:gesture];
}
- (void)handleTimer:(NSTimer *)timer
{
[self someMethod:self.location];
}
- (void)handleGesture:(UIGestureRecognizer *)gesture
{
self.location = [gesture locationInView:self.view];
if (gesture.state == UIGestureRecognizerStateBegan)
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES];
}
else if (gesture.state == UIGestureRecognizerStateCancelled ||
gesture.state == UIGestureRecognizerStateFailed ||
gesture.state == UIGestureRecognizerStateEnded)
{
[self.timer invalidate];
self.timer = nil;
}
[self someMethod:self.location];
}
- (void)someMethod:(CGPoint)location
{
// move whatever you wanted to do in the gesture handler here.
NSLog(@"%s", __FUNCTION__);
}
@end
或其他值)所以,可能是这样的:
{{1}}