         addTarget(self, action: #selector(CircleMenu.onTap), for: newEvent)
     }
 
+    /**
+     Retrieves the incremental lengths between buttons. If the arc length is 360 degrees or more, the increments
+     will evenly space out in a full circle. If the arc length is less than 360 degrees, the last button will be
+     placed on the endAngle.
+     */
+    fileprivate func getArcStep() -> Float {
+        var arcLength = endAngle - startAngle
+        var stepCount = buttonsCount
+
+        if arcLength < 360 {
+            stepCount -= 1
+        } else if arcLength > 360 {
+            arcLength = 360
+        }
+
+        return arcLength / Float(stepCount)
+    }
+
     // MARK: actions
     
     private var isBounceAnimating: Bool = false

        }

        if let buttons = buttons {
            circle.fillAnimation(duration, startAngle: -90 + Float(360 / buttons.count) * Float(sender.tag)) { [weak self] in
                self?.buttons?.forEach { $0.alpha = 0 }
            }
            circle.hideAnimation(0.5, delay: duration) { [weak self] in

            return
        }

        let step = getArcStep()
        for index in 0 ..< buttonsCount {
            guard case let button as CircleMenuButton = buttons[index] else { continue }
            if isShow == true {
                delegate?.circleMenu?(self, willDisplay: button, atIndex: index)
                let angle: Float = startAngle + Float(index) * step
                button.rotatedZ(angle: angle, animated: false, delay: Double(index) * showDelay)
                button.showAnimation(distance: distance, duration: duration, delay: Double(index) * showDelay)
            } else {
