Skip to content

UISlider

UISlider is a UIKit control that allows users to select a value from a continuous range by dragging a thumb along a track. It is a subclass of UIControl and is commonly used for adjusting settings like volume, brightness, or progress. This document covers the key properties, methods, and usage of UISlider, along with examples and best practices.

Overview of UISlider

A UISlider provides a visual interface for selecting a value within a defined range. It consists of a track, a thumb (the draggable element), and optional minimum/maximum value indicators. Users interact with the slider by dragging the thumb or tapping on the track.

Creating a UISlider

You can create a UISlider programmatically or via Interface Builder (storyboards/xibs).

Programmatic Example:

swift
import UIKit

let slider = UISlider()
slider.minimumValue = 0
slider.maximumValue = 100
slider.value = 50
slider.addTarget(self, action: #selector(sliderValueChanged(_:)), for: .valueChanged)
view.addSubview(slider)

Key Properties of UISlider

Below are the most commonly used properties of UISlider:

PropertyTypeDescription
valueFloatThe current value of the slider (between minimumValue and maximumValue).
minimumValueFloatThe minimum value of the slider’s range.
maximumValueFloatThe maximum value of the slider’s range.
isContinuousBoolIf true, sends .valueChanged events continuously during dragging; if false, only when dragging ends.
minimumTrackTintColorUIColor?The color of the track to the left of the thumb.
maximumTrackTintColorUIColor?The color of the track to the right of the thumb.
thumbTintColorUIColor?The color of the thumb.
minimumValueImageUIImage?An image displayed at the minimum end of the track.
maximumValueImageUIImage?An image displayed at the maximum end of the track.
isEnabledBoolWhether the slider is enabled (affects appearance and interaction).

Example: Configuring Properties:

swift
slider.minimumValue = 0
slider.maximumValue = 10
slider.value = 5
slider.minimumTrackTintColor = .systemBlue
slider.maximumTrackTintColor = .systemGray
slider.thumbTintColor = .white
slider.isContinuous = true

Key Methods of UISlider

UISlider inherits methods from UIControl and UIView, but also provides slider-specific methods:

MethodDescription
setValue(_:animated:)Sets the slider’s value, optionally animating the thumb movement.
setThumbImage(_:for:)Sets a custom image for the thumb in a specific state (e.g., .normal, .highlighted).
setMinimumTrackImage(_:for:)Sets a custom image for the minimum track in a specific state.
setMaximumTrackImage(_:for:)Sets a custom image for the maximum track in a specific state.

Example: Customizing Thumb and Track:

swift
slider.setThumbImage(UIImage(systemName: "circle.fill"), for: .normal)
slider.setMinimumTrackImage(UIImage(systemName: "line.horizontal.3"), for: .normal)

Handling User Interaction

To respond to value changes, add a target-action for the .valueChanged event.

Example:

swift
slider.addTarget(self, action: #selector(sliderValueChanged(_:)), for: .valueChanged)

@objc func sliderValueChanged(_ sender: UISlider) {
    print("Slider value: \(sender.value)")
}

Customizing Appearance

Track and Thumb Colors

  • Use minimumTrackTintColor and maximumTrackTintColor to customize the track’s appearance.
  • Use thumbTintColor to change the thumb’s color.

Example:

swift
slider.minimumTrackTintColor = .systemGreen
slider.maximumTrackTintColor = .systemGray2
slider.thumbTintColor = .white

Custom Images

You can use custom images for the thumb, minimum track, or maximum track.

Example:

swift
slider.setThumbImage(UIImage(named: "customThumb"), for: .normal)
slider.setMinimumTrackImage(UIImage(named: "customMinTrack"), for: .normal)
slider.setMaximumTrackImage(UIImage(named: "customMaxTrack"), for: .normal)

Minimum and Maximum Value Images

Add icons to the ends of the slider using minimumValueImage and maximumValueImage.

Example:

swift
slider.minimumValueImage = UIImage(systemName: "minus.circle")
slider.maximumValueImage = UIImage(systemName: "plus.circle")

Continuous vs. Discrete Updates

  • Set isContinuous = true (default) to receive .valueChanged events continuously as the user drags.
  • Set isContinuous = false to receive events only when the user releases the thumb.

Example:

swift
slider.isContinuous = false // Updates only when dragging ends

Best Practices

  • Set a Reasonable Range: Ensure minimumValue and maximumValue suit the use case (e.g., 0–100 for percentages).

  • Support Accessibility: Set accessibilityLabel and accessibilityValue for VoiceOver.

    swift
    slider.accessibilityLabel = "Volume control"
    slider.accessibilityValue = "\(Int(slider.value))%"
  • Use Auto Layout: Set translatesAutoresizingMaskIntoConstraints = false and use constraints (e.g., with SnapKit).

  • Provide Visual Feedback: Update a label or other UI element to show the slider’s value.

  • Test on Devices: Verify thumb drag behavior and appearance on various screen sizes.

Troubleshooting

  • Slider Not Responding: Ensure isEnabled = true and the target-action is set for .valueChanged.
  • Value Out of Range: Verify value is between minimumValue and maximumValue.
  • Appearance Issues: Check iOS version compatibility for properties like thumbTintColor.
  • Accessibility Issues: Test with VoiceOver to ensure accessibilityValue updates dynamically.

Example: Complete UISlider Setup

swift
import UIKit
import SnapKit

class ViewController: UIViewController {
    let slider = UISlider()
    let valueLabel = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Configure slider
        slider.minimumValue = 0
        slider.maximumValue = 100
        slider.value = 50
        slider.minimumTrackTintColor = .systemBlue
        slider.maximumTrackTintColor = .systemGray
        slider.thumbTintColor = .white
        slider.minimumValueImage = UIImage(systemName: "speaker.fill")
        slider.maximumValueImage = UIImage(systemName: "speaker.wave.3.fill")
        slider.isContinuous = true
        slider.addTarget(self, action: #selector(sliderValueChanged(_:)), for: .valueChanged)
        
        // Configure label
        valueLabel.text = "Value: \(Int(slider.value))"
        valueLabel.textAlignment = .center
        
        // Accessibility
        slider.accessibilityLabel = "Volume control"
        slider.accessibilityValue = "\(Int(slider.value))%"
        
        view.addSubview(slider)
        view.addSubview(valueLabel)
        
        // Auto Layout with SnapKit
        slider.snp.makeConstraints { make in
            make.centerX.equalToSuperview()
            make.top.equalTo(view.safeAreaLayoutGuide).offset(20)
            make.width.equalTo(300)
        }
        
        valueLabel.snp.makeConstraints { make in
            make.centerX.equalToSuperview()
            make.top.equalTo(slider.snp.bottom).offset(20)
        }
    }
    
    @objc func sliderValueChanged(_ sender: UISlider) {
        valueLabel.text = "Value: \(Int(sender.value))"
        slider.accessibilityValue = "\(Int(sender.value))%"
    }
}

Resources

Released under the MIT License.