         picker.bounds.size = pickerSize
         frame.size = pickerSize
         picker.frame = bounds
+    }
+
+    /**
+     Recalculates `displayString` and `componentsString` and refreshes the picker view. Called whenever a property
+     of the `NumericPicker` changes.
+
+     - parameter animated: whether to animate the changes to the picker's components (default: `true`)
+     */
+    func updateAppearance(animated: Bool = true) {
+        displayString = updatedDisplayString(value: value, fractionDigits: fractionDigits)
+        componentsString = updatedComponentString(value: value,
+                                                  intDigits: minIntegerDigits,
+                                                  fractionDigits: fractionDigits)
+
+        picker.reloadAllComponents()
+        var index = 0
+
+        for char in componentsString.characters {
+            // Row is the numeric value of the digit string, or zero for separators
+            let row = Int(String(char)) ?? 0
+            picker.selectRow(row, inComponent: index, animated: animated)
+            index += 1
+        }
     }
 
     /**

    /// Minimum number of digits to display to the left of the decimal separator (defaults to `1`)
    @IBInspectable public var minIntegerDigits: Int = 1 {
        didSet {
            updateValue(animated: false)
            resize()
        }
    }

    /// The locale used for numeric presentation. (defaults to current locale)
    public var locale = Locale.current {
        didSet {
            updateAppearance(animated: false)
            resize()
        }
    }
