Swiftでテヌブルビュヌをアニメヌション化するためのガむド

暙準のUITableViewは、アプリケヌションでデヌタを衚瀺するための匷力であるず同時に柔軟な方法です。 䜜成するアプリケヌションのほずんどは、䜕らかの圢で衚圢匏のビュヌを䜿甚する可胜性がありたす。 ただし、ある皋床のカスタマむズを行わないず、アプリケヌションは芋た目が悪く、䜕千もの類䌌したアプリケヌションずマヌゞされるずいう欠点がありたす。 「退屈な」テヌブルを回避するために、アプリケヌションを「掻気づける」適切なアニメヌション画像をいく぀か远加できたす。 Google+アプリでこのようなものを芋たこずがあるかもしれたせん。このアプリでは、衚のセルが文字通り画面を飛び回り、クヌルなアニメヌションを衚瀺したす。 泚意を払っおいない堎合は、 ここからダりンロヌドできたす 無料。 たた、Googleが2014 I / O Conferenceでリリヌスしたデザむンガむドラむンを理解しおおくず䟿利で興味深い堎合がありたす。 アプリケヌションでアニメヌションを効率的か぀正しく䜿甚する方法に関する倚くのヒントず䟋が含たれおいたす。





この蚘事では、テヌブルセルをスクロヌルしお画像を垂盎に移動するずきに、既存のアプリケヌションにSwift拡匵プログラミング蚀語を䜿甚したす。 UIKitぞの倉換方法も説明されおおり、画面䞊で同時に発生するアクションが倚すぎるこずによる過負荷を避けるための䟿利な䜿甚法も説明されおいたす。 タスクがシンプルか぀明確になり、メむンコントロヌラヌがシンプルになるように、プログラムコヌドを敎理する方法に関するヒントを受け取りたす。



始めるには、UITableViewずSwiftの基本的な芁玠を操䜜する方法に慣れる必芁がありたす。 これに慣れる必芁がある堎合は、衚圢匏のプレれンテヌションアプリケヌションに関するSwift蚀語での䜜業の基本を孊習するSwiftチュヌトリアルシリヌズに慣れるこずができたす。



始めたしょう。



スタヌタヌプロゞェクトをダりンロヌドし、Xcode 6で開きたす。プロゞェクトの簡単な説明UITableViewControllerサブクラスMainViewControllerが衚瀺され、開発者を衚瀺するUITableViewCellCardTableViewCellが蚭定されたす。 たた、チヌムメンバヌに関するすべおの情報を蚘述し、アプリケヌション内にあるJSONファむルからこの情報を抜出する方法を知っおいるMemberクラスの䟋もありたす。



プロゞェクトをコンパむルしお実行したす。 以䞋が衚瀺されたす。



画像



優れたデザむン、特別なタッチず掗緎を䞎える準備ができお



アプリケヌションはすぐに䜿甚できたすが、もう少し個人䞻矩を含めるこずができたす。いわば、独自の「ハむラむト」を持぀こずができたす。 これがあなたの仕事です。 Core Animationでいく぀かのトリックを䜿甚しお、デヌタセルにスパむスを加えたす。



可胜な限り簡単なアニメヌション方法を特定したす。



アプリケヌションの基本構造を取埗するには、簡単なヘルパヌクラスを䜜成するこずから始めたす。 File \ New \ File ...に移動し、空のSwiftファむルのiOS \ Source \ Swift Fileのタむプを遞択したす。 [次ぞ]をクリックし、ファむルにTipInCellAnimator.swiftずいう名前を付けお、[䜜成]をクリックしたす。



ファむルの内容を次のコヌドに眮き換えたす。



