 import UIKit
 
 @objc protocol RAReorderableLayoutDelegate: UICollectionViewDelegateFlowLayout {
-    
+    optional func collectionView(collectionView: UICollectionView, atIndexPath: NSIndexPath, willMoveToIndexPath toIndexPath: NSIndexPath)
+    optional func collectionView(collectionView: UICollectionView, atIndexPat: NSIndexPath, didMoveToIndexPath toIndesPath: NSIndexPath)
+    
+    optional func collectionView(collectionView: UICollectionView, allowMoveAtIndexPath indexPath: NSIndexPath) -> Bool
+    optional func collectionView(collectionView: UICollectionView, atIndexPath: NSIndexPath, canMoveToIndexPath: NSIndexPath) -> Bool
+    
+    optional func collectionView(collectionView: UICollectionView, collectionViewLayout layout: RAReorderableLayout, willBeginDraggingItemAtIndexPath indexPath: NSIndexPath)
+    optional func collectionView(collectionView: UICollectionView, collectionViewLayout layout: RAReorderableLayout, didBeginDraggingItemAtIndexPath indexPath: NSIndexPath)
+    optional func collectionView(collectionView: UICollectionView, collectionViewLayout layout: RAReorderableLayout, willEndDraggingItemToIndexPath indexPath: NSIndexPath)
+    optional func collectionView(collectionView: UICollectionView, collectionViewLayout layout: RAReorderableLayout, didEndDraggingItemToIndexPath indexPath: NSIndexPath)
 }
 
 @objc protocol RAReorderableLayoutDataSource: UICollectionViewDataSource {
     func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
     func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
+    
+    optional func collectionView(collectionView: UICollectionView, reorderingItemAlphaInSection section: Int) -> CGFloat
+    optional func collectionView(scrollTrigerEdgeInsetsInCollectionView trigerInsets: UICollectionView) -> UIEdgeInsets
 }
 
 class RAReorderableLayout: UICollectionViewFlowLayout, UIGestureRecognizerDelegate {

                var layoutAttribute = attribute as UICollectionViewLayoutAttributes
                if layoutAttribute.representedElementCategory == .Cell {
                    if layoutAttribute.indexPath.isEqual(self.cellFakeView?.indexPath) {
                        layoutAttribute.alpha = 0
                    }
                }
            }

    override func prepareLayout() {
        super.prepareLayout()
        
        if let insets = self.datasource?.collectionView?(scrollTrigerEdgeInsetsInCollectionView: self.collectionView!) {
            self.trigerInsets = insets
        }
    }
    
    override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
