CoreAnimationアニメーションについて(前編)_html/css_WEB-ITnose
Core Animation アニメーションについて (パート 1)
1. UIView と CALayer
UIView と CALayer については誰もがよく知っているはずです。通常、UIView はビュー ツリーの構造によって構成されていると理解します。実際、UIView は別のレイヤー ツリー (つまり、CALayer ツリー) を管理および維持します。実際に画面上に表示され、アニメーション化されるのは CALayer オブジェクトです。
CALayer が View の内部実装の詳細である場合、なぜ Apple は UIView の別の層をカプセル化するのでしょうか? UIView と CALayer の違いは何ですか? UIView と CALayer の最大の違いは、UIView がユーザー操作を処理できることです (クリック イベントとして)、CALayer は特定のレスポンダー チェーンを認識しないため、イベントに応答できません。
応答イベントを UIView に抽象化する理由は、基礎となるコードのセット (つまりレイヤー) を Mac OS と共有するためです。 Mac OS には NSView クラスがあり、iOS とは異なる一部のユーザー イベント (キーボードやマウスなど) を処理するために使用されます。
ほとんどの単純なシーンでは、UIView が要件を満たすことができます。では、CALayer を勉強することに何の意味があるのでしょうか? CALayer は UIView のようなタッチ イベントを処理できないことを以前に学びました。 UIView には、公開されていない CALayer 関数もいくつかあります。
- シャドウ、丸い角、境界線
- 3D 変換 (UIView は 2D 変換のみ)
を取得できます。 view.layer を通して。
CALayer には、さまざまな効果を実現できる特別なサブクラスが多数あります。CALayer の特定のサブクラスを見てみましょう。 UIView の CALayer カテゴリを変更することも、別の CALayer インスタンスをそれに追加することもできます。この章では主にアニメーションに焦点を当てますので、今のところはあまり詳しく説明しません。 -
2. 暗黙的アニメーション
CALayer と UIView を理解すると、暗黙的アニメーションを見て、システムがどのような状況でアニメーションを自動的に生成するかを理解できます。どのような状況で自分でアニメーションを追加する必要がありますか。 -
暗黙的なアニメーションは実際にモノによって生成されます。 まずモノの概念を見てみましょう:
2.1 トランザクション -
トランザクションは実際には、一連の属性アニメーション コレクション、CALayer Changes の属性を含めるためにコア アニメーションによって使用されるメカニズムです。はすぐには発生しませんが、トランザクションがコミットされた後にアニメーションを使用して新しい値に移行します。
コア アニメーションは、実行ループ サイクルごとに新しいトランザクションを自動的に開始します。実行ループ サイクル内の プロパティ - への変更は集中して、0.25 秒間アニメーション化されます。
たとえば、ビューに新しいレイヤーを追加し、その backGroundColor を変更すると、色は即座には変化せず、0.25 秒 (アニメーションのデフォルトの継続時間) かけて徐々に変化することがわかります。
上記は、暗黙的なアニメーションが実行されるたびにデフォルトでトランザクションを開始し、CALayer のプライバシー アニメーションを完了する理由です。 UIView に関連付けられたレイヤーでは暗黙的なアニメーションが無効になっていることに注意してください。現時点では、アニメーションを自分たちで実装する必要があります://CALayer的隐式动画- (void)viewDidLoad { [super viewDidLoad]; //创建一个红色的layer _layer = [CALayer layer]; _layer.frame = self.view.bounds; _layer.backgroundColor = [UIColor redColor].CGColor; [self.view.layer addSublayer:_layer];}- (IBAction)changeColor:(id)sender { //修改layer的颜色为黄色 此时,颜色是由红色渐变到黄色的 _layer.backgroundColor = [UIColor yellowColor].CGColor;}
ログイン後にコピーCATransaction の +begin および +commit を通じて、新しいトランザクションをスタックにプッシュまたはポップできます (+beginAnimations:context: や +beginAnimations:context: などの UIView のいくつかのショートカット メソッドを使用することもできます)。 +animateWithDuration:アニメーション:、それらは本質的に同じです)、
//对View做动画,需要包含在事物中[CATransaction begin];self.view.backgroundColor = [UIColor yellowColor]; //改变view颜色[CATransaction setAnimationDuration:1]; //修改本次事务的动画时间[CATransaction setCompletionBlock:^{ //动画结束后回调 NSLog(@"animation completed");}];[CATransaction commit]; //提交动画
上記の部分から、CALayer のプロパティが変更されると、アニメーション期間を通じて徐々に更新されることがわかり、backColor の開始値と終了値を設定するだけです (赤から黄色)。それでは、アニメーションの中間状態の backColor を取得する方法はあるのでしょうか?
答えは「はい」です。modelLayer とpresentationLayer という 2 つの概念を理解する必要があります。
ほとんどの場合、作成する CALayer インスタンスは、modelLayer (データ レイヤーと呼ぶこともできます) を参照します。レイヤ オブジェクトに対して -modelLayer を呼び出すと、通常は -self が返されます。レイヤーのプロパティが変更されると、modelLayer のプロパティ値がすぐに変更されます (アニメーションが開始される前に)。上記の例では、modelLayer の値が赤から黄色にすぐに変更されます。
presentationLayer はプレゼンテーション レイヤーと呼ばれ、実際には modelLayer のコピーであり、常に画面に表示されるレイヤーの実際の値を表します。つまり、アニメーション処理中のレイヤーの中間状態の属性値は、presentationLayer を通じて取得できます。
presentationLayer は、レイヤーが初めて画面に表示されるときにのみ作成されることに注意してください。それ以前は、presentationLayer は nil を返します。要約すると
CAlayer は UIView の基礎となる実装であり、UIView は一部のユーザー タッチ イベントを処理できるのに対し、CALayer はより豊富な基礎となる機能を提供することがわかりました。
CALayer プロパティの変更では、runloop には暗黙的なアニメーション用のデフォルトのものがあり、UIView ではプライベート アニメーションが無効になっていますが、新しいアニメーション効果を送信することで、UIView に制御可能なプロパティの変更を与えることができます。
modelLayer のプロパティは変更直後に最終値に変更されるのに対し、presentationLayer は段階的な変更プロセスを受けることがわかりました。これは一部のインタラクティブ アニメーションに非常に役立ちます。
表示アニメーション、レンダリング ツリーなど、将来的に他のコア アニメーションのことについて話す可能性があります。
転載する場合は出典を明記してください、私のブログ: luoyibu

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











