์๋ฌด๋ฆฌ ๋ด๋ ํญ ๋ฐ๊ฐ ๋ง๋๊ฑฐ ๊ฐ์๋ฐ ๋์์ธํ์ด ํ ๊ธ์ด๋ผ ํ๋ ์ฐ์ ํ ๊ธ์ธ๊ฑธ๋ก..!! ๋ญ 2๊ฐ๋ฉด ํ ๊ธ ๋ง์ง!
์๋ฒ๋ก ๋ถํฐ ๋ช ๊ฐ๊ฐ ์ฌ์ง ๋ชจ๋ฅด๊ณ , ํด๋น ์์ญ์ ํญํ์ ๋ ํ ๊ธ ์ ๋๋ฉ์ด์ ์ด ์คํ๋์ผ ํ๋ค. Namespace๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฐ์ค๋ฌ์ด ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ์ ์๋ค.
๋ฌผ๋ก animation ์ ์ฌ์ฉํด๋ ๋๋ค! ์ฒ์์ GeometryReader๋ก ์์น๋ฅผ ๊ณ์ฐ ํ ๋ค ํ๋์ View์ ์์น๋ฅผ ๋ณ๊ฒฝํด ์ฃผ์๋๋ offset๊ณผ padding ์ผ๋ก ๋ทฐ ๊ณ์ธต์ ๋ฐ๊ฟจ์ ๋ ์ด์๊ฐ ์์๋ค. GeometryReader๋ก ๊ณ์ฐ ํ ์์น๊ฐ ๋ฌ๋ผ์ ธ์ ์๋ฑํ ๊ณณ์์ ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ์์๋๊ณ ์์ง์๋ค.
struct CustomToggle: View {
let priceList = ["on", "off", "test"]
/// ํ ๊ธ ์ ๋๋ฉ์ด์
@Namespace private var toggleAnimation
/// ํ์ฌ ์ ํ๋ ์์น
@State private var selectedIndex = 0
/// on/off ์ฌ๋ถ
@Binding var isOn: Bool
var body: some View {
ZStack {
HStack(spacing: 0) {
ForEach(priceList.indices, id: \.self) { index in
ToggleAnimationView(selectedIndex == index, content: Text(priceList[index])
.font(.system(size: 14))
.fontWeight(.bold)
.frame(height: 42)
.padding(.horizontal, 18)
.foregroundColor(selectedIndex == index ? Color.white : .black)
.onTapGesture {
withAnimation(.easeInOut) {
selectedIndex = index
}
}
) //: ToggleAnimationView
} //: ForEach
} //: HStack
} //: ZStack
.padding(2)
.frame(height: 46)
.background(
RoundedRectangle(cornerRadius: 23)
.stroke(.white, lineWidth: 1)
.shadow(color: Color(white: 0, opacity: 0.5), radius: 3, x: 3, y: 3)
.background(.gray)
.clipShape(RoundedRectangle(cornerRadius: 23))
)
.frame(maxWidth: .infinity)
}
@ViewBuilder func ToggleAnimationView<Content: View>(_ isActive: Bool, content: Content) -> some View {
if isActive {
content
.background(
RoundedRectangle(cornerRadius: 50)
.foregroundColor(.orange)
.padding(2)
.matchedGeometryEffect(id: "highlightitem", in: toggleAnimation)
)
} else {
content
}
}
}
#Preview {
CustomToggle(isOn: .constant(true))
}
ํต์ฌ์ ์ ํ๋ ์์ดํ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์์ ์ง์ ํ๊ฒ ๋๋๋ฐ, ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ matchedGeometryEffect์ Namespace property wrapper์ ์ฌ์ฉํด์ effect๋ฅผ ์ง์ ํด ์ฃผ๋ฉด ๋๋ค
์ด๋ ๊ฒ ํ๋ฉด ๋ค์์ ์ ํ๋๋ ์์ดํ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์ ๋๋ฉ์ด์ ์ด ์ฐ๊ฒฐ๋๋ค
ForEach๋ SwiftUI์ system ์ ์ํด parent View ์ transition์ ๋ฐ๋ฅด์ง ์์ผ๋ ์ฃผ์ํด์ผ ํ๋ค. parentView์ transition์ด ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ ๊ฐ row์ transition์ด๋ animation์ ๋ฃ์ด์ค์ผ ์์ฐ์ค๋ฝ๊ฒ ๋๋ค.
์ฐธ๊ณ ์ฌ์ดํธ
https://medium.com/appcoda-tutorials/how-to-build-an-animated-tab-bar-in-swiftui-26e4446f90ef
'iOS ๐ > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] NavigationLink (0) | 2023.12.30 |
---|---|
border, overlay stroke, inner stroke 1px (0) | 2023.11.27 |
[SwiftUI] Shape path๋ก Tooltip ๊ทธ๋ฆฌ๊ธฐ (0) | 2023.11.06 |
SwiftUI LifeCycle ํํค์น๊ธฐ ๐ฎ (1) | 2023.10.31 |
[SwiftUI] VStack ๊ณผ LazyVStack ๋ญ๊ฐ ๋ค๋ฅธ ๊ฑธ๊น? (1) | 2023.10.08 |