UIKitとUIViewでビューでiOSアニメーションを実行する
著者について
saravananは、FlexipleおよびRemote ToolsのIosエンジニアおよびライターです。 彼は異なるドメイン間で複数の新興企業と協力してきました。よりaboutSaravanan↬
- 14分読み
- アニメミュレーションソフトウェアを、UI、モバイル
- 保存のためのオフラインで読む
- 株式Twitter LinkedIn
トピックの拡張性を考えると、私たちはかなり高いレベルで簡潔に各部分をカバーします。 目標は、彼/彼女のiOSアプリにアニメーションを追加するための選択肢のセットで読者を教育することです。
iOSに関連するトピックから始める前に、アニメーションの速度を簡単に見てみましょう。
60FPSでのアニメーション
一般的にビデオでは、各フレームは画像で表され、フレームレートはシーケンス内で反転された画像の数を決定します。 これは「1秒あたりのフレーム数」またはFPSと呼ばれます。FPSは、文字通り、画像/フレームの数が多いほど、より多くの詳細/情報がビデオに表示されることを意味し、秒以内に反転した静止画像の数を決定します。
これはアニメーションにも当てはまります。
FPSは、通常、アニメーションの品質を決定するために使用されます。 良いアニメーションは60fps以上で実行する必要があるという一般的な意見があります—60fps未満のものは少しオフに感じるでしょう。あなたは30FPSと60FPSの違いを見たいですか?
あなたは30FPSと60FPSの違いを見たいですか?
これをチェック!あなたは違いに気づきましたか?
人間の目は間違いなく低いfpsでジッタを感じることができます。 したがって、作成したアニメーションが60FPS以上で実行されるという基本ルールに準拠していることを確認することをお勧めします。 これにより、より現実的で生き生きとした気分になります。
FPSを見て、アニメーションを実行する方法を提供するさまざまなコアiOSフレームワークを掘り下げてみましょう。
コアフレームワーク
このセクションでは、ビューアニメーションの作成に使用できるiOS SDKのフレームワークに触れます。 私たちは、関連する例で彼らの機能セットを説明し、それらのそれぞれを簡単に散歩を行います。UIViewは、iOSアプリでコンテンツを表示するすべてのビューの基本クラスです。
UIKit、私たちにUIViewを与えるフレームワークは、すでに私たちに開発者が少ないことによってより多くを達成するために便利にするいくつかの基本的なア
apiUIView.animate
は、ブロックベースの構文でプロパティ値を指定することで、ビューのプロパティを簡単にアニメーション化できるため、ビューをアニメー
UIKitアニメーションでは、UIVIewのアニメーション可能なプロパティのみを変更することをお勧めします。
animation(withDuration:animations:completion)
このメソッドは、アニメーション化する必要があるビューのanimatableプロパティの変更のセットであるアニメーション期間を取ります。 Completionブロックは、ビューがアニメーションの実行を完了したときにコールバックを与えます。
移動、スケーリング、回転、フェージングなどのアニメーションのほぼすべての種類。 ビュー上では、この単一のAPIで達成することができます。
ここで、ボタンのサイズ変更をアニメーション化するか、特定のビューを画面にズームインすることを検討してください。 これは、UIView.animate
APIを使用して行う方法です:
let newButtonWidth: CGFloat = 60UIView.animate(withDuration: 2.0) { //1 self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) //2 self.button.center = self.view.center //3}
ここでは、ここでやっていることです:
- ブロック内で説明されているアニメーションの実行時間を表すduration値を渡して
UIView.animate
メソッ - アニメーションの最終状態を表すボタンの新しいフレームを設定します。
- ボタンを設定します
center
それは画面の中央に残るように、そのスーパービューの中心を持ちます。上記のアニメーションコードのブロックは、ボタンのフレームのアニメーションを現在のフレームから変更する必要があります。
Width = 0, Height = 0
最後のフレームに:
Width = 0, Height = 0
Width = Height = newButtonWidth
そして、ここではアニメーションがどのように見えるかです:
animateWithDuration
このメソッドは、animateメソッドの拡張のようなもので、ビューアニメーションに追加された物理ビヘイビアを使用して、以前のAPIで実行できるすべてのことを行うことができます。
たとえば、上で行ったアニメーションで春の減衰効果を実現したい場合、コードは次のようになります。
let newButtonWidth: CGFloat = 60UIView.animate(withDuration: 1.0, //1 delay: 0.0, //2 usingSpringWithDamping: 0.3, //3 initialSpringVelocity: 1, //4 options: UIView.AnimationOptions.curveEaseInOut, //5 animations: ({ //6 self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) self.button.center = self.view.center}), completion: nil)
使用するパラメータのセッ:
-
duration
コードブロックの実行時間を決定するアニメーションの期間を表します。 -
delay
アニメーションの開始前に必要な初期遅延を表します。 -
SpringWithDamping
ビューを動作させたい弾力のある効果の値を表します。 値は0から1の間である必要があります。 値が低いほど、ばねの振動が高くなります。 -
velocity
アニメーションを開始する速度を表します。 -
options
ビューアニメーションに適用するアニメーションカーブのタイプ。 - 最後に、アニメーション化する必要があるボタンのフレームを設定するコードブロック。 前回の動画と同じです。
そして、上記のアニメーション設定でアニメーションがどのように見えるかは次のとおりです:
UIViewPropertyAnimator
アニメーションをもう少し制御するには、UIViewPropertyAnimator
アニメーションを一時停止して再開する….. あなたは、カスタムタイミングを持っており、インタラクティブでinterruptibleであるためにあ これは、ユーザーアクションと対話可能なアニメーションを実行するときに非常に便利です。
古典的な”ロックを解除するスライド”ジェスチャーとプレイヤービューは、(音楽アプリで)アニメーションを却下/展開し、インタラクティブで中断可能なアニメーシ 指でビューの移動を開始し、それを離すと、ビューは元の位置に戻ります。 また、アニメーション中にビューをキャッチし、指でドラッグし続けることもできます。以下は、UIViewPropertyAnimator
を使用してアニメーションを実現する方法の簡単な例です。
let newButtonWidth: CGFloat = 60let animator = UIViewPropertyAnimator(duration:0.3, curve: .linear) { //1 self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) self.button.center = self.view.center}animator.startAnimation() //2
ここで私たちがやっていることです:
- 持続時間とアニメーションカーブを渡すことで
UIViewProperty
APIを呼び出します。 - 上記のUIViewとは異なります。animate APIの場合、アニメーションは自分で指定しない限り、つまりアニメーションプロセス/フローを完全に制御していない限り開始されません。
ここで、アニメーションをさらに制御したいとしましょう。 たとえば、アニメーション内のすべてのフレームをデザインして制御するとします。 そのための別のAPI、animateKeyframes
があります。 しかし、我々はそれを掘り下げる前に、すぐにアニメーションで、フレームが何であるかを見てみましょう。p>
とは何ですかframe
?
開始状態から最終状態へのビューのフレームの変更/遷移のコレクションは、animation
frame
と呼ばれます。
animateKeyframes
このAPIは、異なるタイミングと遷移を持つ複数のアニメーションを定義できるようにアニメーションを設計する方法を提供します。 これを投稿すると、APIはすべてのアニメーションをシームレスな体験に統合するだけです。
画面上のボタンをランダムに移動したいとしましょう。 これを行うためにkeyframe animation APIを使用する方法を見てみましょう。ここでは内訳です:
-
duration
アニメーションの期間を渡してAPIを呼び出します。 -
delay
アニメーションの初期遅延時間。 -
options
ビューアニメーションに適用するアニメーションカーブのタイプ。 -
animations
開発者/ユーザーによって設計されたすべてのキーフレームアニメーションを取るブロック。 -
addKeyFrame
APIを呼び出して、すべてのアニメーションを設計します。 私たちの場合、ボタンの各移動を定義しました。 必要な数のアニメーションをブロックに追加することができます。 -
relativeStartTime
アニメーションブロックのコレクション内のアニメーションの開始時刻を定義します。 -
relativeDuration
この特定のアニメーションの全体的な持続時間を定義します。 -
center
この場合、ボタンのcenterプロパティを変更して、ボタンを画面の周りに移動します。そして、これは最終的なアニメーションがどのように見えるかです:CoreAnimation
任意のUIKitベースのアニ したがって、コアアニメーションフレームワークは、任意のUIKitアニメーションのバッキングレイヤーまたはバックボーンとして機能します。 したがって、すべてのUIKit animation Apiは、簡単に消費可能または便利な方法でコアanimation Apiのカプセル化されたレイヤーに過ぎません。
UIKit animation Apiは、主にビューのアニメーション可能なプロパティに使用されるため、ビュー上で実行されたアニメーションをあまり制御できません。 したがって、このような場合、アニメーションのすべてのフレームを制御する場合は、基礎となるコアアニメーションApiを直接使用する方がよいでしょう。 また、UIViewアニメーションとコアアニメーションの両方を組み合わせて使用することもできます。UIViewとCore Animation Apiを使用してタイミング曲線を指定するとともに、同じボタン変更アニメーションを再作成する方法を見てみましょう。
アニメーションカーブを指定して制御できる
CATransaction
のタイミング関数を使用できます。CATransaction
のタイミング関数とUIViewアニメーションの組み合わせを使用したコーナー半径を持つボタンサイズ変更アニメーションの例を見てみましょう。let oldValue = button.frame.width/2let newButtonWidth: CGFloat = 60/* Do Animations */CATransaction.begin() //1CATransaction.setAnimationDuration(2.0) //2CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)) //3// View animations //4UIView.animate(withDuration: 1.0) { self.button.frame = CGRect(x: 0, y: 0, width: newButtonWidth, height: newButtonWidth) self.button.center = self.view.center}// Layer animationslet cornerAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.cornerRadius)) //5cornerAnimation.fromValue = oldValue //6cornerAnimation.toValue = newButtonWidth/2 //7button.layer.cornerRadius = newButtonWidth/2 //8button.layer.add(cornerAnimation, forKey: #keyPath(CALayer.cornerRadius)) //9CATransaction.commit() //10
:
-
begin
アニメーションコードブロックの開始を表します。 -
duration
全体のアニメーション期間。 -
curve
アニメーションに適用する必要があるタイミング曲線を表します。 -
UIView.animate
私たちの最初のアニメーションは、ボタンのフレームを変更します。 -
CABasicAnimation
ボタンのcornerRadius
CABasicAnimation
CAKeyframeAnimation
クラスを使用できます。 -
fromValue
アニメーションの開始値、つまりアニメーションを開始する必要があるボタンの最初のcornerRadius
値を表します。 -
toValue
アニメーションの最終値、つまりアニメーションを終了する必要がありますボタンの最終値を表します。cornerRadius
-
cornerRadius
ボタンのcornerRadius
プロパティをアニメーションの最終値で設定する必要があります。 -
addAnimation
アニメーションを実行する必要があるキーパスを表すことによって、アニメーションプロセス全体の構成を含むアニメーションオブ -
commit
アニメーションコードブロックの終わりを表し、アニメーションを開始します。
これは、最終的なアニメーションがどのように見えるかです:
このブログは、より高度なアニメーショUIKit DynamicsはUIKitの物理エンジンで、衝突、重力、プッシュ、スナップなどの物理動作をUIKitコントロールに追加できます。
UIKitDynamicAnimator
これは、任意のUIコントロールによってトリガーされるすべてのアニメーションを規制するUIKit Dynamicsフレームワークのadminクラスです。
UIKitDynamicBehavior
任意の物理動作をアニメーターに追加して、それに接続されたビューで実行できるようにします。
UIKitDynamicsのさまざまな種類の動作には、次のものがあります:li>
-
UICollisionBehavior
UIFieldBehavior
UIGravityBehavior
UIGravityBehavior
UICollisionBehavior
UICollisionBehavior
UIFieldBehavior
UIGravityBehavior
UIGravityBehavior
-
UIKitDynamicAnimator
アニメーションを実行するためのオーケストレータとして機能するUIKitDynamicAnimator
オブジェクトを作成しました。 また、ボタンのスーパービューを参照ビューとして渡しました。 -
UIGravityBehavior
UIGravityBehavior
オブジェクトを作成し、このビヘイビアが注入される配列要素にボタンを渡しました。 -
addBehavior
アニメーターに重力オブジェクトを追加しました。
以下のようにアニメーションを作成する必要があります:UICollisionBehavior
が画像になる場所です。var dynamicAnimator : UIDynamicAnimator!var gravityBehavior : UIGravityBehavior!var collisionBehavior : UICollisionBehavior!dynamicAnimator = UIDynamicAnimator(referenceView: self.view) //1gravityBehavior = UIGravityBehavior(items: ) //2dynamicAnimator.addBehavior(gravityBehavior) //3collisionBehavior = UICollisionBehavior(items: ) //4collisionBehavior.translatesReferenceBoundsIntoBoundary = true //5dynamicAnimator.addBehavior(collisionBehavior) //6
-
UICollisionBehavior
UICollisionBehavior
オブジェクトを作成し、ボタンに沿って渡され、ビヘイビアが要素に追加されます。 -
translatesReferenceBoundsIntoBoundary
このプロパティを有効にすると、アニメーターは参照ビューの境界を最後として、これは私たちの場合は画面の下部です。 -
addBehavior
ここでは、アニメーターに衝突動作を追加しました。
今、私たちのボタンは地面に当たって、以下に示すように静止する必要があります:それはかなり
ここでは、オブジェクトがよりリアルに感じるようにバウンス効果を追加してみましょう。 これを行うには、UIDynamicItemBehavior
クラスを使用します。var dynamicAnimator : UIDynamicAnimator!var gravityBehavior : UIGravityBehavior!var collisionBehavior : UICollisionBehavior!var bouncingBehavior : UIDynamicItemBehavior!dynamicAnimator = UIDynamicAnimator(referenceView: self.view) //1gravityBehavior = UIGravityBehavior(items: ) //2dynamicAnimator.addBehavior(gravityBehavior) //3collisionBehavior = UICollisionBehavior(items: ) //4collisionBehavior.translatesReferenceBoundsIntoBoundary = true //5dynamicAnimator.addBehavior(collisionBehavior) //6//Adding the bounce effectbouncingBehavior = UIDynamicItemBehavior(items: ) //7bouncingBehavior.elasticity = 0.75 //8dynamicAnimator.addBehavior(bouncingBehavior) //9
-
UIDynamicItemBehavior
UIDynamicItemBehavior
オブジェクトを作成し、ボタンに沿って渡して、動作が要素に追加されます。 -
elasticity
値は0-1の間でなければならず、弾力性、すなわちオブジェクトがヒットしたときに地面を跳ね返さなければならない回数を表 このプロパティを微調整することで、ボール、ボトル、ハードオブジェクトなどのさまざまな種類のオブジェクトを区別することができます。 -
addBehavior
ここでは、アニメーターに衝突動作を追加しました。ここで、ボタンが地面に当たったときに、以下に示すようにバウンスする必要があります。このレポは非常に役立ち、すべてのUIKitDynamicsの動作を示しています。 また、各動作で遊ぶためのソースコードも提供します。 それは、私の意見では、ビューでiOSアニメーションを実行する方法の広範なリストとして役立つはずです!
次のセクションでは、アニメーションのパフォーマンスを測定するのに役立つツールを簡単に見ていきます。 また、Xcodeビルドを最適化する方法を検討することをお勧めします。
パフォーマンスチューニング
このセクションでは、iOSアニメーションのパフォーマンスを測定し、調整する方法を見ていきます。 IOS開発者としては、アプリ全体のパフォーマンスを測定するために、メモリリークや割り当てなどのXcode計測器をすでに使用している可能性があります。 同様に、アニメーションのパフォーマンスを測定するために使用できる楽器があります。
Core Animation
インストゥルメント試してみてください
Core Animation
インストゥルメントと、あなたはあなたのアプリの画面が提供するFPSを見ることができるはずです。 これは、iOSアプリでレンダリングされたアニメーションのパフォーマンス/速度を測定するのに最適な方法です。描画
FPSは大幅に影のような効果を持つ画像のような重いコンテンツを表示するアプリで低下しています。 このような場合、画像を
UIImageView
のimageプロパティに直接割り当てる代わりに、Core Graphics Apiを使用してコンテキスト内で画像を個別に描画し これにより、メインスレッドではなく別のスレッドで画像解凍ロジックを非同期に実行することで、画像表示時間が過度に短縮されます。ラスタライズ
ラスタライズは、複雑なレイヤー情報をキャッシュするために使用されるプロセスで、レンダリングされるたびにこれらのビ ビューの再描画はFPSの削減の主な原因であるため、数回再利用されるビューにラスタライズを適用することをお勧めします。
ラップアップ
最後に、iOSアニメーションに役立つリソースのリストもまとめました。 IOSアニメーションで作業するときには、これは非常に便利なことがあります。 さらに、この一連のデザインツールは、アニメーションを掘り下げる前の(デザイン)ステップとして役立つこともあります。
ikitdynamicsのアーキテクチャは次のようになります。 項目1から5は、単一のビューに置き換えることができます。
ボタンに物理的な動作を適用しましょう。 実際のオブジェクトを扱う感覚を与えるように、ボタンに重力を適用する方法を見ていきます。p>
var dynamicAnimator : UIDynamicAnimator!var gravityBehavior : UIGravityBehavior!dynamicAnimator = UIDynamicAnimator(referenceView: self.view) //1gravityBehavior = UIGravityBehavior(items: ) //2dynamicAnimator.addBehavior(gravityBehavior) //3
ここでの内訳は次のとおりです: