3

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

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

有什么方法可以在触发touchesBegan后手动调用(更改 BOOL 值,并且只有在此 BOOL 设置为 YES 时才有效)。UILongPressGestureRecognizerUILongPressGestureRecognizertouchesBegan

4

2 回答 2

10

UILongPressGestureRecognizer是一个连续的手势识别器,所以不要使用touchesMovedor UIPanGestureRecognizer,只需检查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"
    }
}
于 2013-02-06T13:42:51.837 回答
0

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

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

    最大接触次数

    最少接触次数

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

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

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

    例子:

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

    2. 当状态为 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.
      }
     }
    
  4. 阻力的速度。根据速度,您可以提供动画来显示 UIView 的弹跳

    - (CGPoint)velocityInView:(UIView *)view

于 2013-02-06T13:38:44.463 回答