Altconf marin cover

Power Up Your Animations! 💫

シンプルなアニメヌションを䜜る方法は、皆さん誰もが知っおいたす。ですが、ずおも信じられないほど矎しいアニメヌションを䜜りたいず思ったらどうしたすか raywenderlich.comのチヌムメンバヌであるMarin Todorovが、レむダヌやアニメヌションラむブラリに぀いお詳しくなればどんなこずを達成できるのかを明らかにしおくれたす。このプレれンテヌションに魔法は含たれたせん——ただパワフルで、印象的なアニメヌションだけがありたす


この講挔のサンプルコヌドは GitHubにありたす。

iOS 9の新機胜 (0:35)

iOS 9では、アニメヌションのための新機胜はそこたで倚くありたせん。

新しい点のひず぀ずしおは、UIViewAnimationOptionsがOptionSetTypeになりたした。今たでは、ビットマスクによっお組み合わせるこずのできる単なる倀でしたが、今回からは、すべお集合の芁玠ずなりたした。そのため、集合の圢で組み合わせるこずができたす。iOS 8では、ビュヌアニメヌションに䜕もオプションを䞎えたくない堎合、nilを指定する必芁がありたしたが、空集合を宣蚀するための角括匧を指定するだけでよいのです。

iOS 9では、角括匧ずずもにRepeatずCurveLinearずいったオプションを組み合わせるこずもできたす。もしひず぀のオプションのみで良い堎合は、ちょっず奇劙に芋えたすが、角括匧は芁りたせん。そのオプションが集合の正しい芁玠であれば、自動的に刀断され正垞に凊理されたす。

// iOS 8
UIView.animateWithDuration(1.0, delay: 0.0, options: nil, animations {
  v.center.y += 100.0
}, completion: nil)

// iOS 9
UIView.animateWithDuration(1.0, delay: 0.0, options: [], animations {
  v.center.y += 100.0
}, completion: nil)

もうひず぀の新しい点は、スプリングアニメヌションにありたす。

iOS 9では䜎レベルのAPIずしおCASpringAnimationをレむダヌに察しお甚いるこずができたす。今たでもこのクラスはiOS内にありたしたが、プラむベヌトクラスでした。実は、内郚で今たでのあなたのスプリングアニメヌションを担っおいたのはこのクラスだったのです。今幎Appleは我々にこれを開攟しおくれたため、オヌプン゜ヌスのスプリングアニメヌション実装を䜿うこずを止められたす。

もし今たでにスプリングアニメヌションをあたり䜿ったこずがない堎合、スプリングアニメヌションには質量(mass)、スプリングの硬さ(stiffness)、粘性(damping)を指定する必芁があるこずを知っおおいおください。䞀床これらの倀を指定した埌は、settlingDurationを取埗するこずができたす。これは読み取り専甚のプロパティで、そのアニメヌションが䜕秒で萜ち着くかを䌝えおくれたす。

// iOS 8
UIView.animateWithDuration(1.0, delay: 0.0,
    usingSpringWithDamping: 0.25, initialSpringVelocity: 0.12,
    options: [], animations: {
        v.center.x += 100.0
    }, completion: nil)

// iOS 9
class CASpringAnimation : CABasicAnimation {

 var mass: CGFloat
 var stiffness: CGFloat
 var damping: CGFloat

 var initialVelocity: CGFloat

 var settlingDuration: CFTimeInterval { get }
}

むントロダクション (4:46)

iOS 7で、私たちはアプリを新しいビゞュアルスタむルに移行したした。しかし、もしアプリがそれず認識されるようなグラフィカルスタむルでない堎合、それがむンディヌズの開発者によるものか、Appleによるものかを刀断する方法はありたせん。カラフルなテキストでアプリの色合いを倉えるこずはできたすが、本圓に倧きな違いを芋せたいのであれば、アニメヌションを加える必芁がありたす。

蚘事の曎新情報を受け取る

アニメヌションは、あなたのブランドおよびスタむルに぀いおの党おを䌝える際に、倧きな違いを生み出したす。これは良いこずですが——みなさん誰もが、いく぀かのアニメヌションを䜜る方法を知っおいたす。

ビュヌであれば、赀い四角圢を数ポむント右に動かすだけのようなシンプルなアニメヌションなど。もしあなたがSwiftを䜿っおいない堎合、そろそろ䜿うべきです。問題は、私が思うに、倚くの人が図圢が画面を暪切る、あるいはフェヌドむン・アりトするようなアニメヌションのみで終わりにしおしたうこずです。

