         dropView.center = newPosition
       }
       
-      if isDropInView(dropView) {
+      if dropIsVisible(dropView) {
         resizeDropView(dropView, animated: animated)
       }
     }
   }
   
+  /**
+   Calculates offset needed to translate `selectedDropView` to the center
+   of the menu and applies `moveDropsWithOffset(_:, animated:).`
+   */
+  private func translateSelectedDropToCenter() {
+    if let centerDrop = selectedDropView {
+      let scrollOffset = bounds.midX - centerDrop.center.x
+      
+      moveDropsWithOffset(scrollOffset, animated: true)
+      if let index = selectedDropIndex {
+        self.scrollPosition = CGFloat(index) * self.dropWidthWithOffset
+      }
+    }
+  }
+  
+  /**
+   Indicates if provided `dropView`'s bounds is in the menu's frame.
+   
+   - parameter dropView: `DropView` object to check.
+   
+   - returns: `true` if `dropView`'s frame located fully in the menu, `false` otherwise.
+   */
+  private func dropIsVisible(dropView: DropView) -> Bool {
+    return !(dropView.center.x > frame.width + maxDropRadius || dropView.center.x < -maxDropRadius)
+  }
+  
+  /**
+   Animates `dropView`'s transition to new position.
+   
+   - parameter dropView:    `DropView` objects to move.
+   - parameter newPosition: New position.
+   */
+  // swiftlint:disable function_body_length
   private func animateDropMove(dropView: DropView, newPosition: CGPoint) {
     let midPointX1 = dropView.center.x + (newPosition.x - dropView.center.x) / 3
     let midPoint1 = CGPoint(x: midPointX1, y: getYOnCircleForX(midPointX1))

      height: dropScale)
  }
  
  private func animateDropResize(dropView: DropView, newSize: CGRect) {
    var s = newSize
    s.origin = CGPointZero

    }
  }
  
  /// Horizontal scroll position of menu.
  private var scrollPosition: CGFloat = 0.0 {
    didSet {
      if scrollPosition < 0.0 {
