2017-12-29 30 views
1

このアイコンは、ユーザーが移動できるようにするためのものです。親ビューの特定の領域に入ると、サイズを拡大する必要があります。その後、スケーリング変換を適用するときにぎこちないアニメーションが表示される

let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y) 
var scaleTransformation: CGAffineTransform = CGAffineTransform(scaleX: 1, y: 1) 

if response.shouldScaleUp { 
     scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3) 
} 

let transformation = scaleTransformation.concatenating(moveTransformation) 

そして:その後、私は次のコードでCGAffineTranformationsで希望の動作をアニメーション化しようと

let translationPoint = sender.translation(in: view) 

:私は、ユーザーがパンジェスチャー認識とコマンドを使用してアイコンを移動したい場所を検索します私はアイコンビューに変換を適用します。これは、この動作を引き起こすはずの領域に入ると出るときにちょっとばかげているという点を除いて、かなりうまく動作します。

2つの変換を適用することは一般的には悪い考えであり、実際にはビューの実際のフレームを更新するだけで、変形のアニメーション化によって位置を簡単にリセットできるユーザーが行くことができたとき(私はまたそれが軽いことを意味していると聞いたことがある)。

あなたと女の子にはどんな提案がありますか?あなたの助け

UPDATEしてくれてありがとう

私のアニメーションコード:

DispatchQueue.main.async { 
    UIView.animate(withDuration: 0.15) { 
     self.iconView.transform = transformation 
    } 
} 

答えて

0

巣親ビュー内のアイコン表示。親ビューに位置変換を適用し、子ビューにスケールを適用します。

これにより、トランスフォームが分離され、結果がより簡単に予測できます。

+0

これは機能しているようです。ありがとう:) –

1

複数のトランスフォームを適用しても問題ありません。あなたのコード(アニメーションブロックやネットワークコールの応答)を見ずに、私は2つの推測を行います

1)あなたのUIViewアニメーションブロックがありません。

let translationPoint = sender.translation(in: view) 
    let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y) 
    var scaleTransformation: CGAffineTransform = .identity 

    if response.shouldScaleUp { 
     scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3) 
    } 

    let transformation = scaleTransformation.concatenating(moveTransformation) 
    DispatchQueue.main.async { 
     UIView.animate(withDuration: 0.2) { 
      iconView.transform = scaleTransformation 
     } 
    } 

2)上記の問題が発生する可能性があります。または、上記の問題と組み合わせて、ネットワーク呼び出しからバックグラウンドスレッドのUIを変更しようとしています。これは遅れやジャーキネスを生み出し、上のアニメーションのようなメインスレッド呼び出しでラップする必要があります。

let translationPoint = sender.translation(in: view) 
    let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y) 
    var scaleTransformation: CGAffineTransform = .identity 

    if response.shouldScaleUp { 
     scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3) 
    } 

    let transformation = scaleTransformation.concatenating(moveTransformation) 
    DispatchQueue.main.async { 
     iconView.transform = scaleTransformation 
    } 
+0

私はそれをアニメーション化しようとしなかったと(それはあなたの2番目のソリューション)動作します。それは理想的ではありません。なぜなら、アイコンは今やその増加したサイズにジャンプするからです。 –

+0

最初の例でアニメーションを短くできます。 GCDディスパッチに包まれていることを確認してください。 – agibson007

+0

また、最初の変換スケールを0に設定し、識別するためにスケールを戻すこともできますが、後で何をするのか分かりません。 – agibson007

関連する問題