【问题标题】:Can I use UIPinchGestureRecognizers to distinguish between horizontal and vertical pinches?我可以使用 UIPinchGestureRecognizers 来区分水平和垂直夹点吗?
【发布时间】:2012-01-30 13:39:51
【问题描述】:

我有一个视图,用户可以捏住它来放大或缩小。我希望这可以沿两个轴工作 - 如果夹点大部分是水平的,它将水平扩大/缩小对象,但如果夹点主要是垂直的,它将垂直扩大/缩小对象。

我可以用一两个捏识别器来实现这一点吗?如果可以,如何实现?

【问题讨论】:

    标签: objective-c ios uigesturerecognizer


    【解决方案1】:

    您也许可以为此使用UIPinchGestureRecognizer,但您必须编写代码来确定捏合是水平的还是垂直的。我还没有测试过这个:

    typedef enum {
        PinchAxisNone,
        PinchAxisHorizontal,
        PinchAxisVertical
    } PinchAxis;
    
    PinchAxis pinchGestureRecognizerAxis(UIPinchGestureRecognizer *r) {
        UIView *view = r.view;
        CGPoint touch0 = [r locationOfTouch:0 inView:view];
        CGPoint touch1 = [r locationOfTouch:1 inView:view];
        CGFloat tangent = fabsf((touch1.y - touch0.y) / (touch1.x - touch0.x));
        return
            tangent <= 0.2679491924f ? PinchAxisHorizontal // 15 degrees
            : tangent >= 3.7320508076f ? PinchAxisVertical   // 75 degrees
            : PinchAxisNone;
    }
    

    【讨论】:

    • 很好,但是 1. 我想你的意思是 fabsf((touch1.y - touch0.y) / (touch1.x - touch0.x)),最后一个组件是 x。 2. 您应该首先检查是否完全垂直,if (touch1.x == touch0.x) return PinchAxisVertical; 以防止被零除; 3. 请注意,这测试的是两个手指相对于彼此的角度,而不是手指的相对运动。基本的三角学可以应用于实际观察三角洲的东西,但这更多的是“手指位置的角度”而不是“手指运动的角度”。
    • 最后一个y 需要成为x 是对的。我已经解决了。感谢您的注意。但是,不需要检查除以零,因为它会产生浮点无穷大,随后的条件表达式可以正确处理。
    • 感谢您的提示。但是你必须用if(sender.numberOfTouches == 2){ ... } 包围你的代码,因为UIPinchGestureRecognizer 可以用1 次触摸触发,如果你从2 开始然后你移开手指。
    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多