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! 🙂