ios UIPanGestureRecognizer在触摸时立即执行操作

nbewdwxp  于 2023-03-05  发布在  iOS
关注(0)|答案(7)|浏览(177)

我是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)
}

这将增加拼图块后,只有手指已经解除。
我的问题:
有没有一种方法可以在手指触摸到拼图块后增加拼图块的大小,然后继续平移手势。
先谢谢你。

mrzz3bfm

mrzz3bfm1#

我也需要这样做,Jake的建议对我来说非常有效,为了帮助将来遇到这个问题的人,下面是我的UIPanGestureRecognizer子类实现(头保持不变):

#import "ImmediatePanGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@implementation ImmediatePanGestureRecognizer

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    self.state = UIGestureRecognizerStateBegan;
}

@end

这就是您所需要的一切--只要您将手指放在视图上,它就会立即启动,只要您将手指向任何方向移动一个点,它就会立即更新,并在常规UIPanGestureRecognizer启动之前提供常规UIPanGestureRecognizer(如translationInViewvelocityInView)的功能,所有这些都不会破坏任何现有功能。
Swift 5的复制粘贴,2023年

import UIKit // (nothing extra needed to import with Swift5)

fileprivate class ImmediatePanG: UIPanGestureRecognizer {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesBegan(touches, with: event)
        state = .began
    }
}
y53ybaqx

y53ybaqx2#

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
    }

}
nwsw7zdq

nwsw7zdq3#

我已经实现了乔治WS的答案。通过一点测试,我意识到在初始触摸之后但在初始触摸结束之前发生的额外触摸事件没有得到正确处理。下面是我的更新实现。它有点幼稚,但防止了UIGestureRecognizerStateBegan多次发生导致的奇怪行为。

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

    [super touchesBegan:touches withEvent:event];
    self.state = UIGestureRecognizerStateBegan;
}
piztneat

piztneat4#

根据文档,UIPanGestureRecognizer仅在“允许的最小手指数(minimumNumberOfTouches)移动到足以被视为平移”时进入UIGestureRecognizerStateBegan。如果您希望在触摸时立即发生一些事情,您可以尝试将UIPanGestureRecognizer子类化并覆盖touchesBegan:withEvent:

fslejnso

fslejnso5#

  • 感谢乔治·WS和德里克·海瑟薇 *
    雨燕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;
}

您必须在桥接标题中添加:

#import <UIKit/UIGestureRecognizerSubclass.h>
cnwbcb6i

cnwbcb6i6#

我在作为UIScrollView一部分的视图中绘制。我使用UIPanGestureRecognizer在视图中绘制。此UIPanGestureRecognizer将minimumNumberOfTouches和maximumNumberOfTouches设置为1。
我使用滚动视图中的UIPinchGestureRecognizer和UIPanGestureRecognizer进行平移和缩放。滚动视图的UIPanGestureRecognizer将最小触摸次数和最大触摸次数设置为2。
我使用了乔治WS的解决方案,我注意到绘图开始得很快,但很难识别缩放的捏手势和平移的两个手指平移手势。我稍微改变了解决方案,使用touchesMoved来识别绘图的开始。缩放和平移更容易识别。

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

avkwfej47#

我正在尝试做一件类似的事情,我一直在努力的解决方案是使用视图的touchsBegan:withEvent:来执行我想在用户触摸屏幕的瞬间发生的动作。然后一旦触摸变成手势,手势处理程序就会接管。

相关问题