公式アカウントのWebページはキャッシュを更新します。これはシンプルでシンプルで、ポットを飲むのに十分な複雑です。あなたは公式のアカウントの記事を更新するために一生懸命働きましたが、ユーザーはまだ古いバージョンを開くことができますか?この記事では、この背後にあるtwist余曲折と、この問題を優雅に解決する方法を見てみましょう。それを読んだ後、さまざまなキャッシュの問題に簡単に対処でき、ユーザーが常に新鮮なコンテンツを体験できるようになります。最初に基本について話しましょう。それを率直に言うと、アクセス速度を向上させるために、ブラウザまたはサーバーはいくつかの静的リソース(写真、CSS、JSなど)やページコンテンツを保存します。次回アクセスするときは、もう一度ダウンロードすることなく、キャッシュから直接検索できます。自然に高速です。しかし、このことは両刃の剣でもあります。新しいバージョンはオンラインです、

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

この記事では、CSSを使用したWebページへの効率的なPNG境界追加を示しています。 CSSはJavaScriptやライブラリと比較して優れたパフォーマンスを提供し、微妙または顕著な効果のために境界幅、スタイル、色を調整する方法を詳述していると主張しています

この記事では、HTML< Datalist>について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

この記事では、html< meter>について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化< Meter> < Progress>およびex

この記事では、html5< time>について説明します。セマンティックデート/時刻表現の要素。 人間の読み取り可能なテキストとともに、マシンの読みやすさ(ISO 8601形式)のDateTime属性の重要性を強調し、Accessibilitを増やします

この記事では、HTML< Progress>について説明します。要素、その目的、スタイリング、および< meter>との違い要素。主な焦点は、< Progress>を使用することです。タスクの完了と< Meter> statiの場合
