Creating HomeView and a navigation header | SwiftUI Crypto App #2
struct CircleButtonAnimationView: View {
@Binding var animated: Bool
var body: some View {
Circle()
.stroke(lineWidth: 5.0)
.scale(animated ? 1.0 : 0.0)
.opacity(animated ? 0.0 : 1.0)
.animation(animated ? .easeOut(duration: 1.0) : .none)
}
}
Binding
으로 특정 값의 변화를 감지 새롭게 뷰를 그려줄 수 있는 커스텀 컴포넌트 뷰animation
의 불리언 값에 따라 버튼 이펙트를 발생시키는 뷰CircleButtonView(iconName: "chevron.right")
.rotationEffect(Angle(degrees: showPortfolio ? 180 : 0))
.onTapGesture {
withAnimation(.spring()) {
showPortfolio.toggle()
}
}
onTapGesuture
를 통해 애니메이션 효과와 함께 State
변수 토글링Binding
으로 해당 변수를 묶어 놓았기 때문에 위의 버튼 이펙트 뷰에서 변수 값 변경을 감지 가능import SwiftUI
struct HomeView: View {
@State private var showPortfolio: Bool = false
var body: some View {
ZStack {
// background layer
Color.theme.background
.ignoresSafeArea()
// content layer
VStack {
homeHeader
Spacer(minLength: 0)
}
}
}
}
extension HomeView {
private var homeHeader: some View {
HStack {
CircleButtonView(iconName: showPortfolio ? "plus" : "info")
.animation(.none, value: showPortfolio)
.background(
CircleButtonAnimationView(animated: $showPortfolio)
)
Spacer()
Text(showPortfolio ? "Portfolio" : "Live Prices")
.font(.headline)
.fontWeight(.heavy)
.foregroundColor(Color.theme.accent)
.animation(.none)
Spacer()
CircleButtonView(iconName: "chevron.right")
.rotationEffect(Angle(degrees: showPortfolio ? 180 : 0))
.onTapGesture {
withAnimation(.spring()) {
showPortfolio.toggle()
}
}
}
.padding(.horizontal)
}
}
Animation
이펙트가 핵심인 코드import SwiftUI
struct CircleButtonView: View {
let iconName: String
var body: some View {
Image(systemName: iconName)
.font(.headline)
.foregroundColor(Color.theme.accent)
.frame(width: 50, height: 50)
.background(
Circle()
.foregroundColor(Color.theme.background)
)
.shadow(
color: Color.theme.accent.opacity(0.25),
radius: 10, x: 0, y: 0)
.padding()
}
}
import SwiftUI
struct CircleButtonAnimationView: View {
@Binding var animated: Bool
var body: some View {
Circle()
.stroke(lineWidth: 5.0)
.scale(animated ? 1.0 : 0.0)
.opacity(animated ? 0.0 : 1.0)
.animation(animated ? .easeOut(duration: 1.0) : .none)
}
}
scale
, opacity
를 통해 불리언 상태에 따라 표햔할 두 가지 경우 표현 가능aniamtion
을 통해 두 가지 경우 사이의 변경을 상태에 따라 조정 가능SwiftUI의 애니메이션은 정말로 간편하고 보기 좋다.