2015年10月16日金曜日

UIViewとかのトランジションアニメーション

画面上でImageViewとかをフェードイン/アウトとかさせる方法

その1:UIViewのアニメーション機能を使う

現在の状態からbeginAnimations()commitAnimations()の間に書かれた状態に変化させてくれるという、iOSではおなじみの方法。
最初にimageViewであるimage1のαチャネルの値(要するに透明度)を0(透明)にしておいて、setAnimationDurationで指定した時間(秒)をかけて、αチャネルの値を1(不透明)にする。
"fadeIn"はanimationIDということで、別の処理との識別に使うので、識別できればなんでもいいようだ。(この例では識別に使ってない)
setAnimationCurve()にアニメーションの進行速度の変化の指定もできる。ここでの.EaseOutはフェードインが速く始まりゆっくり終わる指定。

        image1.alpha = 0
        //フェードイン
        //アニメーションのタイプを指定
        UIView.beginAnimations("fadeIn", context: nil)
        //イージング指定
        UIView.setAnimationCurve(UIViewAnimationCurve.EaseOut)
        //アニメーション秒数を指定
        UIView.setAnimationDuration(2.0)
        //目標のアルファ値を指定
        image1.alpha = 1
        //アニメーション実行
        UIView.commitAnimations()

他にもsetAnimationDidStopSelector〜メソッドでアニメ実行終了後に呼ぶメソッドをSelectorとして指定できたりするようだ。
いろいろあるようなので、調べて使うよろし。

その2:QuartzCoreを使う

ついでに逆にフェードアウトも指定してみる。
その1のやり方でやってもいいんだけど、フェードアウトした直後にimage1をremoveFromSuperview()したところ、フェードアウトせずにさっさとimage1がremoveされてしまったので、別の方法を探したところでてきたのがこれ。
QuartzCoreFrameworkのインポートとかはプロジェクトの設定で必要なのかな。Objective-Cみたいにクラスごとにimportはいらないようだ。
beginAnimationsと違い、どこまでの範囲をアニメーションするとかはないようなので、必要であれば別メソッドに分けて実行させたほうがいいかも。さすがにメソッドの終わりで一区切りつくと思うので。

image1.alpha = 1
//フェードアウト
let transition = CATransition()
transition.duration = 2.0
transition.type = kCATransitionFade
view.layer.addAnimation(transition, forKey: nil)
image1.alpha = 0

なおこの場合、アニメーションが終わった後に
view.layer.removeAllAnimations()
としてアニメ設定を削除しておかないと、次回使う時に不具合を起こすことになるので注意だ。

その他のトランジションもパラメータを変えたりしてできるだろう。

0 件のコメント:

コメントを投稿