xyk blog

最近は iOS 開発の記事が多めです。

CGAffineTransform を使い View を180度回転、元に戻す

環境: Swift 5.0.1

ある View (ここではUIImageView)を180度回転させる、そして元の状態に戻すアニメーションをさせたい。
こういう場合、 CGAffineTransform の rotation を使えば実現できる。
f:id:xyk:20190717114639g:plain:w80

こんなかんじの動きにしたかったのだが少しハマってしまった。
最初は以下のように実装した。

UIView.animate(withDuration: 0.5) {
    if self.arrowUpImageView.transform.isIdentity {
        self.arrowUpImageView.transform = CGAffineTransform(rotationAngle: .pi)
    } else {
        self.arrowUpImageView.transform = .identity
    }
}

しかしこれだと上画像のように逆回転せず下画像のように同方向の回転で戻ってしまう。

f:id:xyk:20190717114430g:plain:w80

そこで以下のように180度に満たないangleにすることで意図通り逆回転で戻ったので、とりあえずこれでよしとする。

UIView.animate(withDuration: 0.5) {
    if self.arrowUpImageView.transform.isIdentity {
        self.arrowUpImageView.transform = CGAffineTransform(rotationAngle: .pi * 0.999)
    } else {
        self.arrowUpImageView.transform = .identity
    }
}

f:id:xyk:20190717114639g:plain:w80