Ios 确定UIPinchGestureRecognitor的方向(无坡度)

Ios 确定UIPinchGestureRecognitor的方向(无坡度),ios,swift,uigesturerecognizer,uipinchgesturerecognizer,Ios,Swift,Uigesturerecognizer,Uipinchgesturerecognizer,我正在使用UIPinchGestureRecognitor调整我应用程序中的视图帧大小。我想独立调整高度和宽度的大小(视图是捕捉到栅格上的矩形),因此我需要确定收缩是用于修改高度还是宽度 起初,我尝试使用两点之间的坡度,正如许多帖子所建议的那样。大概是这样的: enum ScalingType { case widthOnly, heightOnly, widthAndHeight } private func determineScaling(loc1: CGPoint, loc2:

我正在使用UIPinchGestureRecognitor调整我应用程序中的视图帧大小。我想独立调整高度和宽度的大小(视图是捕捉到栅格上的矩形),因此我需要确定收缩是用于修改高度还是宽度

起初,我尝试使用两点之间的坡度,正如许多帖子所建议的那样。大概是这样的:

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
    }
}
虽然这适用于大多数形状,但当形状在任一维度上变得非常窄时,它就不起作用了。例如,如果我想调整短高长宽矩形的高度,手指将垂直移动,但手指的水平距离可能比垂直距离大

有没有最好的方法来获得(例如)捏手势中点的平移,或者确定手指移动的方向


谢谢

我猜你会遇到这样一种情况,即窄宽或窄高小于44(44是苹果公司建议的指导原则,很明显,这就是手指触摸所覆盖的像素数)。我建议完全放弃UIPinchGesture,改用UIPanGesture。请记住,它将改变功能。您可以拖动各个边进行缩放(类似于在iPhone照片库中裁剪图片时发生的情况),而不是按比例收缩。通过使用这种方法,如果宽度或高度较窄,你就不必担心两个手指太近(挤压)会弄乱数学计算。这里有一个Swift代码来确定挤压是更水平还是更垂直

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

当它更垂直时,高度因子会增加或减少

给出以下func声明

  @objc func handlePinch(pinch: UIPinchGestureRecognizer)

然后在该功能的主体中,检查夹点是否存在两个触点,以避免碰撞

然后检查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



如果按压次数小于2{
打印(“不要崩溃”)
返回
}
var touchPoint1=pinch.location(ofTouch:0,in:self.view)
var touchPoint2=pinch.location(ofTouch:1,in:self.view)
设deltaX=abs(接触点1.x-接触点2.x)
设deltaY=abs(接触点1.y-接触点2.y)
如果deltaX>deltaY
{
dropRectangleCurrentWidth*=pinch.scale
}
其他的
{
dropRectangleCurrentHeight*=pinch.scale
}
1.scale=1

事实上,我的最小尺寸是70-很容易一触就够大,但不足以2触,而且它们之间没有水平(或垂直)空间。但我会尝试一下你关于平移姿势的建议——这可能是一种不那么笨拙的方式。TNX很高兴为您提供帮助您的解决方案与问题中包含的(不成功)代码有何不同?