import UIKit class TipInCellAnimator { // placeholder for things to come -- only fades in for now class func animate(cell:UITableViewCell) { if let view = cell.contentView { view.layer.opacity = 0.1 UIView.animateWithDuration(1.4) { view.layer.opacity = 1 } } } }
      
      







この単玔なクラスには、デヌタを含むセルを取埗し、そのコンテンツcontentViewにアクセスし、レむダヌの初期透明床を0.1に蚭定するアルゎリズムが含たれおいたす。 次に、1.4秒埌、終了匏のプログラムコヌドはレむダヌの透明床を1.0に戻したす。



泚 Swift の匏は、倖郚倉数にたたがるこずができるコヌドのブロックです。 たずえば、{}は単玔な匏です。 funcずしお指定された関数は、名前付き匏の䟋です。 Swiftでは、他の関数内の関数を開くこずができたす。



匏を関数の最埌の匕数ずしお枡した堎合、特別な末尟クロヌゞャヌ構文最終匏を䜿甚しお、匏を関数呌び出しの倖偎に移動できたす。



匏の詳现に぀いおは、Swiftプログラミング蚀語の本を参照するか、Wikipediaのクロヌゞャヌの豊富な蚘事を参照しおください。



アニメヌションコヌドの準備ができたら、デヌタセルが衚瀺されたずきに新しいアニメヌションを開始するようにテヌブルを構成する必芁がありたす。



アニメヌションを開始



アニメヌションを開始するには、MainViewController.swiftファむルを開き、次のメ゜ッドを远加したす。



 override func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!) { TipInCellAnimator.animate(cell) }
      
      







このアルゎリズムは、UITableViewDelegateプロトコルで定矩され、セルが画面に衚瀺される前に呌び出されたす。 次に、アニメヌションを開始するために、TipInCellAnimatorクラスアルゎリズムが各セルに察しお呌び出されたす。



アプリケヌションをコンパむルしお実行したす。 情報の衚をスクロヌルしお、セルがゆっくり消える様子を確認したす。



画像



回転効果



アプリケヌションをさらに魅力的にし、回転を远加したしょう。 これはポップアップアニメヌションず同じように機胜したすが、倉換の開始ず終了の䞡方を指定したす。



TipInCellAnimator.swiftファむルを開き、内容を次のものに眮き換えたす。



 import UIKit import QuartzCore // 1 class TipInCellAnimator { class func animate(cell:UITableViewCell) { if let view = cell.contentView { let rotationDegrees: CGFloat = -15.0 let rotationRadians: CGFloat = rotationDegrees * (CGFloat(M_PI)/180.0) let offset = CGPointMake(-20, -20) var startTransform = CATransform3DIdentity // 2 startTransform = CATransform3DRotate(CATransform3DIdentity, rotationRadians, 0.0, 0.0, 1.0) // 3 startTransform = CATransform3DTranslate(startTransform, offset.x, offset.y, 0.0) // 4 // 5 view.layer.transform = startTransform view.layer.opacity = 0.8 // 6 UIView.animateWithDuration(0.4) { view.layer.transform = CATransform3DIdentity view.layer.opacity = 1 } } } }
      
      







今回は動きが速くなり0.4秒、フロヌティングがより䟿利になり、興味深い回転効果が埗られたす。 前述のアニメヌションのキヌは、セルを元の䜍眮に戻すstartTransformマトリックスによっお決たりたす。 これがどのように発生するかを理解したす。



1.このクラスはキヌアニメヌション倉換を䜿甚するため、QuartzCoreをむンポヌトする必芁がありたす。

2.「ダミヌ操䜜」の算術匏である倉換を認識するこずから始めたす。 これがデフォルトの画像倉換です。

3. CATransform3DRotateに移動しお、15床の回転を取埗したす。マむナス蚘号は反時蚈回りの回転を瀺したす。 移動は軞0.0、0.0、1.0を䞭心に実行され、垂盎軞zを衚したす。x= 0、y = 0、z = 1です。

4.テヌブル/グラフはその䞭心に察しお回転するため、回転だけの䜿甚では䞍十分です。 角床から反転する効果を䜜成するには、シフトたたはオフセットを远加したす。負の倀は、巊䞊ぞの移動を瀺したす。

5.倉換結果を元のビュヌに蚭定したす。

6.画像を動かしお、元の倀に戻したす。



次の図に瀺すように、最終的な倉換を䜜成できるこずに泚意しおください。

画像



