34
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Swift] iOS10/Swift3でTwitter風のスプラッシュ画面のアニメーションを書き直してみる

Last updated at Posted at 2016-08-22

はじめに

iOS10/Swift3で従来のアニメーションの書き方が変わるようなので、
練習がてらに、Twitter風のスプラッシュ画面のアニメーションを書き直してみます。

ちなみに、開発環境は「XCode8.0 Beta5」です。

実践

1. プロトコルを作る

単純に変換すると、下記のようなイメージになります。
旧来のアニメーションへの変換は、XCode8がリファクタしてくれます。

TwitterLikeAnimation.swift
protocol TwitterLikeAnimation {}

extension TwitterLikeAnimation where Self: UIImageView {

    func startSplashAnimation() {

        UIView.animate(withDuration: 0.3,
                       delay: 1.0,
                       options: .curveEaseOut,
                       animations: { [weak self] () in
                        self?.transform = CGAffineTransform(scaleX: 0.75, y: 0.75)
            }, completion: nil)

        UIView.animate(withDuration: 0.2,
                       delay: 1.3,
                       options: .curveEaseOut,
                       animations: { [weak self]() in
                        self?.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
                        self?.alpha = 0
            }, completion: { [weak self] (Bool) in
                self?.removeFromSuperview()
            })
    }
}

これではつまらないので、iOS10から登場した
「UIViewPropertyAnimator」、「UIViewAnimating」、「UIViewImplicitlyAnimating」などを
利用して書いてみます。

TwitterLikeAnimation.swift
extension TwitterLikeAnimation where Self: UIImageView {

    func startSplashAnimation() {

        let timing = UICubicTimingParameters(animationCurve: .easeOut)
        let animator = UIViewPropertyAnimator(duration: 0.7, timingParameters: timing)

        animator.addAnimations{
            self.transform = CGAffineTransform(scaleX: 0.75, y: 0.75)
        }

        animator.addAnimations({
            self.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
            self.alpha = 0
            }, delayFactor: 0.8)

        animator.addCompletion { (position) in
            self.removeFromSuperview()
        }
        animator.startAnimation()
    }
}

2. UIImageViewに実装する

TwitterLikeImageView.swift
class TwitterLikeImageView: UIImageView, TwitterLikeAnimation {}

3. StoryBoardに配置する

Storyboardで設置したUIImageViewのカスタムクラスをTwitterLikeImageViewに変更する

スクリーンショット 2016-08-23 0.02.54.png

4. UIViewControllerから読み出す

ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var baseView: UIView!
    @IBOutlet weak var logoImageView: TwitterLikeImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        baseView.backgroundColor = UIColor.white
    }

    override func viewDidAppear(_ animated: Bool) {
        logoImageView.startSplashAnimation()
    }
}

まとめ

慣れていないためか、旧来のアニメーションのほうが使いやすい気がしました。
動的なアニメーションの追加や、一時停止等もできるようなので、挑戦してみたいです。

誤り等ございましたら、ご指摘頂けると幸いです。

参考

http://qiita.com/KEN-chan/items/f80c17c583ac44d67a58
http://qiita.com/osamu1203/items/a7c78666b18eb499c94b

34
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?