So far, you learned how to implement these features of the UICollectionView class:
Today you’ll learn how do the follow:
Shake the collection view cells when the user put it in edit mode.
Fyi, this is not a feature of theUICollectionView class; so you’ll implement it yourself in the iOS app we’ve been working on. Take a look at this QuickTime video, it show results of implementing the collection view cell shaking feature.
Create a New Branch
Ok, start things off by launching the SwiftCollectionView project in Xcode. Use the Source Control menu to create a new branch. Call it shake-collection-view-cells.
The Collection View Cell Shaking Code
Click the PhotoCell.swift file and add code shown in Listing 1. Add the code before the class closing } bracket.
Listing 1: PhotoCell.swift file code
// This function shake the collection view cells func shakeIcons () { let shakeAnim = CABasicAnimation ( keyPath : "transform.rotation" ) shakeAnim . duration = 0.05 shakeAnim . repeatCount = 2 shakeAnim . autoreverses = true let startAngle : Float = (- 2 ) * 3.14159 / 180 var stopAngle = - startAngle shakeAnim . fromValue = NSNumber ( float : startAngle ) shakeAnim . toValue = NSNumber ( float : 3 * stopAngle ) shakeAnim . autoreverses = true shakeAnim . duration = 0.2 shakeAnim . repeatCount = 10000 shakeAnim . timeOffset = 290 * drand48 () //Create layer, then add animation to the element's layer let layer : CALayer = self . layer layer . addAnimation ( shakeAnim , forKey : "shaking" ) shakeEnabled = true } // This function stop shaking the collection view cells func stopShakingIcons () { let layer : CALayer = self . layer layer . removeAnimationForKey ( "shaking" ) self . deleteButton . hidden = true shakeEnabled = false } |
Switch to the MasterViewController.swift file and add this boolean declaration statement.
Listing 2: MasterViewController.swift file code
import UIKit let reuseIdentifier = "Cell" class MasterViewController : UICollectionViewController { @IBOutlet weak var editButton : UIBarButtonItem ! var editModeEnabled = false var icon : PhotoCell ! |
Locate the cellForItemAtIndexPath() function and change the if statement code to the one shown in Listing 3.
Listing 3: MasterViewController.swift file code
if self . navigationItem . rightBarButtonItem !. title == "Edit" { icon . deleteButton . hidden = true } else { icon . deleteButton . hidden = false icon . shakeIcons () } |
Scroll down to the editButtonTapped() function and add code shown in Listing 4.
Listing 4: MasterViewController.swift file code
@IBAction func editButtonTapped ( sender : AnyObject ) { if ( editModeEnabled == false ) { // Put the collection view in edit mode editButton . title = "Done" self . editButton . style = . Done editModeEnabled = true // Loop through the collectionView's visible cells for item in self . collectionView !. visibleCells () as [ PhotoCell ] { var indexPath : NSIndexPath = self . collectionView !. indexPathForCell ( item as PhotoCell )! var cell : PhotoCell = self . collectionView !. cellForItemAtIndexPath ( indexPath ) as PhotoCell ! cell . deleteButton . hidden = false // show all of the delete buttons cell . shakeIcons () } } else { // Take the collection view out of edit mode editButton . style = . Plain editButton . title = "Edit" editModeEnabled = false // Loop through the collectionView's visible cells for item in self . collectionView !. visibleCells () as [ PhotoCell ] { var indexPath : NSIndexPath = self . collectionView !. indexPathForCell ( item as PhotoCell )! var cell : PhotoCell = self . collectionView !. cellForItemAtIndexPath ( indexPath ) as PhotoCell ! cell . deleteButton . hidden = true // Hide all of the delete buttons cell . stopShakingIcons () } } } |
Listing 5 shows the final set of code to add in the MasterViewController.swift file.
Listing 5: MasterViewController.swift file code
// This function is fired when the collection view begin scrolling func collectionView ( collectionView : UICollectionView , didBeginDisplayingCell cell : UICollectionViewCell , forItemAtIndexPath indexPath : NSIndexPath ) { if editModeEnabled == true { for cell in self . collectionView !. visibleCells () as [ PhotoCell ] { // Shake all of the collection view cells cell . shakeIcons () } } } // This function is fired when the collection view stop scrolling override func collectionView ( collectionView : UICollectionView , didEndDisplayingCell cell : UICollectionViewCell , forItemAtIndexPath indexPath : NSIndexPath ) { if editModeEnabled == true { for cell in self . collectionView !. visibleCells () as [ PhotoCell ] { // Shake all of the collection view cells icon . shakeIcons () } } } |
After adding Listing 5 code in the MasterViewController.swift file, run the app in the iOS iPhone/iPad simulator to test the collection view cell shaking feature.
That’s All Folks
That’s all for phase 4 of the SwiftCollectionView application. Next week, you will learn how to implement this feature in the app: highlight the collection view cell the user tapped. Until then, happy coding!