2017-12-26 130 views
8

मैं Phibrow App में समान एनीमेशन बनाना चाहता हूं। कृपया अधिक जानकारी के लिए निम्न वीडियो देखें: - https://www.dropbox.com/s/wwc69a9ktaa52je/IMG_0155.MOV?dl=0लेबल एनीमेशन प्राप्त करें जैसे ही फाइब्रो ऐप

enter image description hereenter image description hereenter image description here

मैं इस एनीमेशन UIPinchGestureRecognizer, UIRotationGestureRecognizer और UIPanGestureRecognizer का उपयोग कर पाने के लिए कोशिश की है। लेकिन अभी तक इस एनीमेशन को पाने में सक्षम नहीं है।

func handlePinchGesture(gesture: UIPinchGestureRecognizer) { 
    if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed{ 
     //print("UIPinchGestureRecognizer") 

     gesture.view?.transform = (gesture.view?.transform)!.scaledBy(x: gesture.scale, y: gesture.scale) 
     gesture.scale = 1.0 
    } 
} 


func handleRotationGesture(gesture: UIRotationGestureRecognizer) { 
    if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed{ 
     print("UIRotationGestureRecognizer : ", gesture.rotation) 
     gesture.view?.transform = (gesture.view?.transform)!.rotated(by: gesture.rotation) 
     gesture.rotation = 0 
    } 
} 

func handlePanGesture(gesture: UIPanGestureRecognizer) { 
    if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed{ 
     //print("UIPanGestureRecognizer") 
     let translation = gesture.translation(in: view) 
     gesture.view?.transform = (gesture.view?.transform)!.translatedBy(x: translation.x, y: translation.y) 
     gesture.setTranslation(CGPoint(x: 0, y: 0), in: view) 
    } 
} 

क्या इस एनीमेशन को पाने का कोई तरीका है?

+1

देखें https://www.raywenderlich.com/162745/uigesturerecognizer-tutorial-getting-started –

उत्तर

1

समस्या जो मैं देखता हूं वह यह है कि अनुवाद gesture.translation(in: view) जैसा पुनर्प्राप्त किया गया है, उदाहरण के लिए कुछ view की समन्वय प्रणाली में। view आपके उदाहरण में gesture.view.superview है? आप रुचि रखते हैं कि gesture.view को superview समन्वय प्रणाली में कितना स्थानांतरित किया गया है, इसलिए यह स्थिति सत्य होनी चाहिए: view == gesture.view.superview

दूसरी समस्या transform का अनुवाद कर रही है - यह सही नहीं होगा जब रोटेशन और/या स्केल गैर-पहचान हो।

func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    panRecognizer.setTranslation(panRecognizer.view.center, in: panRecognizer.view.superview) 
} 

func handlePanGesture(gesture: UIPanGestureRecognizer) { 
    let translation = gesture.translation(in: gesture.view.superview) 
    gesture.view.center = translation 
} 
1

शायद क्रम में समस्या: ठीक से gesture.view जाने के लिए, आप अपने center स्थिति है, जो दृश्य रोटेशन या पैमाने की स्वतंत्र रूप से सही रहेगा बदलना चाहिए। आप घूर्णन लागू करने के बाद अनुवाद लागू कर रहे हैं। घुमाए गए परिवर्तन पर। इसका मतलब है कि आपकी गंतव्य वस्तु घूर्णन की जाएगी, और उसके बाद राशन के अनुसार अनुवाद किया जाएगा। तो यदि आप फ़्लोट.पीआई पर ऑब्जेक्ट घुमाते हैं और ऑब्जेक्ट को स्थानांतरित करने का प्रयास करते हैं तो यह विपरीत दिशा में आगे बढ़ेगा। इसके बजाय आपको पहले वस्तु को स्थानांतरित करना था और फिर अस्तित्व में परिवर्तन लागू करना था।

@IBAction func panRecognised(_ gesture: UIPanGestureRecognizer) { 
    if gesture.state == .began || gesture.state == .changed{ 
     guard let targetView = gesture.view else { return } 
     let transform = targetView.transform 
     let translation = gesture.translation(in: view) 
     targetView.transform = transform.concatenating(CGAffineTransform(translationX: translation.x, y: translation.y)) 
     gesture.setTranslation(CGPoint(x: 0, y: 0), in: view) 
    } 
} 
2

मुझे लगता है कि यह कोड आपके लिए काम करता है। मैं दो बार देखा गया firstView और secondView घोषित कर दिया और दोनों विचारों के लिए अलग से इशारा जोड़ लिया है की तरह है, तो उदाहरण के लिए panGesture के मामले में:

firstPan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePanGesture(gesture:))) 
    secondPan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePanGesture(gesture:))) 
    firstView.addGestureRecognizer(secondPan!) 
    secondView.addGestureRecognizer(firstPan!) 

चुटकी और रोटेशन के लिए मैं इशारा जोड़ने के लिए एक ही विधि का इस्तेमाल किया है, जैसा कि ऊपर। और आपके मामले के लिए आपको दोनों दृश्यों के लिए एक ही समय में पैन जेस्चर काम को छोड़कर चुटकी और रोटेशन इशारा होना चाहिए ताकि केवल यह देखने के लिए कि कौन सा दृश्य और अन्य दृश्यों के लिए ट्रांसफॉर्म लागू हो।

@objc func handlePinchGesture(_ gestureRecognizer: UIPinchGestureRecognizer) { 
    guard gestureRecognizer.view != nil else { return } 
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { 
     if gestureRecognizer.view == firstView { 
      gestureRecognizer.view?.transform = (gestureRecognizer.view?.transform.scaledBy(x: gestureRecognizer.scale, y: gestureRecognizer.scale))! 
      secondView.transform = (secondView.transform.scaledBy(x: gestureRecognizer.scale, y: gestureRecognizer.scale)) 
      gestureRecognizer.scale = 1.0 
     }else{ 
      gestureRecognizer.view?.transform = (gestureRecognizer.view?.transform.scaledBy(x: gestureRecognizer.scale, y: gestureRecognizer.scale))! 
      firstView.transform = (firstView.transform.scaledBy(x: gestureRecognizer.scale, y: gestureRecognizer.scale)) 
      gestureRecognizer.scale = 1.0 
     } 
    } 
} 


@objc func handleRotationGesture(gesture: UIRotationGestureRecognizer) { 
    if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed{ 
     if gesture.view == firstView { 
      gesture.view?.transform = (gesture.view?.transform)!.rotated(by: gesture.rotation) 
      secondView.transform = (secondView.transform).rotated(by: gesture.rotation) 
      gesture.rotation = 0 
     }else{ 
      gesture.view?.transform = (gesture.view?.transform)!.rotated(by: gesture.rotation) 
      firstView.transform = (firstView.transform).rotated(by: gesture.rotation) 
      gesture.rotation = 0 
     } 
    } 
} 

@objc func handlePanGesture(gesture: UIPanGestureRecognizer) { 
    if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed{ 
     let translation = gesture.translation(in: view) 
     gesture.view?.transform = (gesture.view?.transform)!.translatedBy(x: translation.x, y: translation.y) 
     gesture.setTranslation(CGPoint(x: 0, y: 0), in: view) 
    } 
} 
+0

@ बैठक दोषी उपरोक्त कोड कोशिश करते हैं और मुझे पता है कि वह आपके लिए काम नहीं किया करते हैं। – Shezad

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