姑プログラマの技術日記

作ったものをえらそーに解説したら幸せになれるかな

PICOLで使ったアニメーションたち。iOSで使えるアニメーションあれこれ

f:id:naochi_2012:20180716214437p:plain

PICOLではアニメーションもゲームっぽく、いろいろ使っています。

ほぼ全部!アニメーション書き出してみます。

公式ページ

スプラッシュ

UIImageView#animationImages

前の記事でかいたようにUIImageViewのanimationImagesを使用してパタパタ漫画をアニメーションしています。

naochi-interrupt.hatenadiary.com

コードはこんな感じ。

var imageList:[UIImage] = []
for i in (1 ... 35) {
//   let image = UIImage(named: "splash-\(i)")
    let imagepath = Bundle.main.path(forResource: "splash\(i)", ofType: "png")
    let image = UIImage(contentsOfFile: imagepath!)
    imageList.append(image!)
}
imageView.animationImages = imageList

Home画面

CAKeyframeAnimation

上下の雲が、右から左に流れています。 あと、カメラを起動する、バーコード型の丸いボタンがじわーっとアニメーションしています。 丸いボタンは、スプラッシュと同様にImageViewのanimationImagesを使っています。

雲はCAKeyframeAnimationです。

let animation = CAKeyframeAnimation.init(keyPath: "position.x")
animation.isRemovedOnCompletion = true
animation.repeatCount = .infinity
animation.values = [621,-207]
animation.duration = 19.0
animation.fillMode = kCAFillModeBoth
self.headerImageView1.layer.add(animation, forKey: "position.x")

これが、いただいた画像を使ってアニメーションしてみて、どう調節しても継ぎ目のところでアニメーションがかくっとしてしまう。

もともと業務系アプリ作ってた私は、「いいじゃん。ちょびっとだし」とか思ったのですが、WEB屋さんとかゲーム屋さんはアーティストに近いのでどうしても許せないらしく、 なんとかならないの?と言われ続けてがんばったのですが、なかなかできないでいました。

そしたらある日の会議でイケメンの社長が以前WEB系の技術者だったそうで、アドバイスをいただき、そのとおりに実装したらできました。

Twitterの動画ではわかりにくいのでダウンロードして直接みてみてください。

まず、あがってきたデザインのヘッダを3枚並べて、 f:id:naochi_2012:20180716231034p:plain:w450

真ん中のヘッダを左右反転させてくっつけます。 コードで書いてもいいけど、1回のことなので実際に素材をつくりました。

f:id:naochi_2012:20180716231134p:plain:w450

(わかりやすいように真ん中は背景を黒くしました)

それを画面に使うとXibはこんな感じになります。 素材は(2484 x 150)ですが、Retinaなので画面サイズとしては1242 x 75)

f:id:naochi_2012:20180716231300p:plain:w600

CAAnimationはUIViewと座標系が違うので、この初期値の状態でX座標は真ん中の650という値になります。

f:id:naochi_2012:20180716234153p:plain:w600

そして、端っこまできっかりアニメーションしてしまうとアニメーションの最初の画面と最後の画面に違いが出てしまうためにかくついてしまうので、同じになるように、3つめのヘッダの位置の最初でアニメーションが切り替わるようにしたら!綺麗に動くようになりました。

f:id:naochi_2012:20180716235601p:plain:w600

バーコードカメラのバーコード検出アニメーション

UIView.animation

動画斜めにしなきゃよかった

UIView.animate(withDuration: 0.2,
    delay: 0.0,
    options: .repeat,
    animations: { () -> Void in
    borderView.alpha = 0
},  completion: { _ in
     borderView.alpha = 1
})

トースト出したり、ダイアログを出したりするところでも使っていますが割愛。UIViewのアニメーションです。 iOSでアプリ作った人なら1回は使ったことがあるはず。

囲みを斜めにしてないのはほんとすみません。

査定演出アニメーション

HTML

査定のカッコイイアニメーションはデザイン会社の ビジネスが進化するモバイル・コンテンツを : : caeruX [カエルエックス] さんが作ってくれました。私はWKWebviewを貼り付けただけです

func loadHtml(){
  webView = WKWebView.init(frame: self.animationView.frame)
  animationView.addSubview(webView)
  webView.addSubview(self.skipButton)
  let fileURL = URL(fileURLWithPath: Bundle.main.path(forResource:"assessment_ver2", ofType: "html")!)
  webView.loadFileURL(fileURL, allowingReadAccessTo: fileURL)
}

強いて言えば、私の古い端末(といってもiPhone6Plus)と、iPhoneXとかでは再生速度が違い、アニメーションの終了時間を端末ごとに切り替えて終わりを検出していることぐらいでしょうか。

チケット演出アニメーション

CAKeyframeAnimation + UIViewAnimation + SpliteKit

スロットがくるくるまわるのはCAKeyframeAnimationです。つなげてアニメーションしているのは上で書いた雲と同じ原理。 サーバーから受け取ったチケットのパーセンテージでアニメーションの終了座標を切り替えています。

コインがバラバラ落ちてくるのはSpliteKitを使いました。

qiita.com

雪をコインの画像に置き換えて、パーセンテージごとに数を増やしただけです。 こんなのが簡単に作れるなんて、すごいいい時代ですね。

残り時間アニメーションのあとのパルスのようなアニメーションはCAKeyframeAnimation 長い画像にマスクをかけてマスクをアニメーションしています。

あ、でも、要所要所でぽよんとか、ぴょんとか入れたのは割愛。