【问题标题】:UIGestureRecognizer endingUIGestureRecognizer 结尾
【发布时间】:2017-10-31 03:07:48
【问题描述】:

我想在我的 iPhone 应用程序中处理旋转手势并在此期间旋转 imageView。在手势结束时,我想将 imageView 旋转到固定位置。 所以即。如果我将 imageView 从 0 弧度旋转到 M_PI/2 弧度,但在中途某处我以手势结束。结束后我想测试角度,如果它接近 M_PI/2,则将其设置为 M_PI/2,否则设置为 0。
这是我尝试执行此操作的代码:

我创建识别器并将其添加到我的视图中。

UIGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRecognized:)];
recognizer.delegate = self;
[self addGestureRecognizer:recognizer];
[recognizer release];

委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if (_imageView) {
        return YES;
    }
    return NO;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

手势识别方法:

- (void)gestureRecognized:(UIRotationGestureRecognizer *)recognizer {
    _imageView.transform = CGAffineTransformMakeRotation(recognizer.rotation);
}

这些方法有效,但这是我尝试结束手势的方法。这不起作用:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"gesture end");
}

在转换方面我也有一点问题。有时会回到 0 弧度。

欢迎提出任何建议。谢谢!

【问题讨论】:

    标签: iphone objective-c uigesturerecognizer


    【解决方案1】:

    我在其他论坛上找到了答案。我希望这对其他人也有帮助。 答:

    您可以通过在您的操作方法中检查 UIRotationGestureRecognizer 的状态来检测手势的结束。如果 [gestureRecognizer state] == UIGestureRecognizerStateEnded 那么它就完成了。如果某些事情反而导致它被取消(例如,来电),那么您会看到它以 UIGestureRecognizerStateCancelled 结束。

    如果您想将识别器的旋转直接应用于您的视图,而不是将其视为与先前位置的增量,您可以设置识别器的旋转,其状态为 UIGestureRecognizerStateBegan,然后它将计算该值的偏移量,您可以直接应用它们。这只需要你记住上次结束的轮换,然后当识别器的状态为 UIGestureRecognizerStateBegan 时,你可以执行类似 [gestureRecognizer setRotation:lastAppliedRotation] 的操作。

    【讨论】:

      【解决方案2】:

      如果gestureRecognizer识别手势,默认情况下不会调用touchesEnded(touchesCancelled会被调用。touchesEnded只会在识别器无法识别手势时被调用)。将gestureRecognizer.delaysTouchesEnded 设置为NO,它应该可以工作。

      【讨论】:

      • 它不工作。你知道为什么吗?还没收到结局。
      • 所以该方法现在被调用了,但不是在我松开手指的时候,而是在我开始旋转之后调用
      • 所以最后没有调用。有什么线索吗?
      【解决方案3】:

      以防万一您也遇到这种情况,这就是您阅读该问题的原因: "end" 和 "recognized" 是相同的值 ( 3 )。所以这段代码(在 swift 中)将不起作用:

      if (gesture.state == .recognized || gesture.state == .changed) {
      }
      else if (gesture.state == .ended) {
      //do something else
      //=> never called
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多