pressGestureRecognizer and touchesBegan

Posted

技术标签:

【中文标题】pressGestureRecognizer and touchesBegan【英文标题】: 【发布时间】:2013-02-06 13:17:49 【问题描述】:

我有以下问题。 我正在使用UILongPressGestureRecognizer 将 UIView 置于“切换模式”。如果UIView 处于“切换模式”,则用户可以在屏幕上拖动 UIView。为了在屏幕上拖动 UIView,我使用了 touchesBegantouchesMovedtouchesEnded 方法。

它有效,但是:我必须抬起手指才能拖动它,因为 touchesBegan 方法已被调用,因此不会再次调用,因此我无法在屏幕上拖动 UIView

有没有办法在UILongPressGestureRecognizer 被触发后手动调用touchesBeganUILongPressGestureRecognizer 更改了 BOOL 值,touchesBegan 仅在此 BOOL 设置为 YES 时才有效)。

【问题讨论】:

Can UILongPressGestureRecognizer be used together with touch events like touchesMoved?的可能重复 【参考方案1】:

UILongPressGestureRecognizer 是一个连续的手势识别器,所以不要诉诸touchesMovedUIPanGestureRecognizer,只需检查UIGestureRecognizerStateChanged,例如:

- (void)viewDidLoad

    [super viewDidLoad];

    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [self.view addGestureRecognizer:gesture];


- (void)handleGesture:(UILongPressGestureRecognizer *)gesture

    CGPoint location = [gesture locationInView:gesture.view];

    if (gesture.state == UIGestureRecognizerStateBegan)
    
        // user held down their finger on the screen

        // gesture started, entering the "toggle mode"
    
    else if (gesture.state == UIGestureRecognizerStateChanged)
    
        // user did not lift finger, but now proceeded to move finger

        // do here whatever you wanted to do in the touchesMoved
    
    else if (gesture.state == UIGestureRecognizerStateEnded)
    
        // user lifted their finger

        // all done, leaving the "toggle mode"
    

【讨论】:

我已经为这个答案寻找了很多个晚上,我的好先生。我已经尝试了几乎所有我知道的方法,以便在长按中间触发 touchesMoved ......它根本行不通。检查状态 .Changed 成功了。非常感谢@Rob。【参考方案2】:

我建议您使用 UIPanGestureRecognizer 作为推荐的拖动手势。

    您可以配置最小值。和最大。平移所需的触摸次数,使用以下属性:

    ma​​ximumNumberOfTouches

    minimumNumberOfTouches

    您可以处理 Began、Changed 和 Ended 等状态,例如为所需状态设置动画。

    使用以下方法将点转换为您想要的 UIView。

    - (void)setTranslation:(CGPoint)translation inView:(UIView *)view

    示例:

      您必须使用全局变量来保留旧框架。在 UIGestureRecognizerStateBegan 中获取它。

      当状态为 UIGestureRecognizerStateChanged 时。您可以使用

    -(void) pannningMyView:(UIPanGestureRecognizer*) panGesture
    
       if(panGesture.state==UIGestureRecognizerStateBegan)
         //retain the original state
       else if(panGesture.state==UIGestureRecognizerStateChanged)
       CGPoint translatedPoint=[panGesture translationInView:self.view];
      //here you manage to get your new drag points.
      
     
    

    阻力的速度。根据速度,您可以提供动画来显示 UIView 的弹跳

    - (CGPoint)velocityInView:(UIView *)view

【讨论】:

感谢您的回答,但是如何获取翻译的坐标?

以上是关于pressGestureRecognizer and touchesBegan的主要内容,如果未能解决你的问题,请参考以下文章

an适合啥样的人物模型

the/an/a用法及区别

TypeError: undefined is not an object , item is from an array from an API

Search an Element in an array

[Creating an image format with an unknown type is an error] on cordova, ios 10

使用 PHAssets 时出现此错误:Creating an image format with an unknown type is an error