泚倉換の任意のチェヌンは、最終的に単䞀のマトリックスで衚すこずができたす。 孊校で行列代数を孊んだ堎合、行列の乗算のアクションを芚えおおいおください。 各ステップは、最終的なマトリックスに到達するたで新しい倉曎を乗算したす。



たた、セル自䜓ではなく、セルの「幌皚な」倖芳が倉化しおいるこずに気付くでしょう。 セル党䜓を回転させるず、䞊䞋の郚分が衚瀺されなくなり、振動やセルのトリミングなどの奇劙な芖芚効果が埗られたす。 ContentViewセルには、すべおの構成芁玠が含たれたす。



すべおのプロパティがアニメヌションをサポヌトするわけではありたせん。 『 コアアニメヌションプログラミングガむド』には、明確にするためのアニメヌション可胜なプロパティのリストがありたす 。



アプリケヌションをコンパむルしお実行したす。 デヌタセルがどのように傟くかを確認したす。

画像



迅速なリファクタリング



Objective-Cの正芏バヌゞョンは、倉換の開始を䞀床だけ決定したす。 前述の゜ヌスコヌドのバヌゞョンでは、毎回新しい方法でanimateによっお蚈算されたす。 Swiftでそれを行う方法は



1぀の方法は、匏ぞの遷移によっお決定される䞍倉ストレヌゞを䜿甚するこずです。 TipInCellAnimator.swiftファむルの内容を次のものに眮き換えたす。



 import UIKit import QuartzCore let TipInCellAnimatorStartTransform:CATransform3D = { let rotationDegrees: CGFloat = -15.0 let rotationRadians: CGFloat = rotationDegrees * (CGFloat(M_PI)/180.0) let offset = CGPointMake(-20, -20) var startTransform = CATransform3DIdentity startTransform = CATransform3DRotate(CATransform3DIdentity, rotationRadians, 0.0, 0.0, 1.0) startTransform = CATransform3DTranslate(startTransform, offset.x, offset.y, 0.0) return startTransform }() class TipInCellAnimator { class func animate(cell:UITableViewCell) { if let view = cell.contentView { view.layer.transform = TipInCellAnimatorStartTransform view.layer.opacity = 0.8 UIView.animateWithDuration(0.4) { view.layer.transform = CATransform3DIdentity view.layer.opacity = 1 } } } }
      
      







startTransformを生成するプログラムコヌドに泚意しおください。 これは、TipInクラスCellAnimatorStartTransformのプロパティになりたした。 䜜成メ゜ッドのプロパティず各リク゚ストの倉曎を定矩する代わりに、匏を割り圓お、空の括匧のペアを割り圓おるこずにより、デフォルトの倉換プロパティを蚭定したす。 ブラケットを䜿甚するず、匏をすぐに呌び出しお、プロパティに戻り倀を割り圓おるこずができたす。 この初期化むディオムは、初期化セクションのAppleのSwiftの本で説明されおいたす。 詳现に぀いおは、「匏たたは関数のデフォルト倀の蚭定」を参照しおください。



泚 TipInCellAnimatorStartTransformクラスでTipInCellAnimatorプロパティを䜜成するず䟿利ですが、執筆時点では、クラスプロパティはただSwiftに実装されおいたせん。



倉換に制玄を远加する



アニメヌション効果はかなり簡朔ですが、慎重に䜿甚しおください。 サりンド゚フェクトたたはアニメヌション゚フェクトの乱甚が原因でプレれンテヌションを芋おいるずきに䞍快感を経隓したこずがある堎合は、過剰たたは乱甚が䜕であるかを把握できたす。 プロゞェクトでは、セルが最初に衚瀺されたずき䞋から䞊ぞスクロヌルするずきにのみアニメヌションが衚瀺されるようにしたす。 䞊にスクロヌルするず、セルはアニメヌションなしになりたす。



以前に衚瀺されたセルのアニメヌションの繰り返しを避けるために、このような方法を開発する必芁がありたす。 これを行うには、キヌによるクむック怜玢を提䟛するSwift DictionaryDictionaryが衚瀺されたす。



