- 📲 iOS 16
- 🔨 Xcode 15
- Resizeable and scalable
- Support for
Dark Mode
- Labels displaying the state
- Customize the following
- Size
- Colors
- Font design
- Animation
- On and Off labels
![Toggle View Light Mode](https://private-user-images.githubusercontent.com/41491421/280473441-8cf6c24d-57b0-4187-8f7d-cbc855dd0d70.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1NTk5NjksIm5iZiI6MTczOTU1OTY2OSwicGF0aCI6Ii80MTQ5MTQyMS8yODA0NzM0NDEtOGNmNmMyNGQtNTdiMC00MTg3LThmN2QtY2JjODU1ZGQwZDcwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE0VDE5MDEwOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ0NGQ5YjViYjU5OTZhNGIyMTU3ZmM1ZDNiNDkwZGYwYTk5NGU0YWQ2NzBjYTQyMjdlYjE3NTQ0ZmFkZWU2YjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YoaRRH123msusKgrdfELNhwrP0ZdjLZJAIIOge1eVR0)
![Toggle View Dark Mode](https://private-user-images.githubusercontent.com/41491421/280473479-421eaf5f-a311-4d11-b3b9-d668b1b1d656.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1NTk5NjksIm5iZiI6MTczOTU1OTY2OSwicGF0aCI6Ii80MTQ5MTQyMS8yODA0NzM0NzktNDIxZWFmNWYtYTMxMS00ZDExLWIzYjktZDY2OGIxYjFkNjU2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE0VDE5MDEwOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTAzYzZlNDNkMmFlM2IzODk2OWU3YjQ0NjRkYWFjM2Q5YmNjMjBhNDFiYmNkNTRlZmJmMGE5NDE1MTI5YzdhZDgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.zd8ViuUz69InOKzkCRQtFKtPviqShhwipo4Vfh0n2tc)
toggleVideo.mov
Add this snippet to your project
//
// ToggleView.swift
//
// Created by Kyle Lovely
//
// https://github.com/pianometal
//
import SwiftUI
/// Custom `.switch` style `Toggle` that scales appropriately based on ``height``
struct ToggleView: View {
@Environment(\.colorScheme) private var colorScheme
@Binding var isOn: Bool
var height: CGFloat = 32
var color: Color = .blue
var fontDesign: Font.Design = .monospaced
var animation = Animation.spring(response: 0.2, dampingFraction: 0.5, blendDuration: 0.75)
var on = "ON"
var off = "OFF"
var body: some View {
HStack {
if isOn { Spacer() }
ZStack {
Circle()
.fill(colorScheme == .light ? .white : .black)
.padding(padding)
Text(isOn ? on : off)
.font(.system(size: fontSize, weight: .black, design: fontDesign))
.foregroundStyle(onColor.gradient)
}
if !isOn { Spacer() }
}
.frame(width: width, height: height)
.background(onColor.gradient)
.clipShape(Capsule())
.onTapGesture { toggle() }
}
private func toggle() {
withAnimation(animation) { isOn.toggle() }
}
private var width: CGFloat { height * 1.75 }
private var padding: CGFloat { height / 16 }
private var fontSize: CGFloat { height * 0.375 }
private var onColor: Color { isOn ? color : .gray }
}
#Preview {
ToggleView(isOn: .constant(true))
}