UIPinchGestureRecognizer分别在水平和垂直方向上缩放

当使用UIPinchGestureRecognizer时,在水平和垂直方向上检测/读取缩放比例的最佳方法是什么? 我看到这个post

UIPinchGestureRecognizer在不同的x和y方向上缩放视图

但是我注意到这么一个看似常规的任务有很多来回走动,我不确定这是最好的答案。

如果完全不使用UIPinchGestureRecognizer来达到这个目的,那么检测两个不同方向的缩放比例的最好方法是什么?

在我的C#中,我执行以下操作

private double _firstDistance = 0; private int _firstScaling = 0; private void PinchHandler(UIPinchGestureRecognizer pinchRecognizer) { nfloat x1, y1, x2, y2 = 0; var t1 = pinchRecognizer.LocationOfTouch(0, _previewView); x1 = t1.X; y1 = t1.Y; var t2 = pinchRecognizer.LocationOfTouch(1, _previewView); x2 = t2.X; y2 = t2.Y; if (pinchRecognizer.State == UIGestureRecognizerState.Began) { _firstDistance = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2)); _firstScaling = _task.TextTemplates[_selectedTextTemplate].FontScaling; } if (pinchRecognizer.State == UIGestureRecognizerState.Changed) { var distance = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2)); var fontScaling = Convert.ToInt32((distance - _firstDistance) / _previewView.Frame.Height * 100); fontScaling += _firstScaling; _task.TextTemplates[_selectedTextTemplate].FontScaling = fontScaling; UpdateBitmapPreview(); } } 

我计算两点之间的距离,当捏“开始”,并保持在两个私人的价值。 然后我根据第一个测量距离和第二个测量距离(“更改”)计算缩放(fontScaling)。 我使用我自己的视图(_previewView)设置为基础(100%),但您可以使用View.Bounds.height而不是宽度的事情。 在我的情况下,我总是有一个方形的视图,所以高度==宽度在我的应用程序。

基本上这样做,

 func _mode(_ sender: UIPinchGestureRecognizer)->String { // very important: if sender.numberOfTouches < 2 { print("avoided an obscure crash!!") return "" } let A = sender.location(ofTouch: 0, in: self.view) let B = sender.location(ofTouch: 1, in: self.view) let xD = fabs( Ax - Bx ) let yD = fabs( Ay - By ) if (xD == 0) { return "V" } if (yD == 0) { return "H" } let ratio = xD / yD // print(ratio) if (ratio > 2) { return "H" } if (ratio < 0.5) { return "V" } return "D" } 

该function将为您返回H,V,D ..水平,垂直,对angular线。

你会用这个东西…

 func yourSelector(_ sender: UIPinchGestureRecognizer) { // your usual code such as .. // if sender.state == .ended { return } .. etc let mode = _mode(sender) print("the mode is \(mode) !!!") // in this example, we only care about horizontal pinches... if mode != "H" { return } let vel = sender.velocity if vel < 0 { print("you're squeezing the screen!") } }