2011-02-09 11 views
39

मैंने सफलतापूर्वक एक दृश्य को एक चुटकी लागू किया। हालांकि, दृश्य खुद को स्थिति में नहीं रखता है जहां मैं इसे चाहता था। आईपैड के साथ स्टैक ओवरफ्लॉवर के लिए, मैं अपने विचार को आईपैड फोटो.एप पर केंद्रित करना चाहता हूं: जब आप & एल्बम पर ज़ूम करते हैं, तो फ़ोटो स्वयं को एक दृश्य में प्रस्तुत करती हैं जो विस्तार कर रही है। यह दृश्य पहली उंगली पर ऊपरी दाएं कोने के साथ केंद्रित है और दूसरी उंगली पर नीचे बाएं हाथ की उंगली है। मैंने इसे पैन पहचानकर्ता के साथ मिश्रित किया, लेकिन इस तरह उपयोगकर्ता को हमेशा चुटकी लगाना पड़ता है, और फिर समायोजित करने के लिए पैन करना पड़ता है।UIPinchGestureRecognizer दो अंगुलियों के बीच चुने हुए दृश्य को स्थिति

यहाँ तो ग्राफिक विवरण, मैं अपने ऐप के एक वीडियो पोस्ट कर सकता है कि अगर स्पष्ट नहीं है कि कर रहे हैं (कोई रहस्य नहीं है, मैं आईपैड की Photos.app पुन: पेश करने की कोशिश कर रहा हूँ ...)

एक प्रारंभिक के लिए

तो उंगलियों की स्थिति, ज़ूमिंग शुरुआत:

enter image description here

यह अब के लिए वास्तविक "जूम" फ्रेम है। वर्ग बड़ा है, लेकिन स्थिति उंगलियों से नीचे है

given the start position

यहाँ है मैं करना चाहते हैं क्या: एक ही आकार, लेकिन अलग origin.x और y:

enter image description here

(मेरे खराब फ़ोटोशॉप कौशल के बारे में खेद है ^^)

+0

HI थॉमस, मुझे इसके बारे में भी बहुत रुचि है। क्या आपको इसके बारे में कोई समाधान मिला? क्या आपके पास कोई नमूने कोड हैं? thx ~ – ludo

+2

मेरे पास इस समस्या पर वापस आने का समय नहीं है, लेकिन @md_develop उत्तर बहुत अच्छा लग रहा है। मैं अपना कोड अपडेट करने के लिए कुछ समय खोजने का प्रयास करूंगा और जवाब स्वीकार करूँगा अगर यह –

उत्तर

41

आप विधि handlingPinchGesture में निम्न कोड के माध्यम से दो उंगलियों के बीच मध्य की CGPoint मिल सकती है।

CGPoint point = [sender locationInView:self]; 

मेरा पूरा handlePinchGesture विधि नीचे है।

/* 
instance variables 

CGFloat lastScale; 
CGPoint lastPoint; 
*/ 

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)sender { 
    if ([sender numberOfTouches] < 2) 
     return; 

    if (sender.state == UIGestureRecognizerStateBegan) { 
     lastScale = 1.0; 
     lastPoint = [sender locationInView:self]; 
    } 

    // Scale 
    CGFloat scale = 1.0 - (lastScale - sender.scale); 
    [self.layer setAffineTransform: 
     CGAffineTransformScale([self.layer affineTransform], 
           scale, 
           scale)]; 
    lastScale = sender.scale; 

    // Translate 
    CGPoint point = [sender locationInView:self]; 
    [self.layer setAffineTransform: 
     CGAffineTransformTranslate([self.layer affineTransform], 
            point.x - lastPoint.x, 
            point.y - lastPoint.y)]; 
    lastPoint = [sender locationInView:self]; 
} 
+1

के लिए इसकी आवश्यकता है यह कैसे काम कर सकता है जब [प्रेषक स्थान INView: self] हमेशा एक ही बिंदु, दो चुटकी वाली उंगलियों के बीच मध्य बिंदु देता है? – Guy

+1

@Guy midpoint 'UIGestureRecognizerStateBegan' के बाद बदल रहा है क्योंकि आप उंगलियों को दूर या करीब ले जाते हैं। 'locationInView: self' दो अंगुलियों के बीच केंद्रित करता है। वह हिस्सा काम करता है। हालांकि 1 घंटे के बाद भी मैं इसे अपने ऐप में काम करने के लिए नहीं मिला, जहां मेरे पास परतों का समूह है जिसे मुझे स्थानांतरित करने की आवश्यकता है .. –

+1

मैंने इस विधि का उपयोग किया और दृश्य सही ढंग से अनुवादित किया गया है। हालांकि, इसका अनुवाद जिस तरह से किया गया है, वह फोटो ऐप –

11

Touches sample project पर एक नज़र डालें। विशेष रूप से इन तरीकों आप मदद कर सकता है:

// scale and rotation transforms are applied relative to the layer's anchor point 
// this method moves a gesture recognizer's view's anchor point between the user's fingers 
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     UIView *piece = gestureRecognizer.view; 
     CGPoint locationInView = [gestureRecognizer locationInView:piece]; 
     CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview]; 

     piece.layer.anchorPoint = CGPointMake(locationInView.x/piece.bounds.size.width, locationInView.y/piece.bounds.size.height); 
     piece.center = locationInSuperview; 
    } 
} 

// scale the piece by the current scale 
// reset the gesture recognizer's rotation to 0 after applying so the next callback is a delta from the current scale 
- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer 
{ 
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 
     [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]); 
     [gestureRecognizer setScale:1]; 
    } 
} 
+0

धन्यवाद करता है, लेकिन 'view.transform' का उपयोग करके मेरे सबव्यूज़ का आकार बदलता है ... क्या इसे रोकने का कोई तरीका है? –

+0

# आयात - मुझे एंकरपॉइंट –

संबंधित मुद्दे