iOS UIViewを360度回し続ける
English version below
https://hopita.hatenablog.com/entry/2018/08/20/225027
はじめに
UIViewは360度回し続けるのは意外と面倒だったので紹介
すぐ思いつく方法
すぐに思いつく方法はUIView.animateで、transformを設定する方法だと思います。
しかしやって見るとわかると思いますが、失敗します。
例えば、次のように設定すると回転しません。
なぜなら、元の角度に戻っているからです。
view.transform = CGAffineTransform(rotationAngle: CGFloat.pi * 2)
ならばとCGFloat.pi*2-0.0001 とした場合、ほんの少し動いて止まります。
動く角度が小さい向きに回転します。
回転する向きは指定できないのです。
解決方法
解決方法は2つあります。
解決方法1
UIView.animateで180度回転する関数を生成。
UIView.animateのcompletionで再度生成した関数を呼び出す。
このままでは、いびつな回り方です。options などを使うことでうまく回せると思います。
func myAnimation() { UIView.animate(withDuration: 1.0, animations: { self.myView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) }) { (_) in UIView.animate(withDuration: 1.0, animations: { self.myView.transform = CGAffineTransform(rotationAngle: CGFloat.pi * 2) }, completion: { (_) in self.myAnimation() }) } }
解決方法2
次のように QuartsCoreを、利用する
func rotation() { let rotateAnimation = CABasicAnimation(keyPath: "transform.rotation.z") rotateAnimation.toValue = CGFloat(CGFloat.pi * 2.0 * 2.0) rotateAnimation.duration = 2.0 rotateAnimation.isCumulative = true rotateAnimation.repeatCount = 100 myView.layer.add(rotateAnimation, forKey: "rotationAnimation") }
こちらの方法の場合、repeatCountを指定しなければいけないのが面倒なところです。