2012-09-10 75 views
10

UIPinchGestureRecognizer का उपयोग करते समय UIPinchGestureRecognizer का स्केल UIPinchGestureRecognizer का उपयोग करते समय क्षैतिज और लंबवत दिशाओं में चुटकी पैमाने का पता लगाने/पढ़ने का सबसे अच्छा तरीका क्या है? मैं इस पोस्टक्षैतिज और ऊर्ध्वाधर दिशाओं में अलग-अलग

UIPinchGestureRecognizer Scale view in different x and y directions

देखा था, लेकिन मैंने देखा है इतने सारे आगे पीछे जा रहा इस तरह के एक मालूम होता है नियमित काम है कि मुझे यकीन है कि सबसे अच्छा जवाब/तरीका है नहीं कर रहा हूँ के लिए बन रही थीं।

यदि इस उद्देश्य के लिए पूरी तरह से UIPinchGestureRecognizer का उपयोग नहीं करना है, तो दो अलग-अलग दिशाओं में चुटकी पैमाने का पता लगाने का सबसे अच्छा तरीका क्या है?

उत्तर

2

मेरी सी # में मैं निम्नलिखित है

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

मैं दो बिंदुओं के बीच दूरी की गणना जब चुटकी "शुरू किया" और दो साधारण सैनिक में वह मान पकड़ो। फिर मैं पहली मापा दूरी और दूसरा ("बदले" में) के आधार पर स्केलिंग (फ़ॉन्टस्कालिंग) की गणना करता हूं। मैं आधार (100%) के रूप में सेट करने के लिए अपने स्वयं के दृश्य (_previewView) का उपयोग करता हूं, लेकिन आप इसके बजाय View.Bounds.height या उस चौड़ाई का उपयोग कर सकते हैं। मेरे मामले में, मेरे पास हमेशा एक स्क्वायर व्यू होता है, इसलिए मेरे ऐप में ऊंचाई == चौड़ाई।

1

मूल रूप से इस .. करते हैं,

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

कि समारोह एच, वी, डी वापस आ जाएगी आप के लिए क्षैतिज, खड़ी, विकर्ण।

आप यह कुछ इस तरह का प्रयोग करेंगे ...

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