确定UIPinchGestureRecognizer的方向(无斜率)

时间:2017-08-21 23:55:01

标签: ios swift uigesturerecognizer uipinchgesturerecognizer

我正在使用UIPinchGestureRecognizer来调整我的应用中的视图帧。我想独立调整高度和宽度(视图是对齐网格上的矩形),因此我需要确定是否要修改高度或宽度。

最初我尝试使用两点之间的斜率,正如许多SO帖子所暗示的那样。像这样:

enum ScalingType {
    case widthOnly, heightOnly, widthAndHeight
}

private func determineScaling(loc1: CGPoint, loc2: CGPoint) -> ScalingType {
    let dx = abs(loc1.x - loc2.x)
    let dy = abs(loc1.y - loc2.y)

    if dx > dy {
        return .widthOnly
    } else {
        return .heightOnly
    }
}

虽然这适用于大多数形状,但是当形状在任一维度上变得非常窄时它都不起作用。例如,如果我想调整高度较短且宽度较长的矩形的高度,手指将垂直移动,但手指的水平距离可能比垂直高。

是否有最好的方法来获取(例如)捏合手势中的点的平移或某种方式来确定手指移动的方向?

由于

2 个答案:

答案 0 :(得分:1)

我猜你正在遇到狭窄的宽度或高度小于44的情况(44是Apple的建议指南,显然是指手指接触的像素数)。我建议完全丢弃UIPinchGesture并使用UIPanGesture代替。请记住,它会改变功能。您可以将各个侧面拖放到比例尺(这类似于在iPhone的照片库中裁剪图片时发生的情况),而不是按比例缩放。通过使用这种方法,如果宽度或高度较窄,您不必担心两根手指太近(对于捏)并弄乱数学

答案 1 :(得分:0)

这是用于确定捏合是更水平还是更垂直的 Swift 代码。

当它更水平时,宽度因子会增加或减少。

当它更垂直时,高度系数会增加或减少。

给出下面的func声明

  @objc func handlePinch(pinch: UIPinchGestureRecognizer)

然后在该函数的主体中,检查是否存在用于捏合的 2 个触摸点以避免崩溃。

然后检查 X 和 Y 方向的增量大小。

当手指分开的时候效果非常好。

                        
      if pinch.numberOfTouches < 2 {
        print("don't crash")
        return
      }

      var touchPoint1 = pinch.location(ofTouch: 0, in: self.view)
      var touchPoint2 = pinch.location(ofTouch: 1, in: self.view)

      let deltaX = abs(touchPoint1.x - touchPoint2.x)
      let deltaY = abs(touchPoint1.y - touchPoint2.y)

      if deltaX > deltaY
      {
        dropRectangleCurrentWidth *= pinch.scale
      }
      else
      {
        dropRectangleCurrentHeight *= pinch.scale
      }

      pinch.scale = 1