TKSwitcherCollection

September 14, 2026 · View on GitHub

A collection of animated switches for UIKit and SwiftUI.

English | 简体中文

iOS 13.0+ Swift 6 Swift Package Manager License MIT

SwitchExample
TKSimpleSwitch
TKSimpleSwitch (rotate)
TKExchangeSwitch
TKSmileSwitch
TKLiquidSwitch

Switch designs by Oleg Frolov.

Features

  • Four animated switches: simple (with optional rotate effect), exchange, smile and liquid.
  • UIKit controls built on UIControl: target/action and @IBDesignable / @IBInspectable support.
  • SwiftUI wrappers with Binding<Bool> sharing the same animations.
  • Light / dark mode friendly when configured with semantic colors.

Requirements

  • iOS 13.0+
  • Swift 6 toolchain (Xcode 16+)

Installation

Swift Package Manager

In Xcode, select File > Add Package Dependencies... and enter the package URL:

https://github.com/TBXark/TKSwitcherCollection

Or add it to your Package.swift:

dependencies: [
    .package(url: "https://github.com/TBXark/TKSwitcherCollection.git", from: "2.0.0")
]

CocoaPods

pod 'TKSwitcherCollection', '~> 2.0'

Usage

UIKit

Every switch is a UIControl subclass. A tap toggles the switch and sends .valueChanged.

import UIKit
import TKSwitcherCollection

let switcher = TKSimpleSwitch(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
switcher.onColor = .systemGreen
switcher.rotateWhenValueChange = true

// Closure callback: fired when the user toggles, with the new value
switcher.onValueChange = { value in
    print("switch -> \(value)")
}

// Or use target/action
switcher.addTarget(self, action: #selector(handleValueChanged(_:)), for: .valueChanged)

// Programmatic changes do not fire events (same as UISwitch.setOn(_:animated:))
switcher.isOn = false            // updates immediately, no animation
switcher.setOn(true)             // animated

Available switches: TKSimpleSwitch, TKExchangeSwitch, TKSmileSwitch, TKLiquidSwitch.

SwiftUI

Every switch ships with a SwiftUI view that wraps the UIKit implementation, so the animations are identical. isOn is a regular Binding<Bool>.

import SwiftUI
import TKSwitcherCollection

struct DemoView: View {
    @State private var isOn = true

    var body: some View {
        TKSimpleSwitchView(isOn: $isOn, rotateWhenValueChange: true)
            .frame(width: 100, height: 50)
    }
}

Available views: TKSimpleSwitchView, TKExchangeSwitchView, TKSmileSwitchView, TKLiquidSwitchView.

Customization

All color / size properties are settable on both the UIKit controls and their SwiftUI wrappers:

SwitchProperties
TKSimpleSwitchonColor, offColor, lineColor, circleColor, lineSize, rotateWhenValueChange
TKExchangeSwitchlineColor, onColor, offColor, lineSize
TKSmileSwitch–
TKLiquidSwitchonColor, offColor

All switches also expose isOn, animationDuration, onValueChange and setOn(_:animated:).

Demo

make demo

The demo app is generated with XcodeGen from Demo/project.yml and shows every switch in both a UIKit and a SwiftUI tab. make demo-build builds it from the command line.

License

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