20

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

我正在创建一个拼图,我希望各个拼图块在触摸时增大并在放开时减小。

目前我有:

-(IBAction)handlePan:(UIPanGestureRecognizer *)recognizer{
  if(recognizer.state == UIGestureRecognizerStateBegan)
  else if(recognizer.state == UIGestureRecognizerStateEnded)
}

当平底锅开始时(也是状态开始时),拼图块的大小会增加,平底锅结束时(如预期的那样),拼图块的大小会减小。一旦用户触摸了一块并且在拼图块移动之前,我希望尺寸增加。选择图块时,可以在 Words With Friends 中看到这一点。

我试过了

-(IBAction)handleTap:(UITapGestureRecognizer *)recognizer{
  if(recognizer.state == UIGestureRecognizerStateBegan)
  else if(recognizer.state == UIGestureRecognizerStateEnded)
}

只有在手指抬起后,这才会增加拼图。

我的问题:

有没有办法在手指触摸拼图后增加拼图的大小,然后继续平移手势。

先感谢您。

4

7 回答 7

41

我也需要这样做,而 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(如translationInViewvelocityInView)的功能一个人会被解雇,所有这些都不会破坏任何现有的功能。


2020 年 Swift 5 的复制粘贴

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)
        self.state = .began
    }
}
于 2013-10-02T19:36:07.080 回答
9

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
    }

}
于 2017-08-27T17:25:58.873 回答
8

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

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

    [super touchesBegan:touches withEvent:event];
    self.state = UIGestureRecognizerStateBegan;
}
于 2014-04-08T12:41:56.157 回答
2

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

于 2013-07-12T20:10:12.683 回答
2

感谢 George WS 和 Derrick Hathaway

斯威夫特 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>
于 2016-08-24T21:26:26.510 回答
2

我在一个属于 UIScrollView 的视图中绘制。我使用 UIPanGestureRecognizer 在视图中绘制。此 UIPanGestureRecognizer 将 minimumNumberOfTouches 和 maximumNumberOfTouches 设置为 1。

我使用滚动视图中的 UIPinchGestureRecognizer 和 UIPanGestureRecognizer 进行平移和缩放。scrollView 的 UIPanGestureRecognizer 将 minimumNumberOfTouches 和 maximumNumberOfTouches 设置为 2。

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

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
    super.touchesMoved(touches, with: event)
    state = UIGestureRecognizer.State.began
}
于 2018-12-23T16:06:42.533 回答
0

我正在尝试做类似的事情,我一直在研究的解决方案是使用视图的 touchesBegan:withEvent: 来执行我想要在用户触摸屏幕的那一刻发生的操作。然后,一旦触摸变成手势,手势处理程序就会接管。

于 2013-07-31T19:58:30.377 回答