もしあなたがより耇雑なこずをやりたい、ず思ったずきはStack Overflowにアクセスしお、具䜓的な回答に蟿り着くこずができるでしょう。これで、アニメヌションを䜜成するこずはできたす。しかし、それ以倖のこずをしたいずきには、Stack Overflowにたた別の質問を投皿する必芁がありたす。

実隓 🔥 (7:20)

アニメヌションぞのアプロヌチの最も良い方法は実隓するこずだず私は考えたす。

Core Animationは、特にUIKitでも、あなたのアプリの䞭でアニメヌションを䜜るのに䜿うこずができるずおも倚くの機胜を提瀺しおいたす。私はこれを非垞に効果的で玠晎らしいものだず考えおいたす。

今から、あなたにできる3぀のこずをご玹介したす。たず、いろいろなプロパティを実隓しおみたしょう。次に、新しいレむダヌを぀かっおみたしょう。最埌に、アニメヌションの期間を蚭定する以䞊の、枠にずらわれない考えで奇抜なこずをやっおみたしょう。この講挔では、私はEasyAnimationを䜿いたす。これはUIKitに2、3の機胜を远加するだけのラむブラリです。

デモ (8:23)

このデモ内では、Easy Animationがどんなこずができるのか2、3の䟋を玹介したいず思いたす。

ここにプラスボタンが画面䞊に眮かれおいるアプリがありたす。おそらく、これが抌されたずきには䜕かしらのアニメヌションが远加されるのでしょう。

ナヌザヌむンタフェヌスにおけるアニメヌションは通垞、ナヌザヌに今䜕かが起こっおいるずいうフィヌドバックを提瀺するために䜿われるものです。ですので私は、ここではボタンが抌された時にボタンをバりンスさせたいず思いたす。

それにはEasy AnimationのUIView.animateAndChainWithDurationを甚いたす。Easy Animationは、すでにUIKitにお提䟛されおいるものにぎったりな2, 3のメ゜ッドを远加するものです。このメ゜ッドは順序だったアニメヌションの䜜成を非垞に簡単にしおくれるため、様々な実隓を玠早く行うこずができたす。

delayを0.25にし、CurveEaseOutを䜿っおみたす。これはアニメヌションの効果の効き具合を、その終わりに向かっお遅くするものです。青い正方圢が今回のボタンです。ここでは単玔に、少し瞮小するよう倉圢をかけたす。Easy Animationのおかげで、最初のアニメヌションが終わった埌に、簡単に次のアニメヌションを連鎖しお開始するこずができたす。倉圢のあずは、少し回転・拡倧するようにスプリングアニメヌションを蚭定したす。

UIView.animateAndChainWithDuration(0.25, delay: 0.0, options: .CurveEaseOut, animations: {
            self.blueSquare.transform = CGAffineTransformMakeScale(0.8, 0.8)
        }, completion: nil).animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.33, initialSpringVelocity: 0.0, options: nil, animations: {

            self.blueSquare.transform = CGAffineTransformConcat(
                CGAffineTransformMakeScale(1.33, 1.33),
                CGAffineTransformMakeRotation(CGFloat(-M_PI_2))
            )
        }, completion: nil)

1. プロパティの実隓 (11:47)

私は先ほど、たずプロパティの実隓をしよう、ず蚀いたしたね。CALayerには、いろいろ実隓できる倚くのプロパティがありたす。そのプロパティに぀いおは党おドキュメントの䞭で説明されおいたす。

このプロパティの䞭には、アニメヌションを䜜る際に䜿えるこずがわかりづらいcornerRadiusのようなプロパティもありたす。ですがそういったプロパティもなかなか栌奜いいこずをしおくれたす。

デモ: CALayer (12:18)

では、cornerRadiusをアニメヌションさせ、アニメヌションチェヌンのふた぀目で50.0にセットしたす。

最初は0.0にしおおきたす。毎回アニメヌションが走るたび、たた正方圢に戻りたす。れリヌのかたたりのような動きは、これらのプロパティの組み合わせによっお䜜るこずができたす。

説明ずしおは点ありたす。スプリングアニメヌションを䜿っおいるこずず、角を䞞くするのず回転させるのを同時に行っおいるこずです。このようにしお、本圓に栌奜いいアニメヌションを䜜るこずができたした。さらに境界線もアニメヌションさせるこずができたす。ここでは境界線を぀けおから、単に取り陀くこずで、゚ッチングのような効果を぀けるようにしたした。

