2012-09-10 29 views
10

Khi sử dụng UIPinchGestureRecognizer cách tốt nhất để phát hiện/đọc quy mô véo theo hướng ngang và dọc riêng lẻ là gì? Tôi thấy bài nàyQuy mô của UIPinchGestureRecognizer theo hướng ngang và dọc riêng biệt

UIPinchGestureRecognizer Scale view in different x and y directions

nhưng tôi nhận thấy có rất nhiều đi tới đi lui cho một nhiệm vụ dường như thói quen như vậy mà tôi không chắc chắn đó là câu trả lời/cách tốt nhất.

Nếu không sử dụng UIPinchGestureRecognizer hoàn toàn cho mục đích này là câu trả lời, cách tốt nhất để phát hiện tỷ lệ pinch theo hai hướng khác nhau là gì?

Trả lời

2

Trong tôi C# Tôi làm như sau

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(); 
     } 
    } 

tôi tính toán khoảng cách giữa hai điểm khi pinch "bắt đầu" và giữ giá trị trong hai lối đi riêng. Sau đó, tôi tính toán một tỷ lệ (fontScaling) dựa trên khoảng cách đo đầu tiên và thứ hai (trong "thay đổi"). Tôi sử dụng chế độ xem của riêng mình (_previewView) để đặt làm cơ sở (100%), nhưng bạn có thể sử dụng View.Bounds.height thay thế hoặc chiều rộng cho vấn đề đó. trong trường hợp của tôi, tôi luôn có chế độ xem hình vuông, vì vậy chiều cao == chiều rộng trong ứng dụng của tôi.

1

Về cơ bản làm được điều này,

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(A.x - B.x) 
    let yD = fabs(A.y - B.y) 
    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" 
} 

Đó là chức năng sẽ trở lại H, V, D cho bạn .. ngang, dọc, chéo.

Bạn sẽ sử dụng nó một cái gì đó như thế này ...

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!") 
    } 
}