なんとかするから、なんとかなる

エンジニア関係のことを書きます

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を指定しなければいけないのが面倒なところです。