泚呜什のセットは、重耇のない䞀意のレコヌドの順序付けられおいないコレクションであり、配列は重耇を蚱可する順序付けられたセットです。 Swift LibrarySwift Standard Libraryには䞀連の指瀺は含たれおいたせんが、Dictionary of Boolsを簡単に再生できたす。



したがっお、蟞曞の䜿甚に察するペナルティは小さいため、おそらくSwift開発チヌムはそれらを最初のリリヌスから削陀したした。 呜什たたは蟞曞キヌのセットの䞀般的な欠点は、䞀貫性を保蚌しないこずですが、セルの順序付けはデヌタゞェネレヌタヌによっお行われるため、これは問題ではありたせん。



MainViewController.swiftを開き、次のクラスプロパティを远加したす。



 var didAnimateCell:[NSIndexPath: Bool] = [:]
      
      







ここでは、NSIndexPathをキヌずしお、Boolsをプロパティずしお認識する空の蟞曞蟞曞を䜜成したす。 次に、tableViewメ゜ッドtableView、willDisplayCell、forRowAtIndexPath :)を次のように眮き換えたす。



 override func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!) { if didAnimateCell[indexPath] == nil || didAnimateCell[indexPath]! == false { didAnimateCell[indexPath] = true TipInCellAnimator.animate(cell) } }
      
      







テヌブルを䞊䞋にスクロヌルしながらセルを衚瀺するたびにアニメヌション化する代わりに、セルのindexPathが蟞曞に保存されおいるこずを確認しおください。 そうでない堎合は、セルが初めお衚瀺されたため、アニメヌションを開始し、indexPathを呜什セットに远加する必芁がありたす。 すでにキットに含たれおいる堎合は、䜕もしないでください。



プロゞェクトをコンパむルしお実行したす。 Tableviewを䞊䞋にスワむプするず、画面に最初に衚瀺されたずきにアニメヌション化されたセルのみが衚瀺されたす。



画像



次に䜕をする



このチュヌトリアルでは、暙準の芖芚化制埡方法にアニメヌションを远加したした。 アニメヌション実装の詳现は、MainViewControllerクラスで指定されおいたせん。 それどころか、それらは補助クラスに移されたした。 特にディスプレむコントロヌラヌのアクティブな状態でクラスの責任を維持するこずは、IOSの開発における䞻芁な課題の1぀です。 完成したプロゞェクトをダりンロヌドできたす



セルにアニメヌションを远加する基本を孊習したので、倉換の倀を倉曎しお、䜜成できる他の効果を確認しおください。 いく぀かのアむデア



1.アニメヌションの高速化たたは䜎速化。

2.より倧きな傟斜角。

3.異なるオフセット回転角床を倉曎する堎合、ほずんどの堎合、画像をたっすぐに芋えるようにオフセットを倉曎する必芁がありたす。 オフセットを完党に省略し、パラメヌタヌの倀0、0を䜿甚するず、むメヌゞはどのようになりたすか

4.創造性を発揮し、オリゞナルの画像を䜜成したす。

5.䞊玚ナヌザヌ向け氎平軞たたは垂盎軞でテヌブルを回転させる効果を埗るこずができたすか 完党なクヌデタヌのように芋せるこずはできたすか

6.䞊玚ナヌザヌの堎合else句をtableViewtableView、willDisplayCell、forRowAtIndexPath :)に远加し、デヌタセルが2回目に衚瀺されるずきに異なるアニメヌション効果を取埗したす。

画像

デヌタセルに適甚できるクレむゞヌなひねり。



この蚘事からアニメヌションを䜜成するための簡単なガむドを孊習したずしおも、この情報に基づいお無限のバリ゚ヌションを䜜成できたす。 アニメヌションは、ナヌザヌのアクションに倧きく远加できたす。たずえば、セルを円圢に反転したり、フェヌドアりトしたり、プレれンテヌションに衚瀺したり、セルを削陀したりできたす。



ps翻蚳は、Habréで最も正確で最高の翻蚳であるふりをしたせん。コメントがあれば、個人で曞いお、線集したす。 ご理解いただきありがずうございたす。



All Articles