 		child.registerClass(Cell.self, forCellWithReuseIdentifier: "Cell")
 
 		view.addSubview(child)
+	}
+
+
+	public override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
+		return false
+	}
+
+
+	private func updateAppearStateForAllCellsAnimated(animated: Bool) {
+		for cell in collectionView.visibleCells() {
+			guard let cell = cell as? Cell else {
+				continue
+			}
+
+			updateAppearStateForCell(cell, animated: animated)
+		}
+	}
+
+
+	private func updateAppearStateForCell(cell: Cell, animated: Bool) {
+		var cellAppearState = appearState
+		if appearState == .DidAppear && (isAnimatingScrollView || collectionView.tracking || collectionView.decelerating) {
+			cellAppearState = .WillAppear
+		}
+
+		switch cellAppearState {
+		case .DidDisappear, .DidAppear:
+			break
+
+		case .WillAppear:
+			if cell.appearState == .DidAppear {
+				cellAppearState = .DidAppear
+			}
+
+		case .WillDisappear:
+			if cell.appearState == .DidDisappear {
+				cellAppearState = .DidDisappear
+			}
+		}
+
+		cell.updateAppearState(cellAppearState, animated: animated)
 	}
 
 


		setupCollectionView()
	}
}



public /* non-final */ class ScrollViewController: ViewController {

	private var appearState = AppearState.DidDisappear
	private lazy var collectionView: UICollectionView = CollectionView(frame: .zero, collectionViewLayout: self.collectionViewLayout)
	private lazy var collectionViewLayout = UICollectionViewFlowLayout()
	private var isAnimatingScrollView = false
	private var isSettingPrimaryViewControllerInternally = false


