         trackLayer.setNeedsDisplay()
     }
     
-    func updateLayersPosition() {
+    func updateThumbLayersText() {
+        thumbLayer.string = textForValue(value)
+    }
+    
+    func updateThumbLayersPosition() {
+        CATransaction.begin()
+        CATransaction.setDisableActions(true)
+        CATransaction.setAnimationDuration(0)
+        
         let thumbCenterX = positionForValue(value: value)
         thumbLayer.position = CGPoint(x: thumbCenterX, y: bounds.size.height / 2)
+        CATransaction.commit()
     }
    
     func updateLayersValue() {
-        thumbLayer.string = textForValue(value)
+        updateThumbLayersText()
         trackLayer.value = value
     }
     
     func positionForValue(value: Float) -> CGFloat {
+        if (minimum == maximum) {
+            return thumbWidth / 2
+        }
+        
         return usableTrackingLength * CGFloat((value - minimum) / (maximum - minimum)) + thumbWidth / 2
     }
     

            if (value > maximum) {
                value = maximum
            }
            
            reinitComponentValues()
            redrawLayers()
        }
    }
    


import UIKit

protocol TNSliderDelegate: class {
    func slider(_ slider: TNSlider, displayTextForValue value: Float) -> String
}

@IBDesignable
public class TNSlider: UIControl {
    
    weak var delegate: TNSliderDelegate?
    
    // LOGGING
    func log(_ msg: String) {
//        print(msg)
    }
    //
    
    // default 0.0. this value will be pinned to min/max
    @IBInspectable public var value: Float = 0 {
        didSet {
