Ios UIPangestureRecognitor在触摸时立即执行某些操作

Ios UIPangestureRecognitor在触摸时立即执行某些操作,ios,uigesturerecognizer,uipangesturerecognizer,Ios,Uigesturerecognizer,Uipangesturerecognizer,我是ios新手,所以如果我遗漏了一些明显的东西,我会提前道歉 我正在制作一个拼图,我希望每个拼图块在触摸时变大,松开时变小 目前我有: -(IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{ if(recognizer.state == UIGestureRecognizerStateBegan) else if(recognizer.state == UIGestureRecognizerStateEnded) } 当平移

我是ios新手,所以如果我遗漏了一些明显的东西,我会提前道歉

我正在制作一个拼图,我希望每个拼图块在触摸时变大,松开时变小

目前我有:

-(IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{
  if(recognizer.state == UIGestureRecognizerStateBegan)
  else if(recognizer.state == UIGestureRecognizerStateEnded)
}
当平移开始时(也是状态开始时),拼图块的大小增加,当平移结束时,拼图块的大小减小(如预期)。我想大小增加,一旦用户已经接触到的一块和之前的拼图块移动。这可以在选择互动程序时与朋友的文字中看到

我试过了

-(IBAction)handleTap:(UITapGestureRecognizer *)recognizer{
  if(recognizer.state == UIGestureRecognizerStateBegan)
  else if(recognizer.state == UIGestureRecognizerStateEnded)
}
这只会在手指抬起后增加拼图

我的问题:

有没有一种方法可以在手指接触到拼图块后增加拼图块的大小,然后继续平移手势


提前感谢。

根据
UIPangestureRecognitizer
只有在“允许的最小手指数(最小触碰数)移动到足以被视为平移”时,才会进入UIgestureRecognitizer状态。如果您想在触摸时立即发生某些事情,可以尝试将UIPangestureRecognitor子类化,然后跳过
触摸开始:withEvent:

我正在尝试做类似的事情,我一直在研究的解决方案是使用视图的touchBegind:withEvent:在用户触摸屏幕时执行我想要执行的操作。一旦触摸变成手势,手势处理程序就会接管。我也需要这样做,杰克的建议对我来说非常有效。为了帮助将来遇到此问题的任何人,下面是我的
uipangestrerecognizer
的子类实现(标题保持不变):


我已经实现了George WS的答案。通过一些测试,我意识到在初次触摸之后,但在初次触摸结束之前发生的其他触摸事件没有得到正确处理。这是我更新的实现。这有点幼稚,但可以防止UIgestureRecognitizerState多次出现所导致的奇怪行为

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if (self.state >= UIGestureRecognizerStateBegan) {
        return;
    }

    [super touchesBegan:touches withEvent:event];
    self.state = UIGestureRecognizerStateBegan;
}
谢谢George WS&Derrick Hathaway

Swift 2.2

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
  if (self.state == UIGestureRecognizerState.Began) {
    return
  }
  super.touchesBegan(touches, withEvent: event)
  self.state = UIGestureRecognizerState.Began;
}
override func touchsbegined(touchs:Set,withEvent-event:UIEvent){
if(self.state==UIGestureRecognitizerState.Start){
返回
}
super.touchsbegind(touchs,withEvent:event)
self.state=UIgestureRecognitizerState.Start;
}
您必须将以下内容添加到桥接标头中:

#import <UIKit/UIGestureRecognizerSubclass.h>
#导入

Swift 3/4/5解决方案

class InstantPanGestureRecognizer: UIPanGestureRecognizer {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if self.state == .began { return }
        super.touchesBegan(touches, with: event)
        self.state = .began
    }

}
class InstantPangestureRecogener:UIPangestureRecogener{
覆盖func touchesStart(touchs:Set,带有事件:UIEvent){
如果self.state==.start{return}
super.touchesbeated(touches,with:event)
self.state=.start
}
}

我在作为UIScrollView一部分的视图中绘制。我使用UIPangestureRecognitor在视图中绘制。此UIPangestureRecognitor的MinimumNumberOfTouchs和MaximumNumberOfTouchs设置为1

我使用滚动视图中的UIPinchGestureRecognitor和UIPanGestureRecognitor进行平移和缩放。scrollView的UIPangestureRecognitor将MinimumNumberOfTouchs和MaximumNumberOfTouchs设置为2

我使用了George WS的解决方案,我注意到绘图开始得很快,但很难识别用于缩放的捏手势和用于平移的双指平移手势。我稍微更改了解决方案,并使用TouchsMoved来识别绘图的开始。可以更好地识别缩放和平移

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
    super.touchesMoved(touches, with: event)
    state = UIGestureRecognizer.State.began
}
override func touchesMoved(touch:Set,带有事件:UIEvent){
super.touchesMoved(touches,with:event)
state=UIgestureRecognitor.state.Start
}

是,缺少“中间”状态。你必须跟踪它,看看它们是否已经开始移动(
translationview
)。你是个天才,我从来没有想过要这么做。手势识别器将使用相同的状态值调用其选择器两次…如果我们在本身具有touchesBegind方法的UIview上实现ImmediatePanGestureRecognizer,该怎么办?我们如何区分优先级?@GeorgeWS,如果你看到这条消息,我只是在你的“著名答案”中修正了当前的Swift!显然,请随意回滚、编辑等,干杯!这也是我的情况。谢谢你的主意!
class InstantPanGestureRecognizer: UIPanGestureRecognizer {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if self.state == .began { return }
        super.touchesBegan(touches, with: event)
        self.state = .began
    }

}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
    super.touchesMoved(touches, with: event)
    state = UIGestureRecognizer.State.began
}