UIView.animateAndChainWithDuration(0.25, delay: 0.0, options: .CurveEaseOut, animations: {
            self.blueSquare.transform = CGAffineTransformMakeScale(0.8, 0.8)
            self.blueSquare.layer.cornerRadius = 0.0
            self.blueSquare.layer.borderWidth = 5.0

        }, completion: nil).animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.33, initialSpringVelocity: 0.0, options: nil, animations: {

            self.blueSquare.transform = CGAffineTransformConcat(
                CGAffineTransformMakeScale(1.33, 1.33),
                CGAffineTransformMakeRotation(CGFloat(-M_PI_2))
            )
            self.blueSquare.layer.cornerRadius = 50.0
            self.blueSquare.layer.borderWidth = 0.0

        }, completion: nil)

デモ: CAShapeLayer (14:49)

さらに奇抜なレむダヌのプロパティを芋おみたしょう。

CAShapeLayerでは、lineDashPatternずlineDashPhaseによりmarching antsを䜜るこずができたす。

䟋えば写真内に遞択範囲を䜜ったずするず、その遞択範囲は砎線の長方圢で衚されたすね。そこで、この䟋では切り取りツヌルを䜜っおいるずしたしょう。遞択範囲はCAShapeLayerで䜜り、lineDashPatternを蚭定するこずができたす。lineDashPatternは砎線のうち䜕ピクセルを描いお䜕ピクセル間隔が空くかを指定するこずができたす。

さらに、lineDashPhaseを甚いるこずによっおアニメヌションさせるこずができたす。これはCore Annimationにそのパタヌンをい぀描画し始めるかを䌝えるものです。

override func viewWillAppear(animated: Bool) {
    ...

    view.layer.addSublayer(selection)

    //configure the dash pattern
    selection.lineDashPattern = [5, 3]
}

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    ...

    //let the ants march!
    UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveLinear | .Repeat, animations: {
        self.selection.lineDashPhase = 8.0
        }, completion: nil)

}

2. レむダヌの実隓 (17:43)

2぀目にするこずは、レむダヌを䜿っお実隓するこずです。単なるCALayerやCAShapeLayer以倖にも、レむダヌにはいく぀もの皮類がありたす。そしお、それらの倚くはアニメヌションできるような特別なプロパティを有しおいたす。私のお気に入りはCAReplicatorLayerです。

デモ: CAReplicatorLayer (17:59)

CAReplicatorLayer は基本的にはコンテナずなるレむダヌで、䜕かレむダヌを入れた堎合、それのコピヌを぀くっおくれたす。画面にCAReplicatorLayerを远加し、そこにレむダヌを入れれば、そのレむダヌは画面䞊に衚瀺されたす。この䟋では、耇補される、単なるドットを衚すレむダヌをひず぀䜜り、スケヌルするようにアニメヌションさせたす。

//add a replicator layer
let r = CAReplicatorLayer()
r.frame = view.bounds
view.layer.addSublayer(r)

//make a simple dot layer
let dot = CALayer()
dot.bounds = CGRect(x: 0.0, y: 0.0, width: 5.0, height: 5.0)
dot.position = CGPoint(x: 18.0, y: view.center.y)
dot.backgroundColor = UIColor.greenColor().CGColor
dot.borderColor = UIColor(white: 1.0, alpha: 1.0).CGColor
dot.borderWidth = 1.0
dot.cornerRadius = 2.0

r.addSublayer(dot)

UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseOut | .Repeat | .Autoreverse, animations: {
    dot.transform = CATransform3DMakeScale(1.4, 10, 1.0)
    }, completion: nil)

この動いおいるドットを芋た時、わたしはSiriずその正匊波を連想したした。ですので、CAReplicatorLayerを䜿っおもっずそう芋えるようにしおみたしょう。

レむダヌをReplicatorレむダヌに远加する際は、そのレむダヌをどうするかをReplicatorレむダヌに䌝える必芁がありたす。

たずは、ドットのコピヌを35個ほしいず思いたす。それで、それぞれのコピヌの間には時間の遅延を䞎えおみたしょう。オリゞナルのレむダヌに倉曎を加えるず、Replicatorレむダヌが党おのコピヌに察しお同じこずをしおくれたす。

䟋えば、アニメヌションのタむミングがコピヌからコピヌに、0.1秒の遅延で䌝わっおいくようにしおみたす。぀たり、あるコピヌのアニメヌションはひず぀前のコピヌから0.1秒遅れお始たるこずになりたす。

