
๐ SwiftUI์์ ๋๋ง์ ํ ๊ธ ๋ง๋ค๊ธฐ
CustomToggleStyle ๊ตฌํ (macOS ์ฑ์ฉ)
SwiftUI๋ฅผ ํ์ฉํ๋ฉด ๋ค์ํ UI ์ปดํฌ๋ํธ๋ฅผ ์์ฝ๊ฒ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ต๋๋ค. ์ค๋์ macOS ์ฑ์์ ๊ธฐ๋ณธ Toggle ๋์ ์ง์ ์คํ์ผ์ ์ ์ํด ๋๋ง์ ๋์์ธ์ ์ ์ฉํด๋ณด๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
โ ๋ชฉํ
macOS์์ ์ฌ์ฉํ ์ ์๋ ์ปค์คํ ํ ๊ธ ์คํ์ผ์ ๋ง๋ค์ด์, ๊ธฐ์กด์ ์ค์์น ์คํ์ผ์ด ์๋ ์ง์ฌ๊ฐํ ์์ ์์ด ์ข์ฐ๋ก ์์ง์ด๋ ํ ๊ธ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
๐ ์ ์ฒด ์ฝ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
import SwiftUI
struct CustomToggleStyle: ToggleStyle {
func makeBody(configuration: Configuration) -> some View {
HStack {
configuration.label
Rectangle()
.foregroundColor(configuration.isOn ? .green : Color(hex: "#468284"))
.frame(width: 40, height: 20)
.cornerRadius(10)
.overlay(
Circle()
.foregroundColor(.white)
.padding(.all, 3)
.offset(x: configuration.isOn ? 10 : -10)
)
.onTapGesture {
configuration.isOn.toggle()
}
}
}
}
๐งฉ ์ฝ๋ ๊ตฌ์ฑ ์์ธ ์ค๋ช


1. ToggleStyle ํ๋กํ ์ฝ ์ฑํ
ToggleStyle์ ์ฑํํ๋ฉด Toggle์ ์๊ฐ์ ํํ์ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ ์ดํ ์ ์์ต๋๋ค. makeBody(configuration: ) ๋ฉ์๋๋ฅผ ๊ตฌํํด ์ปค์คํฐ๋ง์ด์งํฉ๋๋ค.
2. configuration.label
Toggle์ ์ ๋ฌ๋ ๋ผ๋ฒจ์ HStack์ ์ผ์ชฝ์ ๋ฐฐ์นํฉ๋๋ค. ์๋ฅผ ๋ค์ด “์๋ฆผ ์ค์ ” ๊ฐ์ ํ
์คํธ๊ฐ ์ฌ๊ธฐ์ ๋ค์ด๊ฐ๋๋ค.
3. ์ง์ฌ๊ฐํ ๋ฐฐ๊ฒฝ (Rectangle)
– ํฌ๊ธฐ : 40 x 20
– ์์ : isOn ์ํ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ํํ
์ผ์ง (true) : ์ด๋ก์ (.green)
๊บผ์ง (false) : ์คํธ๋ธ๋ฃจ ๊ณ์ด (#4682B4)
– ๋ฅ๊ทผ ๋ชจ์๋ฆฌ : cornerRadius(10) ์ผ๋ก ๋ฒํผ์ฒ๋ผ ๋ณด์ด๋๋ก ์ฒ๋ฆฌ
4. ์ํ ์ฌ๋ผ์ด๋ (Circle)
– ํฐ์ ์์ด ๋ด๋ถ์ ์์นํด ์๊ณ , .offset(x:)์ ์ฌ์ฉํด ์ข์ฐ ์ด๋
isOn == true ์ด๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
isOn == false ์ด๋ฉด ์ผ์ชฝ์ผ๋ก ์ด๋
– .padding(.all, 3) ์ผ๋ก ์ ๋์ ์ฌ๋ฐฑ ํ๋ณด
– overlay๋ก Rectangle ์์ ๋ง์์
5. ์ ์ค์ฒ ์ถ๊ฐ (onTapGesture)
์ฌ์ฉ์๊ฐ Rectangle์ ํด๋ฆญํ๋ฉด isOn ์ํ๋ฅผ ๋ฐ์ ์ํค๋๋ก ์ค์ ํ์ต๋๋ค. ์ฆ ์ค์ ๋์์ ์ด ์ ์ค์ฒ๋ก ํธ๋ฆฌ๊ฑฐ ๋ฉ๋๋ค.
๐งช ์ค์ ์ฌ์ฉ ์์
// 3.์ค๋ณต์ฒดํฌ ์ฌ๋ผ์ด๋
Toggle(NSLocalizedString("DUPLICATE_CHECK", comment: "์ค๋ณต์ฒดํฌ"), isOn: $viewModel.isDuplicate(Enabled)
.toggleStyle(CustomToggleStyle())
๐ก ์ ๋ฆฌ
SwiftUI์ ToggleStyle์ ํ์ฉํ๋ฉด ๋งค์ฐ ์ ์ฐํ๊ฒ ์ฌ์ฉ์ ์ ์ ํ ๊ธ UI๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฒ ์์ ์ฒ๋ผ macOS ์ฑ์์๋ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด ๋ณด์ธ์!!