@@ -12,29 +12,43 @@ import SwiftUI
1212/// 관심 코인 기반 추천, AI 브리핑으로 구성합니다.
1313struct DashboardView : View {
1414 @Environment ( \. horizontalSizeClass) var hSizeClass
15+ @Environment ( \. dynamicTypeSize) var typeSize
1516
1617 @Namespace var coordinateSpaceName : Namespace . ID
1718 /// 스크롤의 위치를 저장하는 상태 변수
1819 @State var scrollOffset : CGFloat = 0
1920 /// 상단 여백을 저장하는 상태 변수: onAppear에서 실제 높이를 계산함
2021 @State var topInset : CGFloat = 0
22+ @State var currentTypeSize : DynamicTypeSize = . medium
2123
22- /// 배경색의 높이를 저장하는 계산 속성: 헤더의 높이 + 여백 + 카드의 높이 / 2 + 상단 여백
23- /// 배경이 카드의 중앙까지만 깔리게 해야 하는데 뷰가 여러 계층으로 나눠져있어서 각 컴포넌트의 높이를 계산해서 사용함
24- var gradientHeight : CGFloat {
25- CardConst . headerHeight + CardConst. headerContentSpacing + ( CardConst . cardHeight / 2 ) + topInset
24+ /// 다이나믹 폰트 적용 후 헤더 컨텐츠 크기가 커질 때
25+ /// 헤더 사이즈를 유동적으로 조정하기 위해 사용하는 계산 속성
26+ /// 헤더뷰와 배경 그래디언트 크기에도 영향을 주기 때문에
27+ /// 여기에서 계산 후 헤더뷰에게 전파
28+ var dynamicHeaderHeight : CGFloat {
29+ switch typeSize {
30+ case . xSmall, . small, . medium: CardConst . headerHeight
31+ case . large, . xLarge, . xxLarge, . xxxLarge: CardConst . headerHeight * 1.1
32+ default : CardConst . headerHeight * 1.4
33+ }
2634 }
2735
2836 var body : some View {
2937 /// 배경색에 Sticky 효과 적용을 위해 추가적인 높이: 스크롤 위치만큼 더해주기 위해 사용
3038 /// 쫀득한 효과를 더 드라마틱하게 보여주기 위해 스크롤 위치의 1.2배만큼 늘리기
3139 let extraHeight = max ( 0 , - scrollOffset * 1.2 )
3240
41+ /// 배경색의 높이를 저장하는 계산 속성: 헤더의 높이 + 여백 + 카드의 높이 / 2 + 상단 여백
42+ /// 배경이 카드의 중앙까지만 깔리게 해야 하는데 뷰가 여러 계층으로 나눠져있어서 각 컴포넌트의 높이를 계산해서 사용함
43+ var gradientHeight : CGFloat {
44+ dynamicHeaderHeight + CardConst. headerContentSpacing + ( CardConst . cardHeight / 2 ) + topInset
45+ }
46+
3347 GeometryReader { outerProxy in
3448 NavigationStack {
3549 ScrollView {
3650 VStack {
37- RecommendCoinView ( )
51+ RecommendCoinView ( headerHeight : dynamicHeaderHeight )
3852 AIBriefingView ( )
3953 }
4054 . padding ( . top, topInset)
@@ -112,12 +126,6 @@ struct DashboardView: View {
112126 }
113127}
114128
115- #Preview {
116- DashboardView ( )
117- . environmentObject ( ThemeManager ( ) )
118- . environmentObject ( RecommendCoinViewModel ( ) )
119- }
120-
121129/// scrollOffset을 구하기 위한 PreferenceKey
122130private struct ScrollOffsetPreferenceKey : PreferenceKey {
123131 static var defaultValue : CGFloat { . zero }
@@ -126,3 +134,9 @@ private struct ScrollOffsetPreferenceKey: PreferenceKey {
126134 value += nextValue ( )
127135 }
128136}
137+
138+ #Preview {
139+ DashboardView ( )
140+ . environmentObject ( ThemeManager ( ) )
141+ . environmentObject ( RecommendCoinViewModel ( ) )
142+ }
0 commit comments