         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))


import UIKit

class RoundDropMenu: UIView {
  
  var dropViews = [DropView]()
  
  var delegate: RoundDropMenuDelegate!
  var dataSource: RoundDropMenuDataSource! {
    didSet {
      dropViews = loadDropViews()
      
      if selectedDropIndex == nil {
        selectedDropIndex = 0
      }
    }
  }
  
  // MARK: - Menu Appearance
  
  var color: UIColor = UIColor(red: 1.0, green: 1.0, blue: 22.0/255.0, alpha: 1.0)
  var offset: CGFloat = 80
  
  // MARK: Drop Appearance
  
  let maxDropRadius: CGFloat = 40.0
  let minDropRadius: CGFloat = 20.0
  var dropWidthWithOffset: CGFloat { return (maxDropRadius * 2 + 20) }
  
  private var selectedDropIndex: Int? {
    didSet {
      if let dropView = selectedDropView {

    }
  }
  
  /**
   Calculates frame for `DropView` object accordingly to provided `position`.
   
   - parameter position: `CGPoint` struct to calculate new frame.
   
   - returns: Frame for `DropView` object on `position`.
   */
  private func getDropViewFrameAtPosition(position: CGPoint) -> CGRect {
    let offsetRelativeToCenter = abs(position.x - bounds.midX)
    let scaleValue = 1 - offsetRelativeToCenter / bounds.midX
    let dropScale = 2 * ((maxDropRadius - minDropRadius) * scaleValue + minDropRadius)
    
    return CGRect(
