我发现在平底锅开始后从未触发长按.我已经尝试设置委托并实现:
- (BOol)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { NSLog(@"simultaneous %@",gestureRecognizer.class); return YES;}- (BOol)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { NSLog(@"require fail %@",gestureRecognizer.class); return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer self]]; // also trIEd return YES; // also trIEd return [gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer self]];}
我试过愚弄pan gr的allowableMovement,也无济于事.我只是放弃并在pan gr中使用一个计时器,它被取消,然后重置动作,但我希望SDK能为我做状态机的东西.
解决方法 如果其他人需要它,这里的代码对我有用.目标是使视图对长按和平移敏感,包括不按平底锅的长按,反之亦然.// setup@property (strong,nonatomic) NSTimer *timer; // triggers the long press during pan@property (strong,nonatomic) UIVIEw *longPressVIEw; // need this to track long press state// vIEw is the vIEw we're interested in panning and long pressingUIPanGestureRecognizer *pangr = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pangr:)];[vIEw addGestureRecognizer:pangr];// this starts a long press when no pan has occurredUILongPressGestureRecognizer *longGR = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGR:)];[vIEw addGestureRecognizer:longGR];
当平底锅开始或更改时,启动计时器.如果计时器在平移结束之前到期(触摸释放),那么我们需要长按.
- (voID)pangr:(UIPanGestureRecognizer *)gr { if (gr.state == UIGestureRecognizerStateBegan) { [self startTimer:gr.vIEw]; } else if (gr.state == UIGestureRecognizerStateChanged) { [self startTimer:gr.vIEw]; // do whatever you want to do with pan state in this method // in my case,I'm translating the vIEw here } else if (gr.state == UIGestureRecognizerStateEnded) { if (self.longPressVIEw) { [self longPressEnded]; } else { [self.timer invalIDate]; } }}
我们给视图的计时器用户信息.您可能需要存储手势状态的其他部分,如位置等.使用用户信息字典以相同的方式.
- (voID)startTimer:(UIVIEw *)vIEw { if (self.longPressVIEw) return; [self.timer invalIDate]; self.timer = [NSTimer scheduledTimerWithTimeInterval:0.8 target:self selector:@selector(longPresstimer:) userInfo:@{ @"vIEw": vIEw} repeats:NO];}-(voID)longPresstimer:(NSTimer *)timer { self.longPressVIEw = timer.userInfo[@"vIEw"]; [self longPressBegan];}
由于timer方法没有关联的gr,因此将我们通常放在gr处理程序中的所有逻辑分解出来,这样定时器处理程序和gr处理程序就可以调用它.
- (voID)longPressGR:(UILongPressGestureRecognizer *)gr { if (gr.state == UIGestureRecognizerStateBegan) { self.longPressVIEw = gr.vIEw; [self longPressBegan]; } else if (gr.state == UIGestureRecognizerStateEnded) { [self longPressEnded]; }}- (voID)longPressBegan { NSLog(@"long press began");}- (voID)longPressEnded { self.longPressVIEw = nil; NSLog(@"long press ended");}总结
以上是内存溢出为你收集整理的ios – 一起识别长按和平移手势识别器全部内容,希望文章能够帮你解决ios – 一起识别长按和平移手势识别器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)