最埌に、instantTransformプロパティによっお各コピヌの䜍眮を蚭定するこずができたす。ここでは20ポむント右に移動させるこずにしたす。これにより、コピヌは、ひず぀前のコピヌの20ポむント右に配眮されるこずになりたす。さらに、各コピヌの䞭間の䜍眮をアニメヌションさせるこずができたす。

r.instanceCount = 35
r.instanceDelay = 0.1
r.instanceTransform = CATransform3DMakeTranslation(20.0, 0.0, 0.0)

UIView.animateWithDuration(1.25, delay: 0.0, options: .Repeat | .Autoreverse, animations: {
    r.instanceTransform = CATransform3DMakeTranslation(10.0, 0.0, 0.0)
}, completion: nil)

デモ: テヌブルビュヌのアニメヌション (21:55)

私は友達ずずもにSkyscanner appを芋おいたした。これはフラむトの怜玢結果を衚瀺しおくれるものです。知りたい到着地を指定すれば、そのフラむトの時刻衚を芋るこずができたす。その䞭からひず぀をクリックするず、新しい画面がプッシュされお、前の画面ず同じフラむトの結果が画面の䞀番䞊に、その䞋に詳现が衚瀺されたす。

このように耇数のビュヌコントロヌラがある堎合、画面䞊でそれらの遷移をアニメヌションさせるべきです。今の堎合だず最初のビュヌが巊に行き、他のビュヌが右からスラむドしおきたしたね。私はさらに栌奜のいいアニメヌションずしお、遞択された行のスナップショットを取り、遷移にのみ䜿うビュヌを䜜り、それをスクリヌンに加えるようにしたした。Skyscannerは同じこずをやっおいたす。

フラむトを遞択するず、そのフラむトを瀺す行はスクリヌンに残り、画面の䞀番䞊に移動し、その埌に詳现が背埌にスラむドしおきたす。たず、テヌブルビュヌからセルを取埗し、snapshotViewAfterScreenUpdatesを呌ぶこずで、セルのコピヌを新しくUIViewずしお埗るこずができたす。そうしたら、それをトランゞションコンテナビュヌに远加し、フェヌドアりト、その埌削陀するようにしたす。

3. 䜕でも実隓しよう (24:28)

最埌の䟋は、䜕でも実隓しよう、ずいうこずを䌝えるこずにありたす。䜕でもずは、聞いたこずもないようなブログに目を通す、あるいはAppleのドキュメントを芋よう、ずいう意味です。私が芋぀けたのは、本圓に深くに埋たっおいたもので、実際にiPhone䞊で動䜜させるのに少し時間がかかりたした。

これは、写真を含む投皿のリストがあり、タップされた時にカスタムビュヌコントロヌラトランゞションを䜿い、奇抜な方法で写真の衚瀺・非衚瀺を行う䟋です。

Core Imageは画像の遷移をCore Image transition filtersを䜿っお行う方法を提䟛しおいたす。

マスクを䞎えるこずで、ひず぀の画像から他の画像ぞのトランゞションをさせるこずができたす。ですので、マスクを甚いるどんなカスタムフィルタでも䜜るこずができたす。マスクはグレヌの画像であれば䜕でも構いたせん。トランゞションではたず黒い郚分が衚瀺され、次に灰色の郚分、そしお最埌に癜い郚分が衚瀺されたす。

党おのフィルタヌ適甚枈みのフレヌムを䜜るために、垞にフィルタヌをかける必芁がありたす。私が䜜ったマスクはこちらにありたす。

ありがずうございたした。

翻蚳岩谷 明 Akira Iwaya 校正・校閲本村矎絵 Mie Hommura

About the content

This talk was delivered live in June 2015 at AltConf. The video was recorded, produced, and transcribed by Realm, and is published here with the permission of the conference organizers.

Marin Todorov

Marin TodorovはiOSコンサルタントで著者でもありたす。代衚的な著曞に「iOS Animations by Tutorials」があり、珟圚は「iOS Animations by Emails」ずいうニュヌスレタヌを配信しおいたす。20幎前にApple ][の゜フトりェア開発を始めおから珟圚に至りたす。この間、Monster TechnologiesやNative Instrumentsずいった、すばらしい䌁業で働き、぀の囜を枡り歩きたした。raywenderlich.comの蚭立メンバヌの䞀人であり、コヌドだけでなく、ブログや本を曞いたり、講挔や教育にも関わっおいたす。ずきどき、自分の曞いたコヌドをOSSずしお公開もしおいたす。珟圚はサンティ゚ゎに䜏んでいたす。

4 design patterns for a RESTless mobile integration »

close