             didSelectItem()
         }
     }
+    
+    public func selectItem(choice: Int, animated: Bool) {
+        selectItem(choice, animated: animated, force: false)
+    }
+}
+
+extension SwiftCarousel: UIScrollViewDelegate {
+    public func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
+        didSelectItem()
+    }
+    
+    public func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) {
+        didSelectItem()
+    }
+    
+    public func scrollViewWillBeginDragging(scrollView: UIScrollView) {
+        delegate?.willBeginDragging?(withOffset: scrollView.contentOffset)
+    }
+    
+    public func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
+        delegate?.didEndDragging?(withOffset: scrollView.contentOffset)
+    }
+    
+    public func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
+        var velocity = velocity.x * 300.0
+        if velocity >= maxVelocity {
+            velocity = maxVelocity
+        } else if velocity <= -maxVelocity {
+            velocity = -maxVelocity
+        }
+        
+        var targetX = scrollView.contentOffset.x + CGRectGetWidth(scrollView.frame) / 2.0 + velocity
+        if (targetX > scrollView.contentSize.width || targetX < 0.0) {
+            targetX = scrollView.contentSize.width / 3.0 + velocity
+        }
+        
+        let choiceView = nearestViewAtLocation(CGPoint(x: targetX, y: CGRectGetMinY(scrollView.frame)))
+        targetContentOffset.memory.x = choiceView.center.x - scrollView.frame.width / 2.0
+    }
 }
 
 extension UIView {

        }
    }
    
    public func selectItem(choice: Int, animated: Bool) {
        guard choice < choices.count / 3 else {
            return
        }
        var min: Int = originalChoicesNumber
        var index: Int = choice
        if let realSelectedIndex = self.realSelectedIndex {
            for choiceIndex in choice.stride(to: choices.count, by: originalChoicesNumber) {
                if abs(realSelectedIndex - choiceIndex) < min {
                    index = choiceIndex

            x += CGRectGetWidth(choice.frame) + additionalSpacing
        }
        
        scrollView.subviews.forEach { $0.removeFromSuperview() }
        views.forEach { scrollView.addSubview($0) }
        layoutIfNeeded()
