Skip to content

Commit 01b678b

Browse files
committed
[#465] 태그뷰 메뉴 디자인 구현
1 parent df81395 commit 01b678b

File tree

2 files changed

+90
-20
lines changed

2 files changed

+90
-20
lines changed

Presentation/Home/TagSearch/TagView.swift

+90-18
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,16 @@ import SwiftUI
99

1010
// MARK: - [쿠로] 태그 뷰!
1111
struct TagView: View {
12-
@State private var popover = false
1312
@EnvironmentObject private var tagViewModel: TagViewModel
13+
@State private var popover = false
14+
@Namespace private var nsPopover
1415

1516
var body: some View {
1617
ZStack(alignment: .top) {
1718
Color.gray300
1819

1920
GeometryReader { geometry in
2021
VStack(spacing: 1) {
21-
22-
// 선택된 태그 화면
2322
HStack {
2423
if tagViewModel.isTagSelected {
2524
SelectedTagView()
@@ -36,7 +35,6 @@ struct TagView: View {
3635
.stroke(Color.gray400, lineWidth: 1)
3736
)
3837

39-
// 태그 선택하는 화면
4038
VStack {
4139
Group {
4240
if tagViewModel.isTagExist {
@@ -50,12 +48,16 @@ struct TagView: View {
5048
.frame(minHeight: geometry.size.height * 0.35)
5149

5250
// 편집 버튼
53-
HStack {
51+
HStack(spacing: 0) {
5452
Spacer()
5553
EllipsisView(ellipsisAction: {
56-
popover.toggle()
54+
withAnimation {
55+
popover.toggle()
56+
}
5757
})
58-
//TODO: - 팝오버 띄우기
58+
.matchedGeometryEffect(id: "popover",
59+
in: nsPopover,
60+
anchor: .topTrailing)
5961
}
6062
}
6163
.frame(maxWidth: .infinity,maxHeight: geometry.size.height * 0.4)
@@ -66,28 +68,39 @@ struct TagView: View {
6668
}
6769
.padding([.top, .horizontal], 20)
6870
}
71+
if popover {
72+
EllipsisButtonView(namespace: nsPopover)
73+
.transition(.opacity.combined(with: .scale))
74+
}
6975
}
7076
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
7177
.ignoresSafeArea(.all)
78+
.onTapGesture {
79+
withAnimation {
80+
popover = false
81+
}
82+
}
7283
}
7384
}
7485

86+
// MARK: - 태그를 선택하지 않음
7587
struct TagLEmptyView: View {
7688
var body: some View {
77-
Text("태그로 원하는 논문을 찾아보세요")
78-
.reazyFont(.button1)
79-
.foregroundStyle(.gray550)
80-
Spacer()
81-
Button(action: {
82-
83-
}, label: {
84-
Image(systemName: "chevron.down")
85-
.font(.system(size: 16))
86-
.foregroundStyle(.gray600)
87-
})
89+
Text("태그로 원하는 논문을 찾아보세요")
90+
.reazyFont(.button1)
91+
.foregroundStyle(.gray550)
92+
Spacer()
93+
Button(action: {
94+
95+
}, label: {
96+
Image(systemName: "chevron.down")
97+
.font(.system(size: 16))
98+
.foregroundStyle(.gray600)
99+
})
88100
}
89101
}
90102

103+
// MARK: - 태그를 선택함
91104
struct SelectedTagView: View {
92105
@EnvironmentObject private var tagViewModel: TagViewModel
93106
var body: some View {
@@ -103,6 +116,7 @@ struct SelectedTagView: View {
103116
}
104117
}
105118

119+
// MARK: - 태그 전체 리스트 뷰
106120
struct TagListView: View {
107121
@EnvironmentObject private var tagViewModel: TagViewModel
108122
var body: some View {
@@ -118,6 +132,64 @@ struct TagListView: View {
118132
}
119133
}
120134

135+
// MARK: - 태그 전체 리스트 뷰
136+
private struct EllipsisButtonView: View {
137+
let namespace: Namespace.ID
138+
var body: some View {
139+
VStack(spacing: 0) {
140+
Button {
141+
142+
} label: {
143+
HStack {
144+
Text("태그 목록 편집")
145+
.reazyFont(.body1)
146+
Spacer()
147+
Image(.editpencil)
148+
.resizable()
149+
.frame(width: 17, height: 17)
150+
}
151+
}
152+
.foregroundStyle(.gray800)
153+
.padding(.leading, 17)
154+
.padding(.trailing, 14)
155+
.padding(.vertical, 11)
156+
157+
Rectangle()
158+
.foregroundStyle(.primary2)
159+
.frame(height: 1)
160+
161+
Button {
162+
163+
} label: {
164+
HStack {
165+
Text("새로운 태그 생성")
166+
.reazyFont(.body1)
167+
Spacer()
168+
Image(systemName: "tag")
169+
.font(.system(size: 14))
170+
}
171+
}
172+
.foregroundStyle(.gray800)
173+
.padding(.leading, 17)
174+
.padding(.trailing, 14)
175+
.padding(.vertical, 11)
176+
}
177+
.frame(width: 200)
178+
.background(
179+
RoundedRectangle(cornerRadius: 10)
180+
.fill(.gray100)
181+
.shadow(color: Color(hex: "#3C3D4B").opacity(0.08), radius: 12, x: 0, y: 0)
182+
)
183+
.padding(.trailing, 70)
184+
.matchedGeometryEffect(id: "popover",
185+
in: namespace,
186+
properties: .position,
187+
anchor: .topTrailing,
188+
isSource: false)
189+
}
190+
}
191+
192+
121193
#Preview {
122194
TagView()
123195
}

Presentation/Home/TagSearch/TagViewModel.swift

-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ class TagViewModel: ObservableObject {
2020
}
2121
@Published public private(set) var isTagExist: Bool = false
2222
@Published public var isTagSelected: Bool = false
23-
2423
private var cancellables = Set<AnyCancellable>()
25-
// 선택한 칩스 배열에 타이틀 저장 -> 선택된 태그 목록에 뜨도록 하기
2624

2725
init(
2826
tagViewUseCase: TagViewUseCase,

0 commit comments

Comments
 (0)