A collection of animated switches for UIKit and SwiftUI.
English | 简体中文
| Switch | Example |
|---|---|
TKSimpleSwitch |
![]() |
TKSimpleSwitch (rotate) |
![]() |
TKExchangeSwitch |
![]() |
TKSmileSwitch |
![]() |
TKLiquidSwitch |
![]() |
Switch designs by Oleg Frolov.
- Four animated switches: simple (with optional rotate effect), exchange, smile and liquid.
- UIKit controls built on
UIControl: target/action and@IBDesignable/@IBInspectablesupport. - SwiftUI wrappers with
Binding<Bool>sharing the same animations. - Light / dark mode friendly when configured with semantic colors.
- iOS 13.0+
- Swift 6 toolchain (Xcode 16+)
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: "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/TBXark/TKSwitcherCollection.git", from: "2.0.0")
]pod 'TKSwitcherCollection', '~> 2.0'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) // animatedAvailable switches: TKSimpleSwitch, TKExchangeSwitch, TKSmileSwitch, TKLiquidSwitch.
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.
All color / size properties are settable on both the UIKit controls and their SwiftUI wrappers:
| Switch | Properties |
|---|---|
TKSimpleSwitch |
onColor, offColor, lineColor, circleColor, lineSize, rotateWhenValueChange |
TKExchangeSwitch |
lineColor, onColor, offColor, lineSize |
TKSmileSwitch |
– |
TKLiquidSwitch |
onColor, offColor |
All switches also expose isOn, animationDuration, onValueChange and setOn(_:animated:).
make demoThe 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.
TKSwitcherCollection is available under the MIT license. See the LICENSE file for more info.




