2017-12-26 9 views
8

Phibrow Appと同じアニメーションを作成したいと思います。詳細については、以下の動画をご覧ください。 - 私はUIPinchGestureRecognizerUIRotationGestureRecognizerUIPanGestureRecognizerを使用して、このアニメーションを取得しようとしてい https://www.dropbox.com/s/wwc69a9ktaa52je/IMG_0155.MOV?dl=0ラベルを取得アニメーションPhibrow Appと同じ

enter image description hereenter image description hereenter image description here

。しかしまだこのアニメーションを手に入れることはできません。

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。あなたの例のviewgesture.view.superviewですか? gesture.viewsuperview座標系でどれだけ移動されたかに関心があるので、この条件は真でなければなりません:view == gesture.view.superview

第2の問題は、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位置を、変更する必要があります。ローテーションを適用した後に翻訳を適用しています。回転した変換で。これは、目的地オブジェクトがローテーションされ、配分に従って翻訳されることを意味します。したがって、オブジェクトをFloat.Piで回転させてオブジェクトを移動しようとすると、オブジェクトは反対方向に移動します。代わりにオブジェクトを最初に移動してから、既存のトランスフォームを適用する必要がありました。

@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

私はこのコードはあなたのために働くと思います。 私は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!) 

iがジェスチャを追加するには、上記と同じ方法を使用しています。 あなたのケースでは、両方のビューでパンジェスチャーが同時に動作する点を除いて、ピンチと回転のジェスチャーが必要なので、どのビューをチェックし、他のビューにもトランスフォームを適用してください。

@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

関連する問題