From 1b3e88d20bcb0cacf1857bc8616490f1d6142497 Mon Sep 17 00:00:00 2001 From: enebin Date: Tue, 15 Aug 2023 14:24:30 +0900 Subject: [PATCH] =?UTF-8?q?refactor=20#51:=20=EC=9B=90=20=EC=9D=B4?= =?UTF-8?q?=ED=8E=99=ED=8A=B8=20=ED=94=84=EB=A1=9C=ED=86=A0=EC=BD=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Projects/DSKit/Project.swift | 3 +- .../Sources/MyPage/CircleContentView.swift | 37 +++++++++++++++---- .../MyPage}/GeometryAnimatableCircle.swift | 19 ++++++---- .../Sources/Model/CirclePack/CircleData.swift | 9 ++++- .../Model/CirclePack/CircleMetadata.swift | 1 + .../CircleView/CirclePackView.swift | 2 +- .../CircleView/FocusedCircleView.swift | 32 ++++++---------- .../CircleView/SubCircleView.swift | 8 ++-- 8 files changed, 68 insertions(+), 43 deletions(-) rename Projects/{Features/Sources/MyPage/CirclePackView/Helper => DSKit/Sources/MyPage}/GeometryAnimatableCircle.swift (60%) diff --git a/Projects/DSKit/Project.swift b/Projects/DSKit/Project.swift index 43438302..c7599c60 100644 --- a/Projects/DSKit/Project.swift +++ b/Projects/DSKit/Project.swift @@ -11,7 +11,8 @@ import ProjectDescriptionHelpers let project = Project.makeModule( name: "DSKit", internalDependencies: [ - .Core + .Core, + .Domain ], hasResource: true, resourceSynthesizers: [ diff --git a/Projects/DSKit/Sources/MyPage/CircleContentView.swift b/Projects/DSKit/Sources/MyPage/CircleContentView.swift index c0375c98..b308638b 100644 --- a/Projects/DSKit/Sources/MyPage/CircleContentView.swift +++ b/Projects/DSKit/Sources/MyPage/CircleContentView.swift @@ -10,10 +10,20 @@ import Domain import SwiftUI public struct CircleContentView: View { + var showSubText: Bool + private let namespace: Namespace.ID private let metadata: CircleMetadata - public init(metadata: CircleMetadata) { + public init(namespace: Namespace.ID, metadata: CircleMetadata, showSubText: Bool) { + self.namespace = namespace self.metadata = metadata + self.showSubText = showSubText + } + + public init(namespace: Namespace.ID, metadata: CircleMetadata) { + self.namespace = namespace + self.metadata = metadata + self.showSubText = true } public var body: some View { @@ -22,15 +32,26 @@ public struct CircleContentView: View { .resizable() .frame(width: 48, height: 48) .scaledToFit() - - VStack(spacing: 0) { - Text(metadata.keyword) - .font(.Keyme.body3Semibold) - - Text(String(format: "%.1f", metadata.score)) - .font(.Score.mypage) + .matchedGeometryEffect(id: contentIconEffectID, in: namespace) + + if showSubText { + VStack(spacing: 0) { + Text(metadata.keyword) + .font(.Keyme.body3Semibold) + + Text(String(format: "%.1f", metadata.score)) + .font(.Score.mypage) + } + .matchedGeometryEffect(id: contentTextEffectID, in: namespace) + .transition(.opacity) } } .foregroundColor(.white) } } + +extension CircleContentView: GeometryAnimatableCircle { + public var id: String { + metadata.id.uuidString + } +} diff --git a/Projects/Features/Sources/MyPage/CirclePackView/Helper/GeometryAnimatableCircle.swift b/Projects/DSKit/Sources/MyPage/GeometryAnimatableCircle.swift similarity index 60% rename from Projects/Features/Sources/MyPage/CirclePackView/Helper/GeometryAnimatableCircle.swift rename to Projects/DSKit/Sources/MyPage/GeometryAnimatableCircle.swift index 6296966a..094049e5 100644 --- a/Projects/Features/Sources/MyPage/CirclePackView/Helper/GeometryAnimatableCircle.swift +++ b/Projects/DSKit/Sources/MyPage/GeometryAnimatableCircle.swift @@ -6,18 +6,13 @@ // Copyright © 2023 team.humanwave. All rights reserved. // -import Domain import SwiftUI -protocol GeometryAnimatableCircle { - var circleData: CircleData { get } +public protocol GeometryAnimatableCircle { + var id: String { get } } -extension GeometryAnimatableCircle { - var id: String { - circleData.id.uuidString - } - +public extension GeometryAnimatableCircle { var innerCircleEffectID: String { id + "innerCircle" } @@ -29,4 +24,12 @@ extension GeometryAnimatableCircle { var contentEffectID: String { id + "content" } + + var contentIconEffectID: String { + id + "contentIcon" + } + + var contentTextEffectID: String { + id + "contentText" + } } diff --git a/Projects/Domain/Sources/Model/CirclePack/CircleData.swift b/Projects/Domain/Sources/Model/CirclePack/CircleData.swift index 2d56b4f5..59783fe6 100644 --- a/Projects/Domain/Sources/Model/CirclePack/CircleData.swift +++ b/Projects/Domain/Sources/Model/CirclePack/CircleData.swift @@ -9,10 +9,9 @@ import SwiftUI import Foundation -public struct CircleData: Identifiable { +public struct CircleData { public let isEmptyCircle: Bool - public let id = UUID() public let color: Color public let xPoint: CGFloat public let yPoint: CGFloat @@ -57,3 +56,9 @@ extension CircleData: Equatable { lhs.id == rhs.id } } + +extension CircleData: Identifiable { + public var id: UUID { + metadata.id + } +} diff --git a/Projects/Domain/Sources/Model/CirclePack/CircleMetadata.swift b/Projects/Domain/Sources/Model/CirclePack/CircleMetadata.swift index 93f5fcca..6d9e42bb 100644 --- a/Projects/Domain/Sources/Model/CirclePack/CircleMetadata.swift +++ b/Projects/Domain/Sources/Model/CirclePack/CircleMetadata.swift @@ -10,6 +10,7 @@ import SwiftUI import Foundation public struct CircleMetadata { + public let id = UUID() public let icon: Image public let keyword: String public let score: Float diff --git a/Projects/Features/Sources/MyPage/CirclePackView/CircleView/CirclePackView.swift b/Projects/Features/Sources/MyPage/CirclePackView/CircleView/CirclePackView.swift index d88ea33c..367cf364 100644 --- a/Projects/Features/Sources/MyPage/CirclePackView/CircleView/CirclePackView.swift +++ b/Projects/Features/Sources/MyPage/CirclePackView/CircleView/CirclePackView.swift @@ -252,7 +252,7 @@ private extension CirclePackView { private extension CirclePackView { // 테스트하고프면 https://www.cssportal.com/css-cubic-bezier-generator/ var customInteractiveSpringAnimation: Animation { - .timingCurve(0.175, 0.885, 0.32, 1.05, duration: 0.5) // 0.5 + .timingCurve(0.175, 0.885, 0.32, 1.05, duration: 3) // 0.5 } func onDragChanged(_ value: DragGesture.Value) { diff --git a/Projects/Features/Sources/MyPage/CirclePackView/CircleView/FocusedCircleView.swift b/Projects/Features/Sources/MyPage/CirclePackView/CircleView/FocusedCircleView.swift index f71c210b..5481bbd4 100644 --- a/Projects/Features/Sources/MyPage/CirclePackView/CircleView/FocusedCircleView.swift +++ b/Projects/Features/Sources/MyPage/CirclePackView/CircleView/FocusedCircleView.swift @@ -34,7 +34,6 @@ struct FocusedCircleView: View { private let option: FocusedCircleViewOption private let namespace: Namespace.ID - private let id: String private let shrinkageDistance: CGFloat private let maxShrinkageDistance: CGFloat @@ -57,9 +56,7 @@ struct FocusedCircleView: View { circleData: CircleData ) { self.option = option - self.namespace = namespace - self.id = circleData.id.uuidString self.shrinkageDistance = shrinkageDistance self.maxShrinkageDistance = maxShrinkageDistance @@ -129,12 +126,8 @@ struct FocusedCircleView: View { } extension FocusedCircleView: GeometryAnimatableCircle { - var icon: Image { - Image("") - } - - var character: String { - "RRR" + var id: String { + circleData.id.uuidString } func startAnimation() { @@ -222,17 +215,16 @@ extension FocusedCircleView: GeometryAnimatableCircle { } var circleContentView: some View { - VStack { - Image(systemName: "person.fill") - .foregroundColor(isPressed ? .white : .black.opacity(0.4)) - Text("인싸력") - .foregroundColor(isPressed ? .white : .black.opacity(0.4)) - .font(.system(size: 14)) - } - .matchedGeometryEffect( - id: contentEffectID, - in: namespace, - anchor: .center) +// circleData.metadata.icon +// .resizable() +// .frame(width: 100, height: 100) +// .foregroundColor(.white) +// .scaledToFit() + CircleContentView(namespace: namespace, metadata: circleData.metadata, showSubText: false) + .matchedGeometryEffect( + id: contentEffectID, + in: namespace, + anchor: .center) } var innerCircleEffectID: String { diff --git a/Projects/Features/Sources/MyPage/CirclePackView/CircleView/SubCircleView.swift b/Projects/Features/Sources/MyPage/CirclePackView/CircleView/SubCircleView.swift index 36d276d8..d216b455 100644 --- a/Projects/Features/Sources/MyPage/CirclePackView/CircleView/SubCircleView.swift +++ b/Projects/Features/Sources/MyPage/CirclePackView/CircleView/SubCircleView.swift @@ -14,7 +14,6 @@ import Foundation /// 마이페이지 들어가자 마자 나오는 CirclePack 그래프를 이루는 원을 만들 때 쓰는 뷰 struct SubCircleView: View { private let namespace: Namespace.ID - private let id: String private let outboundLength: CGFloat let circleData: CircleData @@ -31,7 +30,6 @@ struct SubCircleView: View { onTapGesture: @escaping () -> Void ) { self.namespace = namespace - self.id = circleData.id.uuidString self.outboundLength = outboundLength self.circleData = circleData @@ -61,6 +59,10 @@ struct SubCircleView: View { } extension SubCircleView: GeometryAnimatableCircle { + var id: String { + circleData.id.uuidString + } + var designedCircleShape: some View { Circle() .fill(circleData.color) @@ -80,7 +82,7 @@ extension SubCircleView: GeometryAnimatableCircle { } var circleContentView: some View { - CircleContentView(metadata: circleData.metadata) + CircleContentView(namespace: namespace, metadata: circleData.metadata) .matchedGeometryEffect( id: contentEffectID, in: namespace,