lMSwitch glance

IMSwitch is a SwiftUI toggle component with image options. It provides a visually appealing and customizable way to toggle between two options.

An easy to use, customizable UISwitch which contains images. Build entirely in SwiftUI

Demo IMSwitch


  • Smooth animations
  • Customizable appearance
  • Support for Right-to-Left (RTL) layout


  • Swift 5.5+
  • iOS 15.0+


Swift Package Manager (SPM)

Add the following to your Package.swift file:

.package(url: "", from: "1.0.0")


// Create an instance of ToggleState
let toggleState = ToggleState()

// Initialize IMSwitch with images and colors
let imSwitch = IMSwitch(
    leftImage: Image(systemName: "bicycle"),
    rightImage: Image(systemName: ""),
    activeColor: .white,
    circleFilledColor: .blue,
    backgroundColor: Color.white.opacity(0.85),
    animation: .easeInOut,
    animationLength: 0.35,
    toggleState: toggleState


  • leftImage: The image displayed when the toggle is in the left (inactive) state.
  • rightImage: The image displayed when the toggle is in the right (active) state.
  • activeColor: The color applied to the state image.
  • circleFilledColor: The color of the filling circle that moves along the toggle.
  • backgroundColor: The background color of the toggle.
  • animation: The type of animation used for state transitions.
  • animationLength: The duration of the animation in seconds.
  • isPrimaryOptionSelected: Represents the state of the primary option.
  • isRTL: Represents the Right-to-Left (RTL) layout direction.

Observing Changes

import SwiftUI

struct YourView: View {
    @StateObject var toggleState = ToggleState()

    var body: some View {
            // ... other parameters ...
            toggleState: toggleState
        .onReceive(toggleState.$isPrimaryOptionSelected) { newValue in
            // React to changes in isPrimaryOptionSelected
            print("isPrimaryOptionSelected changed to \(newValue)")

Example with RTL

    // ... other parameters ...
    toggleState: toggleState
.environment(\.layoutDirection, .rightToLeft)
.frame(width: 300, height: 90)

IMSwitch is available under the MIT license. See the LICENSE file for more info.


View Github