CGAffineTransform のスケールと変換に関する問題に苦労しています。すでに変換があるビューのアニメーション ブロックで変換を設定すると、アニメーション化される前にビューが少しジャンプします。
例:
// somewhere in view did load or during initialization
var view = UIView()
view.frame = CGRectMake(0,0,100,100)
var scale = CGAffineTransformMakeScale(0.8,0.8)
var translation = CGAffineTransformMakeTranslation(100,100)
var concat = CGAffineTransformConcat(translation, scale)
view.transform = transform
// called sometime later
func buttonPressed() {
var secondScale = CGAffineTransformMakeScale(0.6,0.6)
var secondTranslation = CGAffineTransformMakeTranslation(150,300)
var secondConcat = CGAffineTransformConcat(secondTranslation, secondScale)
UIView.animateWithDuration(0.5, animations: { () -> Void in
view.transform = secondConcat
})
}
現在、buttonPressed() が呼び出されると、アニメーションを開始する前にビューが約 10 ピクセル左上にジャンプします。この問題は連結変換でのみ発生しましたが、移動変換のみを使用すると正常に動作します。
編集:私はこの件に関して多くの調査を行ったので、この問題は自動レイアウトがオンになっているかどうかに関係なく発生することを言及する必要があると思います。
ベストアンサー1
私も同じ問題に遭遇しましたが、問題の正確な原因はわかりませんでした。ジャンプは、非常に特殊な条件でのみ発生するようです。ビューが変換から変換t1
にアニメーション化されt2
、両方の変換がスケールと変換の組み合わせである場合 (まさにあなたのケースです)。次の回避策を考えると、私には意味がわかりませんが、これは Core Animation のバグだと思います。
まずは、CATransform3D
の代わりにを使ってみましたCGAffineTransform
。
古いコード:
var transform = CGAffineTransformIdentity
transform = CGAffineTransformScale(transform, 1.1, 1.1)
transform = CGAffineTransformTranslate(transform, 10, 10)
view.layer.setAffineTransform(transform)
新しいコード:
var transform = CATransform3DIdentity
transform = CATransform3DScale(transform, 1.1, 1.1, 1.0)
transform = CATransform3DTranslate(transform, 10, 10, 0)
view.layer.transform = transform
新しいコードは古いコードと同等であるはずです (4 番目のパラメータは1.0
またはに設定されている0
ため、方向のスケーリング/変換はありませんz
)。実際、同じジャンプが表示されます。ただし、ここで黒魔術が登場します。スケール変換で、パラメータをz
とは異なる値に変更します1.0
。次のようにします。
transform = CATransform3DScale(transform, 1.1, 1.1, 1.01)
このパラメータは効果がないはずですが、今ではジャンプはなくなりました。
✨