From 7e0dd40b13de74630ce916ff888e31e9d22df54e Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 15 Oct 2024 20:08:58 +0900 Subject: [PATCH 01/71] =?UTF-8?q?[Add,=20Feat]=20-=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=EB=B7=B0=20=EC=97=B0=EC=8A=B5=20=EB=B7=B0=EC=BB=A8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/PractScrollViewController.swift | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 35-seminar/Presentation/Week2/PractScrollViewController.swift diff --git a/35-seminar/Presentation/Week2/PractScrollViewController.swift b/35-seminar/Presentation/Week2/PractScrollViewController.swift new file mode 100644 index 0000000..b486730 --- /dev/null +++ b/35-seminar/Presentation/Week2/PractScrollViewController.swift @@ -0,0 +1,74 @@ +// +// PractScrollViewController.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit +import SnapKit + +class PractScrollViewController: UIViewController { + + // MARK: - Properties + private let scrollView = UIScrollView() + private var contentView = UIView() + private var redView = UIView() + private let yellowView = UIView() + private let greenView = UIView() + + // MARK: - Methods + override func viewDidLoad() { + super.viewDidLoad() + setUI() + setHierarchy() + setConstraints() + } + + func setUI() { + view.backgroundColor = .lightGray + redView.backgroundColor = .red + yellowView.backgroundColor = .yellow + greenView.backgroundColor = .green + } + + func setHierarchy() { + view.addSubview(scrollView) + scrollView.addSubview(contentView) + + [redView, yellowView, greenView].forEach { + contentView.addSubview($0) + } + } + + func setConstraints() { + scrollView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + contentView.snp.makeConstraints { + $0.edges.equalToSuperview() + $0.width.equalToSuperview() + $0.height.greaterThanOrEqualToSuperview().priority(.low) + } + + redView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(200) + } + + yellowView.snp.makeConstraints { + $0.top.equalTo(redView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(200) + } + + greenView.snp.makeConstraints { + $0.top.equalTo(yellowView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(200) +// $0.bottom.equalToSuperview() + } + } +} From faa8441d40969be351b1a310ad6d75c6899d14ea Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 15 Oct 2024 20:09:55 +0900 Subject: [PATCH 02/71] =?UTF-8?q?[Add,=20Feat]=20-=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=EB=B7=B0=20=EC=97=B0=EC=8A=B5=20=EB=B7=B0=EC=BB=A8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index fd7a0b9..ba1224d 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -17,6 +17,7 @@ 1590A6432CBE6C6A00FB32AE /* Week1DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A62E2CBE6C6A00FB32AE /* Week1DetailViewController.swift */; }; 1590A6442CBE6C6A00FB32AE /* Week1MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6302CBE6C6A00FB32AE /* Week1MainView.swift */; }; 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6312CBE6C6A00FB32AE /* Week1MainViewController.swift */; }; + 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -31,6 +32,7 @@ 1590A6352CBE6C6A00FB32AE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1590A6372CBE6C6A00FB32AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1590A6382CBE6C6A00FB32AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PractScrollViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -103,6 +105,7 @@ children = ( 1590A6392CBE6C6A00FB32AE /* LaunchScreen.storyboard */, 1590A6332CBE6C6A00FB32AE /* Week1 */, + 1590A69F2CBE719000FB32AE /* Week2 */, ); path = Presentation; sourceTree = ""; @@ -126,6 +129,14 @@ path = Resource; sourceTree = ""; }; + 1590A69F2CBE719000FB32AE /* Week2 */ = { + isa = PBXGroup; + children = ( + 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */, + ); + path = Week2; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -204,6 +215,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */, 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */, 1590A6412CBE6C6A00FB32AE /* SceneDelegate.swift in Sources */, 1590A6422CBE6C6A00FB32AE /* Week1DetailView.swift in Sources */, From 83f92eebbc03648b205046584366851f7c131627 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 15 Oct 2024 20:10:25 +0900 Subject: [PATCH 03/71] =?UTF-8?q?[Feat]=20-=20rootVC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Application/SceneDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/35-seminar/Application/SceneDelegate.swift b/35-seminar/Application/SceneDelegate.swift index 879c12b..63df8df 100644 --- a/35-seminar/Application/SceneDelegate.swift +++ b/35-seminar/Application/SceneDelegate.swift @@ -14,7 +14,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(windowScene: windowScene) - let navigationController = UINavigationController(rootViewController: Week1MainViewController()) + let navigationController = UINavigationController(rootViewController: PractScrollViewController()) self.window?.rootViewController = navigationController self.window?.makeKeyAndVisible() } From 7d62a2a4c4ec39a2a55bfa148c4d6d05a669fce3 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 15 Oct 2024 20:37:43 +0900 Subject: [PATCH 04/71] =?UTF-8?q?[Add]=20#6=20-=20AppDetail=20View,=20VC?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 8 +++++ .../Presentation/Week2/AppDetailView.swift | 20 +++++++++++++ .../Week2/AppDetailViewController.swift | 29 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 35-seminar/Presentation/Week2/AppDetailView.swift create mode 100644 35-seminar/Presentation/Week2/AppDetailViewController.swift diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index ba1224d..16bdeb5 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ 1590A6442CBE6C6A00FB32AE /* Week1MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6302CBE6C6A00FB32AE /* Week1MainView.swift */; }; 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6312CBE6C6A00FB32AE /* Week1MainViewController.swift */; }; 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */; }; + 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */; }; + 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -33,6 +35,8 @@ 1590A6372CBE6C6A00FB32AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1590A6382CBE6C6A00FB32AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PractScrollViewController.swift; sourceTree = ""; }; + 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailViewController.swift; sourceTree = ""; }; + 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -133,6 +137,8 @@ isa = PBXGroup; children = ( 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */, + 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */, + 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */, ); path = Week2; sourceTree = ""; @@ -218,6 +224,8 @@ 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */, 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */, 1590A6412CBE6C6A00FB32AE /* SceneDelegate.swift in Sources */, + 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */, + 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */, 1590A6422CBE6C6A00FB32AE /* Week1DetailView.swift in Sources */, 1590A6432CBE6C6A00FB32AE /* Week1DetailViewController.swift in Sources */, 1590A6442CBE6C6A00FB32AE /* Week1MainView.swift in Sources */, diff --git a/35-seminar/Presentation/Week2/AppDetailView.swift b/35-seminar/Presentation/Week2/AppDetailView.swift new file mode 100644 index 0000000..7acc10f --- /dev/null +++ b/35-seminar/Presentation/Week2/AppDetailView.swift @@ -0,0 +1,20 @@ +// +// AppDetailView.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit + +class AppDetailView: UIView { + + /* + // Only override draw() if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func draw(_ rect: CGRect) { + // Drawing code + } + */ + +} diff --git a/35-seminar/Presentation/Week2/AppDetailViewController.swift b/35-seminar/Presentation/Week2/AppDetailViewController.swift new file mode 100644 index 0000000..0a5249a --- /dev/null +++ b/35-seminar/Presentation/Week2/AppDetailViewController.swift @@ -0,0 +1,29 @@ +// +// AppDetailViewController.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit + +class AppDetailViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} From c8b4493240bfc0ff3dd44640ed402c267dc5221f Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 18:27:53 +0900 Subject: [PATCH 05/71] =?UTF-8?q?[Feat]=20#6=20-=20=EC=8B=9C=EC=9E=91=20VC?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Application/SceneDelegate.swift | 2 +- .../Week2/AppDetailViewController.swift | 29 ---- .../Week2/Extensions/UILabel+Extension.swift | 8 ++ .../Week2/Presentations/AppDetailView.swift | 134 ++++++++++++++++++ .../AppDetailViewController.swift | 23 +++ .../Week2/Reusables/BorderView.swift | 20 +++ .../ContentLabel.swift} | 4 +- .../PractScrollViewController.swift | 0 .../Week2/Reusables/StarStackView.swift | 20 +++ .../Week2/Reusables/SubtitleLabel.swift | 20 +++ .../Week2/Reusables/TitleLabel.swift | 20 +++ .../toss_icon.imageset/Contents.json | 12 ++ .../toss_icon.imageset/toss_icon.png | Bin 0 -> 22151 bytes 13 files changed, 260 insertions(+), 32 deletions(-) delete mode 100644 35-seminar/Presentation/Week2/AppDetailViewController.swift create mode 100644 35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift create mode 100644 35-seminar/Presentation/Week2/Presentations/AppDetailView.swift create mode 100644 35-seminar/Presentation/Week2/Presentations/AppDetailViewController.swift create mode 100644 35-seminar/Presentation/Week2/Reusables/BorderView.swift rename 35-seminar/Presentation/Week2/{AppDetailView.swift => Reusables/ContentLabel.swift} (84%) rename 35-seminar/Presentation/Week2/{ => Reusables}/PractScrollViewController.swift (100%) create mode 100644 35-seminar/Presentation/Week2/Reusables/StarStackView.swift create mode 100644 35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift create mode 100644 35-seminar/Presentation/Week2/Reusables/TitleLabel.swift create mode 100644 35-seminar/Resource/Assets.xcassets/toss_icon.imageset/Contents.json create mode 100644 35-seminar/Resource/Assets.xcassets/toss_icon.imageset/toss_icon.png diff --git a/35-seminar/Application/SceneDelegate.swift b/35-seminar/Application/SceneDelegate.swift index 63df8df..694f996 100644 --- a/35-seminar/Application/SceneDelegate.swift +++ b/35-seminar/Application/SceneDelegate.swift @@ -14,7 +14,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(windowScene: windowScene) - let navigationController = UINavigationController(rootViewController: PractScrollViewController()) + let navigationController = UINavigationController(rootViewController: AppDetailViewController()) self.window?.rootViewController = navigationController self.window?.makeKeyAndVisible() } diff --git a/35-seminar/Presentation/Week2/AppDetailViewController.swift b/35-seminar/Presentation/Week2/AppDetailViewController.swift deleted file mode 100644 index 0a5249a..0000000 --- a/35-seminar/Presentation/Week2/AppDetailViewController.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// AppDetailViewController.swift -// 35-seminar -// -// Created by 김유림 on 10/15/24. -// - -import UIKit - -class AppDetailViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - -} diff --git a/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift new file mode 100644 index 0000000..374e035 --- /dev/null +++ b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift @@ -0,0 +1,8 @@ +// +// UILabel+Extension.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import Foundation diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift new file mode 100644 index 0000000..e47d153 --- /dev/null +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -0,0 +1,134 @@ +// +// AppDetailView.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit + +class AppDetailView: UIView { + + // MARK: - Properties + private let scrollView = UIScrollView() + private var contentView = UIView() + private let borderView = UIView() + + // 타이틀뷰 + private let titleView = UIView() + private let iconImageView = UIImageView() + private let titleLabel = TitleLabel() + private let subtitleLabel = SubtitleLabel() + private let openButton = UIButton() + private let shareButton = UIButton() + + // 요약뷰 + private let summaryView = UIView() + private let summaryRatingSummaryView = UIView() + private let summaryRatingTitleLabel = SubtitleLabel() + private let summaryRatingAverageLabel = SubtitleLabel() + private let summaryRatingStarImageStackView = UIStackView() + private let summaryRatingStarImageView = UIImageView() + private let summaryPrizeSummaryView = UIView() + private let summaryPrizeTitleLabel = SubtitleLabel() + private let summaryPrizeContentImageView = UIImageView() + private let summaryPrizeSubtitleLabel = SubtitleLabel() + private let summaryAgeSummaryView = UIView() + private let summaryAgeTitleLabel = SubtitleLabel() + private let summaryAgeContentLabel = SubtitleLabel() + private let summaryAgeSubtitleLabel = SubtitleLabel() + + // 업데이트뷰 + private let updateView = UIView() + private let updateTitleLabel = TitleLabel() + private let updateSubtitleLabel = SubtitleLabel() + private let updateContentLabel = ContentLabel() + + // 미리보기뷰 + private let previewView = UIView() + private let previewTitleLabel = TitleLabel() + private let previewImageView = UIImageView() + + // 앱 설명 뷰 + private let descriptionView = UIView() + private let descriptionLabel = ContentLabel() + private let descriptionMoreButton = UIButton() + + // 평가 및 리뷰 뷰 + private let ratingView = UIView() + private let ratingTitleLabel = TitleLabel() + private let ratingAverageLabel = TitleLabel() + private let ratingSubtitleLabel = SubtitleLabel() + private let ratingTabToRateLabel = SubtitleLabel() + // TODO: Star rating stack + + private let reviewView = UIView() + private let reviewTitleLabel = ContentLabel() + private let reviewStarStackView = UIStackView() + private let reviewStarImageView = UIImageView() + private let reviewDateLabel = SubtitleLabel() + private let reviewAuthorLabel = SubtitleLabel() + private let reviewContentLabel = ContentLabel() + private let reviewDeveloperTitleLabel = ContentLabel() + private let reviewDeveloperContentLabel = ContentLabel() + private let reviewMoreButton = UIButton() + + + + // MARK: - Methods + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + setHierarchy() + setConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setUI() { + self.backgroundColor = .systemBackground + borderView.backgroundColor = .lightGray + } + + func setHierarchy() { + self.addSubview(scrollView) + scrollView.addSubview(contentView) + + [titleView, summaryView, updateView].forEach { + contentView.addSubview($0) + } + } + + func setConstraints() { + scrollView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + contentView.snp.makeConstraints { + $0.edges.equalToSuperview() + $0.width.equalToSuperview() + $0.height.greaterThanOrEqualToSuperview().priority(.low) + } + + titleView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(300) + } + + summaryView.snp.makeConstraints { + $0.top.equalTo(titleView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(300) + } + + updateView.snp.makeConstraints { + $0.top.equalTo(summaryView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(300) + $0.bottom.equalToSuperview() + } + } +} diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailViewController.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailViewController.swift new file mode 100644 index 0000000..d8f6d05 --- /dev/null +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailViewController.swift @@ -0,0 +1,23 @@ +// +// AppDetailViewController.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit + +class AppDetailViewController: UIViewController { + + // MARK: - Properties + private let appDetailView = AppDetailView() + + // MARK: - Methods + override func loadView() { + view = appDetailView + } + + override func viewDidLoad() { + super.viewDidLoad() + } +} diff --git a/35-seminar/Presentation/Week2/Reusables/BorderView.swift b/35-seminar/Presentation/Week2/Reusables/BorderView.swift new file mode 100644 index 0000000..5465850 --- /dev/null +++ b/35-seminar/Presentation/Week2/Reusables/BorderView.swift @@ -0,0 +1,20 @@ +// +// BorderView.swift +// 35-seminar +// +// Created by 김유림 on 10/22/24. +// + +import UIKit + +class BorderView: UIView { + + /* + // Only override draw() if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func draw(_ rect: CGRect) { + // Drawing code + } + */ + +} diff --git a/35-seminar/Presentation/Week2/AppDetailView.swift b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift similarity index 84% rename from 35-seminar/Presentation/Week2/AppDetailView.swift rename to 35-seminar/Presentation/Week2/Reusables/ContentLabel.swift index 7acc10f..76b9943 100644 --- a/35-seminar/Presentation/Week2/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift @@ -1,5 +1,5 @@ // -// AppDetailView.swift +// ContentLabel.swift // 35-seminar // // Created by 김유림 on 10/15/24. @@ -7,7 +7,7 @@ import UIKit -class AppDetailView: UIView { +class ContentLabel: UILabel { /* // Only override draw() if you perform custom drawing. diff --git a/35-seminar/Presentation/Week2/PractScrollViewController.swift b/35-seminar/Presentation/Week2/Reusables/PractScrollViewController.swift similarity index 100% rename from 35-seminar/Presentation/Week2/PractScrollViewController.swift rename to 35-seminar/Presentation/Week2/Reusables/PractScrollViewController.swift diff --git a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift new file mode 100644 index 0000000..b785cd2 --- /dev/null +++ b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift @@ -0,0 +1,20 @@ +// +// StarStackView.swift +// 35-seminar +// +// Created by 김유림 on 10/22/24. +// + +import UIKit + +class StarStackView: UIStackView { + + /* + // Only override draw() if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func draw(_ rect: CGRect) { + // Drawing code + } + */ + +} diff --git a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift new file mode 100644 index 0000000..c393662 --- /dev/null +++ b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift @@ -0,0 +1,20 @@ +// +// SubtitleLabel.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit + +class SubtitleLabel: UILabel { + + /* + // Only override draw() if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func draw(_ rect: CGRect) { + // Drawing code + } + */ + +} diff --git a/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift new file mode 100644 index 0000000..cb34b02 --- /dev/null +++ b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift @@ -0,0 +1,20 @@ +// +// TitleLabel.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit + +class TitleLabel: UILabel { + + /* + // Only override draw() if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func draw(_ rect: CGRect) { + // Drawing code + } + */ + +} diff --git a/35-seminar/Resource/Assets.xcassets/toss_icon.imageset/Contents.json b/35-seminar/Resource/Assets.xcassets/toss_icon.imageset/Contents.json new file mode 100644 index 0000000..493227c --- /dev/null +++ b/35-seminar/Resource/Assets.xcassets/toss_icon.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "toss_icon.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/35-seminar/Resource/Assets.xcassets/toss_icon.imageset/toss_icon.png b/35-seminar/Resource/Assets.xcassets/toss_icon.imageset/toss_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5e38ae055c645425c33b129691fce805a577b2 GIT binary patch literal 22151 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 Date: Tue, 22 Oct 2024 18:28:44 +0900 Subject: [PATCH 06/71] [Add] #6 - UILabel Extension --- .../Week2/Extensions/UILabel+Extension.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift index 374e035..1fd8d81 100644 --- a/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift @@ -5,4 +5,14 @@ // Created by 김유림 on 10/15/24. // -import Foundation +import UIKit + +extension UILabel { + func configureLabel(alignment: NSTextAlignment = .left, color: UIColor = .label, size: CGFloat, weight: UIFont.Weight, text: String? = nil, numberOfLines: Int = 1) { + self.textAlignment = alignment + self.textColor = color + self.font = .systemFont(ofSize: size, weight: weight) + self.text = text + self.numberOfLines = numberOfLines + } +} From 00d03f94ddb901122958efa015a677353116a3e1 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 18:29:28 +0900 Subject: [PATCH 07/71] [Add] #6 - (Reusables) BorderView --- .../Week2/Reusables/BorderView.swift | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/BorderView.swift b/35-seminar/Presentation/Week2/Reusables/BorderView.swift index 5465850..4dbd36f 100644 --- a/35-seminar/Presentation/Week2/Reusables/BorderView.swift +++ b/35-seminar/Presentation/Week2/Reusables/BorderView.swift @@ -6,15 +6,41 @@ // import UIKit +import SnapKit class BorderView: UIView { - - /* - // Only override draw() if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - override func draw(_ rect: CGRect) { - // Drawing code + + // MARK: - Properties + let grayLine = UIView() + + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + setHierarchy() + setConstraints() + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUI() { + self.backgroundColor = .none + grayLine.backgroundColor = .separator + } + + private func setHierarchy() { + self.addSubview(grayLine) + } + + private func setConstraints() { + self.snp.makeConstraints { + $0.height.equalTo(1) + } + + grayLine.snp.makeConstraints { + $0.height.equalTo(1) + $0.horizontalEdges.equalToSuperview().inset(20) + } } - */ - } From 1ee012b96c3543879e916317ef9255e6ab242340 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 18:30:46 +0900 Subject: [PATCH 08/71] [Add] #6 - (Reusables) TitleLabel, SubtitleLabel, ContentLabel --- .../Week2/Reusables/ContentLabel.swift | 16 ++++++++-------- .../Week2/Reusables/SubtitleLabel.swift | 16 ++++++++-------- .../Week2/Reusables/TitleLabel.swift | 16 ++++++++-------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift index 76b9943..16e4f22 100644 --- a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift @@ -8,13 +8,13 @@ import UIKit class ContentLabel: UILabel { - - /* - // Only override draw() if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - override func draw(_ rect: CGRect) { - // Drawing code + + override init(frame: CGRect) { + super.init(frame: frame) + self.configureLabel(color: .label, size: 16, weight: .regular) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") } - */ - } diff --git a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift index c393662..283402e 100644 --- a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift @@ -8,13 +8,13 @@ import UIKit class SubtitleLabel: UILabel { - - /* - // Only override draw() if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - override func draw(_ rect: CGRect) { - // Drawing code + + override init(frame: CGRect) { + super.init(frame: frame) + self.configureLabel(color: .secondaryLabel, size: 16, weight: .regular) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") } - */ - } diff --git a/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift index cb34b02..fb076b5 100644 --- a/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift @@ -8,13 +8,13 @@ import UIKit class TitleLabel: UILabel { - - /* - // Only override draw() if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - override func draw(_ rect: CGRect) { - // Drawing code + + override init(frame: CGRect) { + super.init(frame: frame) + self.configureLabel(size: 22, weight: .semibold) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") } - */ - } From 6ccf3c2807eeb627a88a565db3d8d12c8d88e516 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 18:44:30 +0900 Subject: [PATCH 09/71] =?UTF-8?q?[Design]=20#6=20-=20Border=20=EC=83=89,?= =?UTF-8?q?=20=EB=91=90=EA=BB=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/Reusables/BorderView.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/BorderView.swift b/35-seminar/Presentation/Week2/Reusables/BorderView.swift index 4dbd36f..c272ca1 100644 --- a/35-seminar/Presentation/Week2/Reusables/BorderView.swift +++ b/35-seminar/Presentation/Week2/Reusables/BorderView.swift @@ -26,7 +26,7 @@ class BorderView: UIView { private func setUI() { self.backgroundColor = .none - grayLine.backgroundColor = .separator + grayLine.backgroundColor = .systemGray5 } private func setHierarchy() { @@ -35,11 +35,11 @@ class BorderView: UIView { private func setConstraints() { self.snp.makeConstraints { - $0.height.equalTo(1) + $0.height.equalTo(0.5) } grayLine.snp.makeConstraints { - $0.height.equalTo(1) + $0.height.equalTo(0.5) $0.horizontalEdges.equalToSuperview().inset(20) } } From cb3c075290030cc7bb33ab3c278d0115c4293899 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 18:46:23 +0900 Subject: [PATCH 10/71] =?UTF-8?q?[Move,=20Add]=20-=20=EC=84=B8=EB=AF=B8?= =?UTF-8?q?=EB=82=98=20=ED=8C=8C=EC=9D=BC=20=EA=B7=B8=EB=A3=B9=ED=99=94,?= =?UTF-8?q?=20Reusable=20Components=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 60 +++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index 16bdeb5..6a1a036 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -9,6 +9,10 @@ /* Begin PBXBuildFile section */ 152919B72CB10FE200438E2B /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 152919B62CB10FE200438E2B /* SnapKit */; }; 1570C8CD2CB43A4C00A43324 /* .gitignore in Resources */ = {isa = PBXBuildFile; fileRef = 1570C8CC2CB43A4C00A43324 /* .gitignore */; }; + 157119D62CBE962F00362252 /* TitleLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157119D52CBE962F00362252 /* TitleLabel.swift */; }; + 157119D82CBE965700362252 /* SubtitleLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157119D72CBE965700362252 /* SubtitleLabel.swift */; }; + 157119DA2CBE96BB00362252 /* ContentLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157119D92CBE96BB00362252 /* ContentLabel.swift */; }; + 157119DD2CBE96F500362252 /* UILabel+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157119DC2CBE96F500362252 /* UILabel+Extension.swift */; }; 1590A63D2CBE6C6A00FB32AE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1590A6352CBE6C6A00FB32AE /* Assets.xcassets */; }; 1590A63F2CBE6C6A00FB32AE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1590A6392CBE6C6A00FB32AE /* LaunchScreen.storyboard */; }; 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A62A2CBE6C6A00FB32AE /* AppDelegate.swift */; }; @@ -20,11 +24,17 @@ 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */; }; 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */; }; 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */; }; + 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */; }; + 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 152919992CB101BA00438E2B /* 35-seminar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "35-seminar.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 1570C8CC2CB43A4C00A43324 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; + 157119D52CBE962F00362252 /* TitleLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleLabel.swift; sourceTree = ""; }; + 157119D72CBE965700362252 /* SubtitleLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubtitleLabel.swift; sourceTree = ""; }; + 157119D92CBE96BB00362252 /* ContentLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentLabel.swift; sourceTree = ""; }; + 157119DC2CBE96F500362252 /* UILabel+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+Extension.swift"; sourceTree = ""; }; 1590A62A2CBE6C6A00FB32AE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1590A62B2CBE6C6A00FB32AE /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 1590A62D2CBE6C6A00FB32AE /* Week1DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Week1DetailView.swift; sourceTree = ""; }; @@ -37,6 +47,8 @@ 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PractScrollViewController.swift; sourceTree = ""; }; 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailViewController.swift; sourceTree = ""; }; 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailView.swift; sourceTree = ""; }; + 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarStackView.swift; sourceTree = ""; }; + 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -68,6 +80,26 @@ name = Products; sourceTree = ""; }; + 157119D42CBE8FB700362252 /* Reusables */ = { + isa = PBXGroup; + children = ( + 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */, + 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */, + 157119D52CBE962F00362252 /* TitleLabel.swift */, + 157119D72CBE965700362252 /* SubtitleLabel.swift */, + 157119D92CBE96BB00362252 /* ContentLabel.swift */, + ); + path = Reusables; + sourceTree = ""; + }; + 157119DB2CBE96DE00362252 /* Extensions */ = { + isa = PBXGroup; + children = ( + 157119DC2CBE96F500362252 /* UILabel+Extension.swift */, + ); + path = Extensions; + sourceTree = ""; + }; 1590A62C2CBE6C6A00FB32AE /* Application */ = { isa = PBXGroup; children = ( @@ -136,11 +168,29 @@ 1590A69F2CBE719000FB32AE /* Week2 */ = { isa = PBXGroup; children = ( - 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */, + 157119DB2CBE96DE00362252 /* Extensions */, + 157119D42CBE8FB700362252 /* Reusables */, + 15F4FD092CC7405800C99A20 /* Practice */, + 15F4FD082CC73E1D00C99A20 /* Presentations */, + ); + path = Week2; + sourceTree = ""; + }; + 15F4FD082CC73E1D00C99A20 /* Presentations */ = { + isa = PBXGroup; + children = ( 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */, 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */, ); - path = Week2; + path = Presentations; + sourceTree = ""; + }; + 15F4FD092CC7405800C99A20 /* Practice */ = { + isa = PBXGroup; + children = ( + 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */, + ); + path = Practice; sourceTree = ""; }; /* End PBXGroup section */ @@ -222,13 +272,19 @@ buildActionMask = 2147483647; files = ( 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */, + 157119D82CBE965700362252 /* SubtitleLabel.swift in Sources */, 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */, 1590A6412CBE6C6A00FB32AE /* SceneDelegate.swift in Sources */, + 157119D62CBE962F00362252 /* TitleLabel.swift in Sources */, 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */, 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */, 1590A6422CBE6C6A00FB32AE /* Week1DetailView.swift in Sources */, + 157119DA2CBE96BB00362252 /* ContentLabel.swift in Sources */, 1590A6432CBE6C6A00FB32AE /* Week1DetailViewController.swift in Sources */, 1590A6442CBE6C6A00FB32AE /* Week1MainView.swift in Sources */, + 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */, + 157119DD2CBE96F500362252 /* UILabel+Extension.swift in Sources */, + 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */, 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 329956e993cdf949e977137acdcf227966f5e5f2 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 18:51:39 +0900 Subject: [PATCH 11/71] =?UTF-8?q?[Move]=20-=20Practice=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Practice/PractScrollViewController.swift | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 35-seminar/Presentation/Week2/Practice/PractScrollViewController.swift diff --git a/35-seminar/Presentation/Week2/Practice/PractScrollViewController.swift b/35-seminar/Presentation/Week2/Practice/PractScrollViewController.swift new file mode 100644 index 0000000..b486730 --- /dev/null +++ b/35-seminar/Presentation/Week2/Practice/PractScrollViewController.swift @@ -0,0 +1,74 @@ +// +// PractScrollViewController.swift +// 35-seminar +// +// Created by 김유림 on 10/15/24. +// + +import UIKit +import SnapKit + +class PractScrollViewController: UIViewController { + + // MARK: - Properties + private let scrollView = UIScrollView() + private var contentView = UIView() + private var redView = UIView() + private let yellowView = UIView() + private let greenView = UIView() + + // MARK: - Methods + override func viewDidLoad() { + super.viewDidLoad() + setUI() + setHierarchy() + setConstraints() + } + + func setUI() { + view.backgroundColor = .lightGray + redView.backgroundColor = .red + yellowView.backgroundColor = .yellow + greenView.backgroundColor = .green + } + + func setHierarchy() { + view.addSubview(scrollView) + scrollView.addSubview(contentView) + + [redView, yellowView, greenView].forEach { + contentView.addSubview($0) + } + } + + func setConstraints() { + scrollView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + contentView.snp.makeConstraints { + $0.edges.equalToSuperview() + $0.width.equalToSuperview() + $0.height.greaterThanOrEqualToSuperview().priority(.low) + } + + redView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(200) + } + + yellowView.snp.makeConstraints { + $0.top.equalTo(redView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(200) + } + + greenView.snp.makeConstraints { + $0.top.equalTo(yellowView.snp.bottom) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(200) +// $0.bottom.equalToSuperview() + } + } +} From 3e14b8c809c3e97e4ac9db04f6dd7fef10eb6939 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 19:27:25 +0900 Subject: [PATCH 12/71] =?UTF-8?q?[Design]=20#6=20-=20titleView=20UI=20?= =?UTF-8?q?=EA=B5=AC=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Presentations/AppDetailView.swift | 196 ++++++++++++++---- 1 file changed, 158 insertions(+), 38 deletions(-) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index e47d153..6b215ff 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -11,8 +11,7 @@ class AppDetailView: UIView { // MARK: - Properties private let scrollView = UIScrollView() - private var contentView = UIView() - private let borderView = UIView() + private var contentView = UIStackView() // 타이틀뷰 private let titleView = UIView() @@ -24,16 +23,18 @@ class AppDetailView: UIView { // 요약뷰 private let summaryView = UIView() - private let summaryRatingSummaryView = UIView() + // 1번칸 + private let summaryRatingView = UIView() private let summaryRatingTitleLabel = SubtitleLabel() private let summaryRatingAverageLabel = SubtitleLabel() - private let summaryRatingStarImageStackView = UIStackView() - private let summaryRatingStarImageView = UIImageView() - private let summaryPrizeSummaryView = UIView() + private let summaryRatingStarStackView = StarStackView() + // 2번칸 + private let summaryPrizeView = UIView() private let summaryPrizeTitleLabel = SubtitleLabel() private let summaryPrizeContentImageView = UIImageView() private let summaryPrizeSubtitleLabel = SubtitleLabel() - private let summaryAgeSummaryView = UIView() + //3번칸 + private let summaryAgeView = UIView() private let summaryAgeTitleLabel = SubtitleLabel() private let summaryAgeContentLabel = SubtitleLabel() private let summaryAgeSubtitleLabel = SubtitleLabel() @@ -54,24 +55,25 @@ class AppDetailView: UIView { private let descriptionLabel = ContentLabel() private let descriptionMoreButton = UIButton() - // 평가 및 리뷰 뷰 - private let ratingView = UIView() - private let ratingTitleLabel = TitleLabel() - private let ratingAverageLabel = TitleLabel() - private let ratingSubtitleLabel = SubtitleLabel() - private let ratingTabToRateLabel = SubtitleLabel() - // TODO: Star rating stack + // 피드백 요약 뷰 + private let feedbackSummaryView = UIView() + private let feedbackSummaryTitleLabel = TitleLabel() + private let feedbackSummaryAverageLabel = TitleLabel() + private let feedbackSummarySubtitleLabel = SubtitleLabel() + private let feedbackSummaryTabToRateLabel = SubtitleLabel() + let feedbackSummaryStarStackView = UIStackView() - private let reviewView = UIView() - private let reviewTitleLabel = ContentLabel() - private let reviewStarStackView = UIStackView() - private let reviewStarImageView = UIImageView() - private let reviewDateLabel = SubtitleLabel() - private let reviewAuthorLabel = SubtitleLabel() - private let reviewContentLabel = ContentLabel() - private let reviewDeveloperTitleLabel = ContentLabel() - private let reviewDeveloperContentLabel = ContentLabel() - private let reviewMoreButton = UIButton() + // 피드백 뷰 + private let feedbackView = UIView() + private let feedbackGuideLabel = ContentLabel() + private let feedbackStarStackView = UIStackView() + private let feedbackStarImageView = UIImageView() + private let feedbackDateLabel = SubtitleLabel() + private let feedbackAuthorLabel = SubtitleLabel() + private let feedbackContentLabel = ContentLabel() + private let feedbackDeveloperTitleLabel = ContentLabel() + private let feedbackDeveloperContentLabel = ContentLabel() + private let feedbackMoreButton = UIButton() @@ -87,21 +89,109 @@ class AppDetailView: UIView { fatalError("init(coder:) has not been implemented") } - func setUI() { + // MARK: UI + private func setUI() { self.backgroundColor = .systemBackground - borderView.backgroundColor = .lightGray + contentView.axis = .vertical + contentView.spacing = 10 + setTitleViewUI() } - func setHierarchy() { + private func setTitleViewUI() { + iconImageView.image = UIImage(named: "toss_icon") + iconImageView.clipsToBounds = true + iconImageView.layer.cornerRadius = 20 + iconImageView.layer.borderColor = UIColor.systemGray5.cgColor + iconImageView.layer.borderWidth = 1 + + titleLabel.text = "토스" + subtitleLabel.text = "금융이 쉬워진다" + + var openButtonConfig = UIButton.Configuration.filled() + openButtonConfig.buttonSize = .mini + openButtonConfig.cornerStyle = .capsule + let attributes: [NSAttributedString.Key: Any] = [.font : UIFont.systemFont(ofSize: 17, weight: .bold)] + let attributedTitle = NSAttributedString(string: "열기", attributes: attributes) + openButton.configuration = openButtonConfig + openButton.setAttributedTitle(attributedTitle, for: .normal) + + let symbolConfig = UIImage.SymbolConfiguration(weight: .medium) + var shareButtonConfig = UIButton.Configuration.plain() + shareButtonConfig.image = UIImage(systemName: "square.and.arrow.up", + withConfiguration: symbolConfig) + shareButton.configuration = shareButtonConfig + } + + // TODO: summary view + + // TODO: update view + + // TODO: previewView + + // TODO: descriptionView + + // TODO: feedbackSummaryView + + // TODO: feedbackView + + + // MARK: - Hierarchy + private func setHierarchy() { self.addSubview(scrollView) scrollView.addSubview(contentView) - [titleView, summaryView, updateView].forEach { - contentView.addSubview($0) + [titleView, summaryView, updateView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { + contentView.addArrangedSubview($0) + contentView.addArrangedSubview(BorderView()) + } + + setTitleViewHierarchy() + setSummaryViewHierarchy() + setUpdateViewHierarchy() + + } + + private func setTitleViewHierarchy() { + [iconImageView, titleLabel, subtitleLabel, openButton, shareButton].forEach { + titleView.addSubview($0) } } - func setConstraints() { + private func setSummaryViewHierarchy() { + [summaryRatingView, summaryPrizeView, summaryAgeView].forEach { + summaryView.addSubview($0) + } + + [summaryRatingTitleLabel, summaryRatingAverageLabel, summaryRatingStarStackView].forEach { + summaryRatingView.addSubview($0) + } + + [summaryPrizeTitleLabel, summaryPrizeContentImageView, summaryPrizeSubtitleLabel].forEach { + summaryPrizeView.addSubview($0) + } + + [summaryAgeTitleLabel, summaryAgeContentLabel, summaryAgeSubtitleLabel].forEach { + summaryAgeView.addSubview($0) + } + } + + private func setUpdateViewHierarchy() { + [updateTitleLabel, updateSubtitleLabel, updateContentLabel].forEach { + updateView.addSubview($0) + } + } + + // TODO: previewView + + // TODO: descriptionView + + // TODO: feedbackSummaryView + + // TODO: feedbackView + + + // MARK: - Constraints + private func setConstraints() { scrollView.snp.makeConstraints { $0.edges.equalToSuperview() } @@ -112,23 +202,53 @@ class AppDetailView: UIView { $0.height.greaterThanOrEqualToSuperview().priority(.low) } - titleView.snp.makeConstraints { + // 타이틀뷰 + iconImageView.snp.makeConstraints { + $0.size.equalTo(128) + $0.leading.equalToSuperview().inset(20) $0.top.equalToSuperview() - $0.horizontalEdges.equalToSuperview() - $0.height.equalTo(300) + $0.bottom.equalToSuperview().inset(10) } + titleLabel.snp.makeConstraints { + $0.leading.equalTo(iconImageView.snp.trailing).offset(16) + $0.top.equalTo(iconImageView) + } + + subtitleLabel.snp.makeConstraints { + $0.leading.equalTo(titleLabel) + $0.top.equalTo(titleLabel.snp.bottom).offset(5) + } + + openButton.snp.makeConstraints { + $0.leading.equalTo(titleLabel) + $0.bottom.equalTo(iconImageView) + $0.width.equalTo(76) + $0.height.equalTo(34) + } + + shareButton.snp.makeConstraints { + $0.trailing.equalToSuperview().inset(20) + $0.bottom.equalTo(iconImageView) + + } + + // TODO: SummaryView summaryView.snp.makeConstraints { - $0.top.equalTo(titleView.snp.bottom) - $0.horizontalEdges.equalToSuperview() $0.height.equalTo(300) } + // TODO: UpdateView updateView.snp.makeConstraints { - $0.top.equalTo(summaryView.snp.bottom) - $0.horizontalEdges.equalToSuperview() $0.height.equalTo(300) - $0.bottom.equalToSuperview() } + + // TODO: previewView + + // TODO: descriptionView + + // TODO: feedbackSummaryView + + // TODO: feedbackView } } From 8be6990e386836e6eee1d30667917978361beb7a Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 23:04:16 +0900 Subject: [PATCH 13/71] =?UTF-8?q?[Feat]=20#6=20-=20binding,=20=EB=B7=B0=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=B0=A9=EC=8B=9D=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 --- .../Week2/Reusables/StarStackView.swift | 84 +++++++++++++++++-- 1 file changed, 76 insertions(+), 8 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift index b785cd2..56c97a1 100644 --- a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift +++ b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift @@ -7,14 +7,82 @@ import UIKit -class StarStackView: UIStackView { +enum StarColor { + case tint + case gray + case yellow +} - /* - // Only override draw() if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - override func draw(_ rect: CGRect) { - // Drawing code +class StarStackView: UIStackView { + + // MARK: - Properties + private var starCount: Int = 0 + private var starColor: StarColor = .tint + + private let starImageView1 = UIImageView() + private let starImageView2 = UIImageView() + private let starImageView3 = UIImageView() + private let starImageView4 = UIImageView() + private let starImageView5 = UIImageView() + + private let starEmptyImage = UIImage(systemName: "star") + private let starFilledImage = UIImage(systemName:"star.fill") + + // MARK: - Methods + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + setHierarchy() + updateStarImage() + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUI() { + self.axis = .horizontal + self.distribution = .fillEqually + + [starImageView1 + ,starImageView2 + ,starImageView3 + ,starImageView4 + ,starImageView5].forEach { $0.contentMode = .scaleAspectFit } + } + + private func setHierarchy() { + [starImageView1 + ,starImageView2 + ,starImageView3 + ,starImageView4 + ,starImageView5].forEach { self.addArrangedSubview($0) } + } + + private func updateStarImage() { + for (index, view) in self.arrangedSubviews.enumerated() { + guard let imageView = view as? UIImageView else { continue } + + if index < starCount { + imageView.image = starFilledImage + } else { + imageView.image = starEmptyImage + } + + switch starColor { + case .tint: + imageView.tintColor = .tintColor + case .gray: + imageView.tintColor = .secondaryLabel + case .yellow: + imageView.tintColor = .yellow + } + } + } + + func bind(_ starCount: Int, _ color: StarColor) { + self.starCount = starCount + self.starColor = color + updateStarImage() } - */ - } From 8d874ec76f5dd2bd930d5fbb781b3d690a071f90 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Tue, 22 Oct 2024 23:07:22 +0900 Subject: [PATCH 14/71] =?UTF-8?q?[Design]=20#6=20-=20=EA=B8=80=EC=94=A8?= =?UTF-8?q?=ED=81=AC=EA=B8=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift | 2 +- 35-seminar/Presentation/Week2/Reusables/TitleLabel.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift index 283402e..869d8f7 100644 --- a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift @@ -11,7 +11,7 @@ class SubtitleLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .secondaryLabel, size: 16, weight: .regular) + self.configureLabel(color: .secondaryLabel, size: 17, weight: .regular) } required init?(coder: NSCoder) { diff --git a/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift index fb076b5..2f3ad59 100644 --- a/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift @@ -11,7 +11,7 @@ class TitleLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(size: 22, weight: .semibold) + self.configureLabel(size: 24, weight: .semibold) } required init?(coder: NSCoder) { From 25af2b569f411bf6a8c0f905738c981c989704d5 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 16:16:05 +0900 Subject: [PATCH 15/71] =?UTF-8?q?[Move]=20-=20Practice=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reusables/PractScrollViewController.swift | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 35-seminar/Presentation/Week2/Reusables/PractScrollViewController.swift diff --git a/35-seminar/Presentation/Week2/Reusables/PractScrollViewController.swift b/35-seminar/Presentation/Week2/Reusables/PractScrollViewController.swift deleted file mode 100644 index b486730..0000000 --- a/35-seminar/Presentation/Week2/Reusables/PractScrollViewController.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// PractScrollViewController.swift -// 35-seminar -// -// Created by 김유림 on 10/15/24. -// - -import UIKit -import SnapKit - -class PractScrollViewController: UIViewController { - - // MARK: - Properties - private let scrollView = UIScrollView() - private var contentView = UIView() - private var redView = UIView() - private let yellowView = UIView() - private let greenView = UIView() - - // MARK: - Methods - override func viewDidLoad() { - super.viewDidLoad() - setUI() - setHierarchy() - setConstraints() - } - - func setUI() { - view.backgroundColor = .lightGray - redView.backgroundColor = .red - yellowView.backgroundColor = .yellow - greenView.backgroundColor = .green - } - - func setHierarchy() { - view.addSubview(scrollView) - scrollView.addSubview(contentView) - - [redView, yellowView, greenView].forEach { - contentView.addSubview($0) - } - } - - func setConstraints() { - scrollView.snp.makeConstraints { - $0.edges.equalToSuperview() - } - - contentView.snp.makeConstraints { - $0.edges.equalToSuperview() - $0.width.equalToSuperview() - $0.height.greaterThanOrEqualToSuperview().priority(.low) - } - - redView.snp.makeConstraints { - $0.top.equalToSuperview() - $0.horizontalEdges.equalToSuperview() - $0.height.equalTo(200) - } - - yellowView.snp.makeConstraints { - $0.top.equalTo(redView.snp.bottom) - $0.horizontalEdges.equalToSuperview() - $0.height.equalTo(200) - } - - greenView.snp.makeConstraints { - $0.top.equalTo(yellowView.snp.bottom) - $0.horizontalEdges.equalToSuperview() - $0.height.equalTo(200) -// $0.bottom.equalToSuperview() - } - } -} From 5b8baf6bf90647f89f6735b925d410d9384a34dd Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 17:45:50 +0900 Subject: [PATCH 16/71] ... --- 35-seminar/Presentation/Week2/Reusables/BorderView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/35-seminar/Presentation/Week2/Reusables/BorderView.swift b/35-seminar/Presentation/Week2/Reusables/BorderView.swift index c272ca1..7e1c9f1 100644 --- a/35-seminar/Presentation/Week2/Reusables/BorderView.swift +++ b/35-seminar/Presentation/Week2/Reusables/BorderView.swift @@ -41,6 +41,7 @@ class BorderView: UIView { grayLine.snp.makeConstraints { $0.height.equalTo(0.5) $0.horizontalEdges.equalToSuperview().inset(20) + $0.verticalEdges.equalToSuperview() } } } From e5b04f7e1886a1b22212704a85b122a12788a390 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 17:48:08 +0900 Subject: [PATCH 17/71] =?UTF-8?q?[Feat]=20#6=20-=20SummaryView=20=EC=99=84?= =?UTF-8?q?=EC=84=B1=20(+=20=EC=8A=A4=ED=81=AC=EB=A1=A4=EB=B7=B0=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=9E=88=EC=9C=BC=EB=82=98=20=ED=95=B4=EA=B2=B0=20=EB=AA=BB?= =?UTF-8?q?=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Presentations/AppDetailView.swift | 194 ++++++++++++++---- 1 file changed, 156 insertions(+), 38 deletions(-) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index 6b215ff..9520273 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -6,12 +6,13 @@ // import UIKit +import SnapKit class AppDetailView: UIView { // MARK: - Properties private let scrollView = UIScrollView() - private var contentView = UIStackView() + private var contentStackView = UIStackView() // 타이틀뷰 private let titleView = UIView() @@ -22,21 +23,24 @@ class AppDetailView: UIView { private let shareButton = UIButton() // 요약뷰 - private let summaryView = UIView() + private let summaryStackView = UIStackView() + private let verticalBorderView1 = UIView() + private let verticalBorderView2 = UIView() + // 1번칸 - private let summaryRatingView = UIView() + private let summaryRatingStackView = UIStackView() private let summaryRatingTitleLabel = SubtitleLabel() private let summaryRatingAverageLabel = SubtitleLabel() private let summaryRatingStarStackView = StarStackView() // 2번칸 - private let summaryPrizeView = UIView() + private let summaryPrizeStackView = UIStackView() private let summaryPrizeTitleLabel = SubtitleLabel() private let summaryPrizeContentImageView = UIImageView() private let summaryPrizeSubtitleLabel = SubtitleLabel() //3번칸 - private let summaryAgeView = UIView() + private let summaryAgeStackView = UIStackView() private let summaryAgeTitleLabel = SubtitleLabel() - private let summaryAgeContentLabel = SubtitleLabel() + private let summaryAgeLimitLabel = SubtitleLabel() private let summaryAgeSubtitleLabel = SubtitleLabel() // 업데이트뷰 @@ -75,8 +79,6 @@ class AppDetailView: UIView { private let feedbackDeveloperContentLabel = ContentLabel() private let feedbackMoreButton = UIButton() - - // MARK: - Methods override init(frame: CGRect) { super.init(frame: frame) @@ -92,9 +94,11 @@ class AppDetailView: UIView { // MARK: UI private func setUI() { self.backgroundColor = .systemBackground - contentView.axis = .vertical - contentView.spacing = 10 + contentStackView.axis = .vertical + contentStackView.spacing = 10 + setTitleViewUI() + setSummaryViewUI() } private func setTitleViewUI() { @@ -123,6 +127,48 @@ class AppDetailView: UIView { } // TODO: summary view + private func setSummaryViewUI() { + summaryStackView.axis = .horizontal + summaryStackView.alignment = .center + + [verticalBorderView1, verticalBorderView2].forEach { + $0.backgroundColor = .systemGray5 + } + + [summaryRatingStackView, summaryPrizeStackView, summaryAgeStackView].forEach { + $0.axis = .vertical + $0.alignment = .center + } + + [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { + $0.configureLabel(color: .secondaryLabel, size: 13, weight: .regular) + $0.textAlignment = .center + } + + [summaryRatingAverageLabel, summaryAgeLimitLabel].forEach { + $0.configureLabel(color: .secondaryLabel, size: 24, weight: .bold) + $0.textAlignment = .center + } + + [summaryPrizeSubtitleLabel, summaryAgeSubtitleLabel].forEach { + $0.configureLabel(color: .secondaryLabel, size: 15, weight: .regular) + $0.textAlignment = .center + } + + summaryRatingTitleLabel.text = "8.4만개의 평가" + summaryRatingAverageLabel.text = "4.4" + summaryRatingStarStackView.bind(4, .gray) + + summaryPrizeTitleLabel.text = "수상" + summaryPrizeContentImageView.image = UIImage(systemName: "person") + summaryPrizeContentImageView.tintColor = .secondaryLabel + summaryPrizeContentImageView.contentMode = .scaleAspectFit + summaryPrizeSubtitleLabel.text = "앱" + + summaryAgeTitleLabel.text = "연령" + summaryAgeLimitLabel.text = "4+" + summaryAgeSubtitleLabel.text = "세" + } // TODO: update view @@ -137,20 +183,32 @@ class AppDetailView: UIView { // MARK: - Hierarchy private func setHierarchy() { - self.addSubview(scrollView) - scrollView.addSubview(contentView) - - [titleView, summaryView, updateView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { - contentView.addArrangedSubview($0) - contentView.addArrangedSubview(BorderView()) - } - + setBaseHierarchy() setTitleViewHierarchy() setSummaryViewHierarchy() setUpdateViewHierarchy() } + private func setBaseHierarchy() { + self.addSubview(scrollView) + scrollView.addSubview(contentStackView) + + [titleView, summaryStackView, updateView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { + let borderView: UIView = { + let view = UIView() + view.backgroundColor = .systemGray5 + return view + }() + contentStackView.addArrangedSubview($0) + contentStackView.addArrangedSubview(borderView) + borderView.snp.updateConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(0.5) + } + } + } + private func setTitleViewHierarchy() { [iconImageView, titleLabel, subtitleLabel, openButton, shareButton].forEach { titleView.addSubview($0) @@ -158,20 +216,20 @@ class AppDetailView: UIView { } private func setSummaryViewHierarchy() { - [summaryRatingView, summaryPrizeView, summaryAgeView].forEach { - summaryView.addSubview($0) + [summaryRatingStackView, verticalBorderView1, summaryPrizeStackView, verticalBorderView2, summaryAgeStackView].forEach { + summaryStackView.addArrangedSubview($0) } [summaryRatingTitleLabel, summaryRatingAverageLabel, summaryRatingStarStackView].forEach { - summaryRatingView.addSubview($0) + summaryRatingStackView.addArrangedSubview($0) } [summaryPrizeTitleLabel, summaryPrizeContentImageView, summaryPrizeSubtitleLabel].forEach { - summaryPrizeView.addSubview($0) + summaryPrizeStackView.addArrangedSubview($0) } - [summaryAgeTitleLabel, summaryAgeContentLabel, summaryAgeSubtitleLabel].forEach { - summaryAgeView.addSubview($0) + [summaryAgeTitleLabel, summaryAgeLimitLabel, summaryAgeSubtitleLabel].forEach { + summaryAgeStackView.addArrangedSubview($0) } } @@ -192,17 +250,37 @@ class AppDetailView: UIView { // MARK: - Constraints private func setConstraints() { + setBaseConstraints() + setTitleViewConstraints() + setSummaryViewConstraints() + setUpdateViewConstraints() + + // TODO: previewView + + // TODO: descriptionView + + // TODO: feedbackSummaryView + + // TODO: feedbackView + } + + private func setBaseConstraints() { scrollView.snp.makeConstraints { - $0.edges.equalToSuperview() + $0.edges.equalTo(self.safeAreaLayoutGuide) } - contentView.snp.makeConstraints { + contentStackView.snp.makeConstraints { $0.edges.equalToSuperview() $0.width.equalToSuperview() $0.height.greaterThanOrEqualToSuperview().priority(.low) } + } + + private func setTitleViewConstraints() { + titleView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } - // 타이틀뷰 iconImageView.snp.makeConstraints { $0.size.equalTo(128) $0.leading.equalToSuperview().inset(20) @@ -230,25 +308,65 @@ class AppDetailView: UIView { shareButton.snp.makeConstraints { $0.trailing.equalToSuperview().inset(20) $0.bottom.equalTo(iconImageView) - + } + } + + private func setSummaryViewConstraints() { + summaryStackView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(84) } - // TODO: SummaryView - summaryView.snp.makeConstraints { - $0.height.equalTo(300) + [verticalBorderView1, verticalBorderView2].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(40) + $0.width.equalTo(0.5) + } } - // TODO: UpdateView - updateView.snp.makeConstraints { - $0.height.equalTo(300) + summaryRatingStackView.snp.makeConstraints { + $0.height.equalToSuperview() + $0.width.equalTo(summaryPrizeStackView) + $0.width.equalTo(summaryAgeStackView) } - // TODO: previewView + summaryPrizeStackView.snp.makeConstraints { + $0.height.equalToSuperview() + $0.width.equalTo(summaryRatingStackView) + $0.width.equalTo(summaryAgeStackView) + } - // TODO: descriptionView + summaryAgeStackView.snp.makeConstraints { + $0.height.equalToSuperview() + $0.width.equalTo(summaryPrizeStackView) + $0.width.equalTo(summaryRatingStackView) + } - // TODO: feedbackSummaryView + [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(30) + } + } - // TODO: feedbackView + [summaryRatingAverageLabel, summaryPrizeContentImageView, summaryAgeLimitLabel].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(30) + $0.horizontalEdges.equalToSuperview() + } + } + + [summaryRatingStarStackView, summaryPrizeSubtitleLabel, summaryAgeSubtitleLabel].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(24) + $0.horizontalEdges.equalToSuperview().inset(16) + } + } + } + + private func setUpdateViewConstraints() { + updateView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(1000) + } } } From 38591f7eca02a977d71507d02a6eb6a158437ed9 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 18:47:47 +0900 Subject: [PATCH 18/71] =?UTF-8?q?[Add,=20Feat]=20#6=20-=20(UIButton+Extens?= =?UTF-8?q?ion)=20Configure=20=ED=95=A8=EC=88=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 4 ++ .../Week2/Extensions/UIButton+Extension.swift | 59 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index 6a1a036..0baee9f 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */; }; 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */; }; 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */; }; + 15EC30532CCA434700A0480B /* UIButton+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30522CCA434700A0480B /* UIButton+Extension.swift */; }; 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */; }; 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */; }; /* End PBXBuildFile section */ @@ -47,6 +48,7 @@ 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PractScrollViewController.swift; sourceTree = ""; }; 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailViewController.swift; sourceTree = ""; }; 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailView.swift; sourceTree = ""; }; + 15EC30522CCA434700A0480B /* UIButton+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Extension.swift"; sourceTree = ""; }; 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarStackView.swift; sourceTree = ""; }; 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -96,6 +98,7 @@ isa = PBXGroup; children = ( 157119DC2CBE96F500362252 /* UILabel+Extension.swift */, + 15EC30522CCA434700A0480B /* UIButton+Extension.swift */, ); path = Extensions; sourceTree = ""; @@ -276,6 +279,7 @@ 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */, 1590A6412CBE6C6A00FB32AE /* SceneDelegate.swift in Sources */, 157119D62CBE962F00362252 /* TitleLabel.swift in Sources */, + 15EC30532CCA434700A0480B /* UIButton+Extension.swift in Sources */, 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */, 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */, 1590A6422CBE6C6A00FB32AE /* Week1DetailView.swift in Sources */, diff --git a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift new file mode 100644 index 0000000..453357a --- /dev/null +++ b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift @@ -0,0 +1,59 @@ +// +// UIButton+Extension.swift +// 35-seminar +// +// Created by 김유림 on 10/24/24. +// + +import UIKit + +enum ConfigurationType { + case plain + case filled +} + +extension UIButton { + func configureButton(configType: ConfigurationType = .plain, + title: String? = nil, + fontSize: CGFloat = 17, + fontWeight: UIFont.Weight = .regular, + image: UIImage? = nil, + symbolWeight: UIImage.SymbolWeight = .unspecified, + cornerStyle: UIButton.Configuration.CornerStyle? = nil, + foregroundColor: UIColor = .tintColor, + backgroundColor: UIColor = .clear, + for state: UIControl.State = .normal) { + + var config = { + switch configType { + case .plain: + return UIButton.Configuration.plain() + case .filled: + return UIButton.Configuration.filled() + } + }() + + print(config) + + if let title = title { + let attributes: [NSAttributedString.Key: Any] = [.font : UIFont.systemFont(ofSize: fontSize, weight: fontWeight)] + let attributedTitle = NSAttributedString(string: title, attributes: attributes) + self.setAttributedTitle(attributedTitle, for: state) + } + + if let image = image { + let symbolConfig = UIImage.SymbolConfiguration(weight: symbolWeight) + image.withConfiguration(symbolConfig) + config.image = image + } + + if let cornerStyle = cornerStyle { + config.cornerStyle = cornerStyle + } + + config.baseForegroundColor = foregroundColor + config.baseBackgroundColor = backgroundColor + + self.configuration = config + } +} From 8caf1f2dfdd1368df5f342e32445807905b45994 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 19:01:15 +0900 Subject: [PATCH 19/71] =?UTF-8?q?[Fix]=20#6=20-=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20configuration=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 2 +- .../Presentation/Week2/Extensions/UIButton+Extension.swift | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index 0baee9f..7e3cacc 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -97,8 +97,8 @@ 157119DB2CBE96DE00362252 /* Extensions */ = { isa = PBXGroup; children = ( - 157119DC2CBE96F500362252 /* UILabel+Extension.swift */, 15EC30522CCA434700A0480B /* UIButton+Extension.swift */, + 157119DC2CBE96F500362252 /* UILabel+Extension.swift */, ); path = Extensions; sourceTree = ""; diff --git a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift index 453357a..9dc8ddc 100644 --- a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift @@ -33,8 +33,6 @@ extension UIButton { } }() - print(config) - if let title = title { let attributes: [NSAttributedString.Key: Any] = [.font : UIFont.systemFont(ofSize: fontSize, weight: fontWeight)] let attributedTitle = NSAttributedString(string: title, attributes: attributes) @@ -43,8 +41,8 @@ extension UIButton { if let image = image { let symbolConfig = UIImage.SymbolConfiguration(weight: symbolWeight) - image.withConfiguration(symbolConfig) - config.image = image + let configuredImage = image.withConfiguration(symbolConfig) + config.image = configuredImage } if let cornerStyle = cornerStyle { From 4fac0e4591fd57865d444a945a26de60a9b72a5a Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 19:37:29 +0900 Subject: [PATCH 20/71] =?UTF-8?q?[Feat]=20#6=20-=20configureButton=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(contentInsets)=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/Extensions/UIButton+Extension.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift index 9dc8ddc..ef08147 100644 --- a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift @@ -22,6 +22,7 @@ extension UIButton { cornerStyle: UIButton.Configuration.CornerStyle? = nil, foregroundColor: UIColor = .tintColor, backgroundColor: UIColor = .clear, + removeContentInsets: Bool = false, for state: UIControl.State = .normal) { var config = { @@ -52,6 +53,10 @@ extension UIButton { config.baseForegroundColor = foregroundColor config.baseBackgroundColor = backgroundColor + if removeContentInsets { + config.contentInsets = .zero + } + self.configuration = config } } From 13c9c30b554ff1ab89b188424103444627b24f93 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 19:38:19 +0900 Subject: [PATCH 21/71] =?UTF-8?q?[Feat]=20#6=20-=20numberOfLines=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=EA=B0=92=200=EC=9C=BC=EB=A1=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/Reusables/ContentLabel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift index 16e4f22..a822311 100644 --- a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift @@ -11,7 +11,7 @@ class ContentLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .label, size: 16, weight: .regular) + self.configureLabel(color: .label, size: 16, weight: .light, numberOfLines: 0) } required init?(coder: NSCoder) { From c79137146b3b335ddb527aa5c1364810d5ad0a1e Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 19:43:29 +0900 Subject: [PATCH 22/71] =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EA=B8=80=EC=94=A8?= =?UTF-8?q?=ED=81=AC=EA=B8=B0=20=EB=B3=80=EA=B2=BD=2016=20->=2017?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/Reusables/ContentLabel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift index a822311..9a42480 100644 --- a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift @@ -11,7 +11,7 @@ class ContentLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .label, size: 16, weight: .light, numberOfLines: 0) + self.configureLabel(color: .label, size: 17, weight: .light, numberOfLines: 0) } required init?(coder: NSCoder) { From 0d0c69c5a9b6f95419923c67c0bfa6a0aff94107 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 20:09:44 +0900 Subject: [PATCH 23/71] =?UTF-8?q?[Feat]=20#6=20-=20setLineSpacing=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/Extensions/UILabel+Extension.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift index 1fd8d81..2f6bc8c 100644 --- a/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift @@ -15,4 +15,10 @@ extension UILabel { self.text = text self.numberOfLines = numberOfLines } + + func setLineSpacing(_ lineSpacing: CGFloat) { + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = lineSpacing + self.attributedText = NSAttributedString(string: self.text!, attributes: [.paragraphStyle: paragraphStyle]) + } } From 8675705294d014fb036207832f72362dac96c59b Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 20:10:47 +0900 Subject: [PATCH 24/71] =?UTF-8?q?[Feat]=20#6=20-=20=EC=83=89=EC=83=81?= =?UTF-8?q?=EB=A7=8C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Reusables/BorderView.swift | 28 +------------------ 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/BorderView.swift b/35-seminar/Presentation/Week2/Reusables/BorderView.swift index 7e1c9f1..8a01785 100644 --- a/35-seminar/Presentation/Week2/Reusables/BorderView.swift +++ b/35-seminar/Presentation/Week2/Reusables/BorderView.swift @@ -10,38 +10,12 @@ import SnapKit class BorderView: UIView { - // MARK: - Properties - let grayLine = UIView() - override init(frame: CGRect) { super.init(frame: frame) - setUI() - setHierarchy() - setConstraints() + self.backgroundColor = .systemGray5 } required init(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - private func setUI() { - self.backgroundColor = .none - grayLine.backgroundColor = .systemGray5 - } - - private func setHierarchy() { - self.addSubview(grayLine) - } - - private func setConstraints() { - self.snp.makeConstraints { - $0.height.equalTo(0.5) - } - - grayLine.snp.makeConstraints { - $0.height.equalTo(0.5) - $0.horizontalEdges.equalToSuperview().inset(20) - $0.verticalEdges.equalToSuperview() - } - } } From 35a5bbd21077c332744fd508f50cc89c147cb33c Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 20:11:15 +0900 Subject: [PATCH 25/71] =?UTF-8?q?=EA=B8=80=EC=94=A8=20=ED=81=AC=EA=B8=B0?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift index 869d8f7..7a63bca 100644 --- a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift @@ -11,7 +11,7 @@ class SubtitleLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .secondaryLabel, size: 17, weight: .regular) + self.configureLabel(color: .secondaryLabel, size: 17, weight: .light) } required init?(coder: NSCoder) { From ab70aa145d7dc0cbdcb27da5cf3de8eb492196fc Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 20:11:47 +0900 Subject: [PATCH 26/71] =?UTF-8?q?[Feat]=20#6=20-=20updateView=20=EC=99=84?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Presentations/AppDetailView.swift | 156 ++++++++++++------ 1 file changed, 107 insertions(+), 49 deletions(-) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index 9520273..94b1025 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -24,8 +24,8 @@ class AppDetailView: UIView { // 요약뷰 private let summaryStackView = UIStackView() - private let verticalBorderView1 = UIView() - private let verticalBorderView2 = UIView() + private let verticalBorderView1 = BorderView() + private let verticalBorderView2 = BorderView() // 1번칸 private let summaryRatingStackView = UIStackView() @@ -48,6 +48,8 @@ class AppDetailView: UIView { private let updateTitleLabel = TitleLabel() private let updateSubtitleLabel = SubtitleLabel() private let updateContentLabel = ContentLabel() + private let updateRecordButton = UIButton() + private let updateDateLabel = SubtitleLabel() // 미리보기뷰 private let previewView = UIView() @@ -99,6 +101,11 @@ class AppDetailView: UIView { setTitleViewUI() setSummaryViewUI() + setUpdateViewUI() + setPreviewViewUI() + setDescriptionViewUI() + setFeedbackSummaryViewUI() + setFeedbackViewUI() } private func setTitleViewUI() { @@ -109,32 +116,25 @@ class AppDetailView: UIView { iconImageView.layer.borderWidth = 1 titleLabel.text = "토스" + subtitleLabel.text = "금융이 쉬워진다" - var openButtonConfig = UIButton.Configuration.filled() - openButtonConfig.buttonSize = .mini - openButtonConfig.cornerStyle = .capsule - let attributes: [NSAttributedString.Key: Any] = [.font : UIFont.systemFont(ofSize: 17, weight: .bold)] - let attributedTitle = NSAttributedString(string: "열기", attributes: attributes) - openButton.configuration = openButtonConfig - openButton.setAttributedTitle(attributedTitle, for: .normal) - - let symbolConfig = UIImage.SymbolConfiguration(weight: .medium) - var shareButtonConfig = UIButton.Configuration.plain() - shareButtonConfig.image = UIImage(systemName: "square.and.arrow.up", - withConfiguration: symbolConfig) - shareButton.configuration = shareButtonConfig + openButton.configureButton(configType: .filled, + title: "열기", + fontWeight: .bold, + cornerStyle: .capsule, + foregroundColor: .white, + backgroundColor: .tintColor) + + shareButton.configureButton(image: UIImage(systemName: "square.and.arrow.up"), + symbolWeight: .semibold) + } - // TODO: summary view private func setSummaryViewUI() { summaryStackView.axis = .horizontal summaryStackView.alignment = .center - [verticalBorderView1, verticalBorderView2].forEach { - $0.backgroundColor = .systemGray5 - } - [summaryRatingStackView, summaryPrizeStackView, summaryAgeStackView].forEach { $0.axis = .vertical $0.alignment = .center @@ -170,16 +170,31 @@ class AppDetailView: UIView { summaryAgeSubtitleLabel.text = "세" } - // TODO: update view - - // TODO: previewView + private func setUpdateViewUI() { + updateTitleLabel.text = "새로운 소식" + updateSubtitleLabel.text = "버전 5.185.0" + updateContentLabel.text = "• 구석구석 숨어있던 버그들을 잡았어요. 또 다른 버그가 나타나면 토스 고객센터를 찾아주세요. 늘 열려있답니다. 365일 24시간 언제든지요." + updateContentLabel.setLineSpacing(8) + + updateRecordButton.configureButton(title: "버전 기록", fontSize: 19, fontWeight: .light, removeContentInsets: true) + updateDateLabel.text = "3시간 전" + } - // TODO: descriptionView + private func setPreviewViewUI() { + + } - // TODO: feedbackSummaryView + private func setDescriptionViewUI() { + + } - // TODO: feedbackView + private func setFeedbackSummaryViewUI() { + + } + private func setFeedbackViewUI() { + + } // MARK: - Hierarchy private func setHierarchy() { @@ -187,7 +202,10 @@ class AppDetailView: UIView { setTitleViewHierarchy() setSummaryViewHierarchy() setUpdateViewHierarchy() - + setPreviewViewHierarchy() + setDescriptionViewHierarchy() + setFeedbackSummaryViewHierarchy() + setFeedbackViewHierarchy() } private func setBaseHierarchy() { @@ -195,14 +213,10 @@ class AppDetailView: UIView { scrollView.addSubview(contentStackView) [titleView, summaryStackView, updateView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { - let borderView: UIView = { - let view = UIView() - view.backgroundColor = .systemGray5 - return view - }() + let borderView = BorderView() contentStackView.addArrangedSubview($0) contentStackView.addArrangedSubview(borderView) - borderView.snp.updateConstraints { + borderView.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(20) $0.height.equalTo(0.5) } @@ -234,19 +248,26 @@ class AppDetailView: UIView { } private func setUpdateViewHierarchy() { - [updateTitleLabel, updateSubtitleLabel, updateContentLabel].forEach { + [updateTitleLabel, updateSubtitleLabel, updateContentLabel, updateRecordButton, updateDateLabel].forEach { updateView.addSubview($0) } } - // TODO: previewView - - // TODO: descriptionView + private func setPreviewViewHierarchy() { + + } - // TODO: feedbackSummaryView + private func setDescriptionViewHierarchy() { + + } - // TODO: feedbackView + private func setFeedbackSummaryViewHierarchy() { + + } + private func setFeedbackViewHierarchy() { + + } // MARK: - Constraints private func setConstraints() { @@ -254,14 +275,10 @@ class AppDetailView: UIView { setTitleViewConstraints() setSummaryViewConstraints() setUpdateViewConstraints() - - // TODO: previewView - - // TODO: descriptionView - - // TODO: feedbackSummaryView - - // TODO: feedbackView + setPreviewViewConstraints() + setDescriptionViewConstraints() + setFeedbackSummaryViewConstraints() + setFeedbackViewConstraints() } private func setBaseConstraints() { @@ -278,7 +295,7 @@ class AppDetailView: UIView { private func setTitleViewConstraints() { titleView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) + $0.horizontalEdges.equalToSuperview() } iconImageView.snp.makeConstraints { @@ -366,7 +383,48 @@ class AppDetailView: UIView { private func setUpdateViewConstraints() { updateView.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(20) - $0.height.equalTo(1000) } + + updateTitleLabel.snp.makeConstraints { + $0.top.equalToSuperview() + $0.leading.equalToSuperview() + } + + updateSubtitleLabel.snp.makeConstraints { + $0.top.equalTo(updateTitleLabel.snp.bottom).offset(8) + $0.leading.equalTo(updateTitleLabel) + } + + updateContentLabel.snp.makeConstraints { + $0.top.equalTo(updateSubtitleLabel.snp.bottom).offset(16) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview().inset(10) + } + + updateRecordButton.snp.makeConstraints { + $0.bottom.equalTo(updateTitleLabel) + $0.trailing.equalToSuperview() + } + + updateDateLabel.snp.makeConstraints { + $0.bottom.equalTo(updateSubtitleLabel) + $0.trailing.equalToSuperview() + } + } + + private func setPreviewViewConstraints() { + + } + + private func setDescriptionViewConstraints() { + + } + + private func setFeedbackSummaryViewConstraints() { + + } + + private func setFeedbackViewConstraints() { + } } From fe53053353399dbd01e90e9c844fdd1ec981a9c9 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 20:15:29 +0900 Subject: [PATCH 27/71] =?UTF-8?q?[Add]=20#6=20-=20toss=20=EB=AF=B8?= =?UTF-8?q?=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=90=EC=85=8B=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toss_preview.imageset/Contents.json | 12 ++++++++++++ .../toss_preview.imageset/toss_preview.jpeg | Bin 0 -> 436732 bytes 2 files changed, 12 insertions(+) create mode 100644 35-seminar/Resource/Assets.xcassets/toss_preview.imageset/Contents.json create mode 100644 35-seminar/Resource/Assets.xcassets/toss_preview.imageset/toss_preview.jpeg diff --git a/35-seminar/Resource/Assets.xcassets/toss_preview.imageset/Contents.json b/35-seminar/Resource/Assets.xcassets/toss_preview.imageset/Contents.json new file mode 100644 index 0000000..67057af --- /dev/null +++ b/35-seminar/Resource/Assets.xcassets/toss_preview.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "toss_preview.jpeg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/35-seminar/Resource/Assets.xcassets/toss_preview.imageset/toss_preview.jpeg b/35-seminar/Resource/Assets.xcassets/toss_preview.imageset/toss_preview.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..988b60dfcc65b5be697ba0bde311ca4112c33a33 GIT binary patch literal 436732 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

BG)nO3e=3TjksW5w?0xyuJFbtXTF*K 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%0D>5SJPc#ukW24KAmZ^G!xeh{C*^a7e% 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 z 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 Kghq7z|C;~|EA@c@ literal 0 HcmV?d00001 From f71d19df43926e3bbad914c1558e52bf583dae37 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 23:12:20 +0900 Subject: [PATCH 28/71] =?UTF-8?q?[Feat]=20#6=20-=20previewView=20=EC=99=84?= =?UTF-8?q?=EC=84=B1=20previewImage=20=EC=9D=B8=EC=8A=A4=ED=84=B4=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=A0=20=EB=95=8C=20NSBundle?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EB=B0=9C=EC=83=9D=ED=95=A8.=20?= =?UTF-8?q?=EA=B7=B8=EB=9F=B0=EB=8D=B0=20=EC=8B=9C=EB=AE=AC=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EC=97=90=EB=8A=94=20=EC=9E=98=20=EB=B3=B4?= =?UTF-8?q?=EC=9E=84..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Presentations/AppDetailView.swift | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index 94b1025..44ea58b 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -55,6 +55,8 @@ class AppDetailView: UIView { private let previewView = UIView() private let previewTitleLabel = TitleLabel() private let previewImageView = UIImageView() + private let previewDeviceImageView = UIImageView() + private let previewDeviceLabel = SubtitleLabel() // 앱 설명 뷰 private let descriptionView = UIView() @@ -181,7 +183,19 @@ class AppDetailView: UIView { } private func setPreviewViewUI() { + previewTitleLabel.text = "미리 보기" + previewImageView.image = UIImage(named: "toss_preview") // NSBundle 오류 발생 + // NSBundle file:///Library/Developer/CoreSimulator/Volumes/iOS_22A3351/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS%2018.0.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MetalTools.framework/ principal class is nil because all fallbacks have failed + + previewImageView.contentMode = .scaleAspectFit + previewImageView.layer.cornerRadius = 20 + + let symbolConfig = UIImage.SymbolConfiguration(weight: .regular) + previewDeviceImageView.image = UIImage(systemName: "iphone", withConfiguration: symbolConfig)?.withTintColor(.secondaryLabel) + previewDeviceImageView.contentMode = .scaleAspectFit + + previewDeviceLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .semibold, text: "iPhone") } private func setDescriptionViewUI() { @@ -254,7 +268,9 @@ class AppDetailView: UIView { } private func setPreviewViewHierarchy() { - + [previewTitleLabel, previewImageView, previewDeviceImageView, previewDeviceLabel].forEach { + previewView.addSubview($0) + } } private func setDescriptionViewHierarchy() { @@ -413,7 +429,31 @@ class AppDetailView: UIView { } private func setPreviewViewConstraints() { + previewView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + previewTitleLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + previewImageView.snp.makeConstraints { + $0.top.equalTo(previewTitleLabel.snp.bottom).offset(5) + $0.centerX.equalToSuperview() + $0.height.equalTo(500) + } + + previewDeviceImageView.snp.makeConstraints { + $0.top.equalTo(previewImageView.snp.bottom).offset(10) + $0.leading.equalToSuperview() + $0.size.equalTo(22) + $0.bottom.equalToSuperview() + } + + previewDeviceLabel.snp.makeConstraints { + $0.bottom.equalTo(previewDeviceImageView) + $0.leading.equalTo(previewDeviceImageView.snp.trailing).offset(5) + } } private func setDescriptionViewConstraints() { From afcc9f3707c2322697b7bad052f5a43d89d22432 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Thu, 24 Oct 2024 23:22:45 +0900 Subject: [PATCH 29/71] =?UTF-8?q?[Feat]=20#6=20-=20previewViewImageView=20?= =?UTF-8?q?=ED=85=8C=EB=91=90=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/Presentations/AppDetailView.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index 44ea58b..65ba608 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -186,10 +186,11 @@ class AppDetailView: UIView { previewTitleLabel.text = "미리 보기" previewImageView.image = UIImage(named: "toss_preview") // NSBundle 오류 발생 - // NSBundle file:///Library/Developer/CoreSimulator/Volumes/iOS_22A3351/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS%2018.0.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/MetalTools.framework/ principal class is nil because all fallbacks have failed - - previewImageView.contentMode = .scaleAspectFit + previewImageView.contentMode = .scaleAspectFill + previewImageView.clipsToBounds = true previewImageView.layer.cornerRadius = 20 + previewImageView.layer.borderColor = UIColor.systemGray5.cgColor + previewImageView.layer.borderWidth = 1 let symbolConfig = UIImage.SymbolConfiguration(weight: .regular) previewDeviceImageView.image = UIImage(systemName: "iphone", withConfiguration: symbolConfig)?.withTintColor(.secondaryLabel) @@ -441,6 +442,7 @@ class AppDetailView: UIView { $0.top.equalTo(previewTitleLabel.snp.bottom).offset(5) $0.centerX.equalToSuperview() $0.height.equalTo(500) + $0.width.equalTo(240) } previewDeviceImageView.snp.makeConstraints { From 739ec2d224c1def5286916e384469862f8ac1145 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 00:52:30 +0900 Subject: [PATCH 30/71] =?UTF-8?q?[Feat]=20#6=20-=20description=20=EB=B7=B0?= =?UTF-8?q?=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Presentations/AppDetailView.swift | 72 ++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index 65ba608..30f28cb 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -63,6 +63,12 @@ class AppDetailView: UIView { private let descriptionLabel = ContentLabel() private let descriptionMoreButton = UIButton() + private let developerView = UIView() + private let developerNameLabel = ContentLabel() + private let developerRoleLabel = SubtitleLabel() + private let chevronImageView = UIImageView() + lazy var developerButton = UIButton() + // 피드백 요약 뷰 private let feedbackSummaryView = UIView() private let feedbackSummaryTitleLabel = TitleLabel() @@ -200,7 +206,32 @@ class AppDetailView: UIView { } private func setDescriptionViewUI() { - + let description = """ +토스뱅크, 토스증권 서비스를 이용하시려면 토스 앱 설치가 필요합니다. + • 내 금융 현황을 한눈에, 홈•소비 + • 모든 계좌의 모든 정보를 한 곳에서, 따로 보았던 예적금, 청약, 증권, 대출 계좌의 정보를 한 곳에서 확인할 수 있어 요. + • 얼마나 벌고 얼마나 썼을까? 한 달 동안의 수입과 소비를 시간순으로 모아볼 수 있고, 소비 분석 리포트도 제공해드 려요. + • 카드 실적 헷갈릴 필요 없이, 실적을 충족한 카드가 무엇 인지 얼마나 더 써야 실적을 달성하는지 한눈에 확인할 수 있어요. + • 매달 고정적으로 나가는 보험비, 생활요금, 구독료 등도 쉽게 확인할 수 있어요. + • 평생 무료로 간편하고 안전하게, 송금 + • 송금을 자유롭게, 토스에서는 은행 상관없이 수수료가 평 생 무료에요. + • 송금을 안전하게, 송금 전 사기계좌를 미리 조회해 안전 하게 송금할 수 있어요. + • 송금을 간편하게, 단 한 번의 터치까지 줄였어요. 최소한 의 터치로 송금하세요. + • 그리고 마음까지, 간단한 메시지와 이모티콘을 함께 보내 보세요. +""" + descriptionLabel.text = description + descriptionLabel.numberOfLines = 3 + descriptionLabel.setLineSpacing(8) + + descriptionMoreButton.configureButton(title: "더 보기", fontWeight: .light, removeContentInsets: true) + + developerNameLabel.configureLabel(color: .tintColor, size: 17, weight: .regular, text: "Viva Republica") + + developerRoleLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: "개발자") + + chevronImageView.image = UIImage(systemName: "chevron.right") + chevronImageView.contentMode = .scaleAspectFit + chevronImageView.tintColor = .secondaryLabel } private func setFeedbackSummaryViewUI() { @@ -275,7 +306,13 @@ class AppDetailView: UIView { } private func setDescriptionViewHierarchy() { + [descriptionLabel, descriptionMoreButton, developerView].forEach { + descriptionView.addSubview($0) + } + [developerNameLabel, developerRoleLabel, chevronImageView, developerButton].forEach { + developerView.addSubview($0) + } } private func setFeedbackSummaryViewHierarchy() { @@ -459,7 +496,40 @@ class AppDetailView: UIView { } private func setDescriptionViewConstraints() { + descriptionView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + descriptionLabel.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview().offset(10) + } + + descriptionMoreButton.snp.makeConstraints { + $0.bottom.equalTo(descriptionLabel) + $0.trailing.equalToSuperview() + } + + developerView.snp.makeConstraints { + $0.top.equalTo(descriptionLabel.snp.bottom).offset(30) + $0.bottom.equalToSuperview().offset(-30) + $0.horizontalEdges.equalToSuperview() + } + + developerNameLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + developerRoleLabel.snp.makeConstraints { + $0.top.equalTo(developerNameLabel.snp.bottom).offset(2) + $0.leading.equalToSuperview() + $0.bottom.equalToSuperview() + } + chevronImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview() + $0.size.equalTo(22) + } } private func setFeedbackSummaryViewConstraints() { From c1a001f79f1e37a3006402e7a8ef03eea3089bb4 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 01:40:36 +0900 Subject: [PATCH 31/71] =?UTF-8?q?[Feat]=20#6=20-=20=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A6=AC=EB=B7=B0=20=EC=9A=94=EC=95=BD=EB=B7=B0=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Presentations/AppDetailView.swift | 63 +++++++++++++++++-- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index 30f28cb..c925b71 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -74,14 +74,18 @@ class AppDetailView: UIView { private let feedbackSummaryTitleLabel = TitleLabel() private let feedbackSummaryAverageLabel = TitleLabel() private let feedbackSummarySubtitleLabel = SubtitleLabel() - private let feedbackSummaryTabToRateLabel = SubtitleLabel() - let feedbackSummaryStarStackView = UIStackView() + lazy var feedbackSummaryAllButton = UIButton() + private let feedbackSummaryStarsImageView = UIImageView() + private let feedbackSummaryCountLabel = SubtitleLabel() // 피드백 뷰 private let feedbackView = UIView() - private let feedbackGuideLabel = ContentLabel() - private let feedbackStarStackView = UIStackView() - private let feedbackStarImageView = UIImageView() + private let feedbackTabToRateLabel = SubtitleLabel() + var feedbackTabToRateStarStackView = UIStackView() + + private let feedbackBoxView = UIView() + private let feedbackTitleLabel = ContentLabel() + private let feedbackStarStackView = StarStackView() private let feedbackDateLabel = SubtitleLabel() private let feedbackAuthorLabel = SubtitleLabel() private let feedbackContentLabel = ContentLabel() @@ -235,7 +239,18 @@ class AppDetailView: UIView { } private func setFeedbackSummaryViewUI() { + feedbackSummaryTitleLabel.text = "평가 및 리뷰" + + feedbackSummaryAverageLabel.configureLabel(color: .label, size: 68, weight: .bold, text: "4.4") + + feedbackSummarySubtitleLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .bold, text: "5점 만점") + feedbackSummaryAllButton.configureButton(title: "모두 보기", removeContentInsets: true) + + feedbackSummaryStarsImageView.image = UIImage(systemName: "photo")?.withTintColor(.secondaryLabel, renderingMode: .alwaysOriginal) + feedbackSummaryStarsImageView.backgroundColor = .systemGray5 + + feedbackSummaryCountLabel.text = "8.4만개의 평가" } private func setFeedbackViewUI() { @@ -316,7 +331,9 @@ class AppDetailView: UIView { } private func setFeedbackSummaryViewHierarchy() { - + [feedbackSummaryTitleLabel, feedbackSummaryAverageLabel, feedbackSummarySubtitleLabel, feedbackSummaryAllButton, feedbackSummaryStarsImageView, feedbackSummaryCountLabel].forEach { + feedbackSummaryView.addSubview($0) + } } private func setFeedbackViewHierarchy() { @@ -533,7 +550,41 @@ class AppDetailView: UIView { } private func setFeedbackSummaryViewConstraints() { + feedbackSummaryView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + feedbackSummaryTitleLabel.snp.makeConstraints { + $0.leading.top.equalToSuperview() + } + + feedbackSummaryAverageLabel.snp.makeConstraints { + $0.leading.equalToSuperview() + $0.top.equalTo(feedbackSummaryTitleLabel.snp.bottom) + $0.width.equalTo(120) + } + + feedbackSummarySubtitleLabel.snp.makeConstraints { + $0.centerX.equalTo(feedbackSummaryAverageLabel) + $0.top.equalTo(feedbackSummaryAverageLabel.snp.bottom) + $0.bottom.equalToSuperview().offset(-10) + } + + feedbackSummaryAllButton.snp.makeConstraints { + $0.trailing.equalToSuperview() + $0.centerY.equalTo(feedbackSummaryTitleLabel) + } + + feedbackSummaryStarsImageView.snp.makeConstraints { + $0.leading.equalTo(feedbackSummaryAverageLabel.snp.trailing).offset(30) + $0.trailing.equalToSuperview() + $0.verticalEdges.equalTo(feedbackSummaryAverageLabel).inset(5) + } + feedbackSummaryCountLabel.snp.makeConstraints { + $0.trailing.equalToSuperview() + $0.centerY.equalTo(feedbackSummarySubtitleLabel) + } } private func setFeedbackViewConstraints() { From ee0dcb33258797921a3f990892ad3538e0b525e2 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 03:25:52 +0900 Subject: [PATCH 32/71] =?UTF-8?q?[Add,=20Feat]=20#6=20-=20symbol=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=91=90=EA=BB=98=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Extensions/UIImage+Extension.swift | 15 +++ .../Week2/Presentations/AppDetailView.swift | 96 +++++++++++++++++-- 2 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift diff --git a/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift new file mode 100644 index 0000000..f2dec02 --- /dev/null +++ b/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift @@ -0,0 +1,15 @@ +// +// UIImageView+Extension.swift +// 35-seminar +// +// Created by 김유림 on 10/25/24. +// + +import UIKit + +extension UIImage { + class func configureImage(systemName: String, symbolWeight: UIImage.SymbolWeight) -> UIImage? { + let symbolConfig = UIImage.SymbolConfiguration(weight: symbolWeight) + return UIImage(systemName: systemName, withConfiguration: symbolConfig) + } +} diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift index c925b71..e069a19 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift @@ -1,10 +1,11 @@ // -// AppDetailView.swift +// AppDetailView 2.swift // 35-seminar // -// Created by 김유림 on 10/15/24. +// Created by 김유림 on 10/25/24. // + import UIKit import SnapKit @@ -80,8 +81,9 @@ class AppDetailView: UIView { // 피드백 뷰 private let feedbackView = UIView() - private let feedbackTabToRateLabel = SubtitleLabel() - var feedbackTabToRateStarStackView = UIStackView() + private let feedbackTapToRateStackView = UIStackView() + private let feedbackTapToRateLabel = SubtitleLabel() + var feedbackTapToRateStarStackView = StarStackView() private let feedbackBoxView = UIView() private let feedbackTitleLabel = ContentLabel() @@ -91,7 +93,8 @@ class AppDetailView: UIView { private let feedbackContentLabel = ContentLabel() private let feedbackDeveloperTitleLabel = ContentLabel() private let feedbackDeveloperContentLabel = ContentLabel() - private let feedbackMoreButton = UIButton() + private let feedbackMoreButton1 = UIButton() + private let feedbackMoreButton2 = UIButton() // MARK: - Methods override init(frame: CGRect) { @@ -254,7 +257,29 @@ class AppDetailView: UIView { } private func setFeedbackViewUI() { - + feedbackTapToRateStackView.axis = .horizontal + + feedbackTapToRateLabel.text = "탭하여 평가하기:" + feedbackTapToRateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) + + feedbackTapToRateStarStackView.setContentHuggingPriority(.defaultLow, for: .horizontal) + + feedbackBoxView.backgroundColor = UIColor(named: "reviewbox") + feedbackTitleLabel.text = "김유림" + feedbackStarStackView.bind(2, .yellow) + feedbackDateLabel.text = "24.10.25" + feedbackAuthorLabel.text = "ISTJ" + feedbackContentLabel.text = """ +"1. 동해물과 백두산이 마르고 닳도록 + 하느님이 보우하사 우리나라 만세 + 무궁화 삼천리 화려 강산 + 대한 사람 대한으로 길이 보전하세 +""" + feedbackDeveloperTitleLabel.text = "개발자 답변" + feedbackDeveloperContentLabel.text = "안녕하세요, 감사합니다." + [feedbackMoreButton1, feedbackMoreButton2].forEach { + $0.configureButton(title: "더 보기", removeContentInsets: true) + } } // MARK: - Hierarchy @@ -337,7 +362,17 @@ class AppDetailView: UIView { } private func setFeedbackViewHierarchy() { + [feedbackTapToRateStackView, feedbackBoxView].forEach { + feedbackView.addSubview($0) + } + + [feedbackTapToRateLabel, feedbackTapToRateStarStackView].forEach { + feedbackTapToRateStackView.addArrangedSubview($0) + } + [feedbackTitleLabel, feedbackStarStackView, feedbackDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { + feedbackBoxView.addSubview($0) + } } // MARK: - Constraints @@ -588,6 +623,53 @@ class AppDetailView: UIView { } private func setFeedbackViewConstraints() { + feedbackView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + feedbackTapToRateStackView.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + } + + feedbackBoxView.snp.makeConstraints { + $0.top.equalTo(feedbackTapToRateStackView.snp.bottom).offset(10) + $0.horizontalEdges.equalToSuperview() + } + + feedbackTitleLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview().offset(20) + } + + feedbackStarStackView.snp.makeConstraints { + $0.leading.equalTo(feedbackTitleLabel) + $0.top.equalTo(feedbackTitleLabel.snp.bottom).offset(5) + $0.height.equalTo(20) + } + + feedbackDateLabel.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(-20) + $0.centerY.equalTo(feedbackTitleLabel) + } + + feedbackAuthorLabel.snp.makeConstraints { + $0.trailing.equalTo(feedbackDateLabel) + $0.centerY.equalTo(feedbackStarStackView) + } + + feedbackContentLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.top.equalTo(feedbackStarStackView.snp.bottom).offset(15) + } + + feedbackMoreButton1.snp.makeConstraints { + $0.bottom.trailing.equalTo(feedbackContentLabel) + } + + feedbackDeveloperTitleLabel.snp.makeConstraints { + $0.top.equalTo(feedbackContentLabel.snp.bottom).offset(15) + $0.leading.equalTo(feedbackContentLabel) + } + } -} +} \ No newline at end of file From abe707f827b8738f2ff13696a7dd31ed87430281 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 03:57:44 +0900 Subject: [PATCH 33/71] =?UTF-8?q?[Feat]=20#6=20-=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EA=B8=80=EC=94=A8=20=ED=81=AC=EA=B8=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppDetailView.swift | 107 ++- .../Week2/Reusables/ContentLabel.swift | 2 +- .../Week2/Reusables/SubtitleLabel.swift | 2 +- .../Week2/Reusables/TitleLabel.swift | 2 +- .../Week2/View/AppDetailView.swift | 718 ++++++++++++++++++ .../AppDetailViewController.swift | 0 6 files changed, 796 insertions(+), 35 deletions(-) rename 35-seminar/Presentation/Week2/{Presentations => Practice}/AppDetailView.swift (86%) create mode 100644 35-seminar/Presentation/Week2/View/AppDetailView.swift rename 35-seminar/Presentation/Week2/{Presentations => View}/AppDetailViewController.swift (100%) diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift b/35-seminar/Presentation/Week2/Practice/AppDetailView.swift similarity index 86% rename from 35-seminar/Presentation/Week2/Presentations/AppDetailView.swift rename to 35-seminar/Presentation/Week2/Practice/AppDetailView.swift index e069a19..97ed243 100644 --- a/35-seminar/Presentation/Week2/Presentations/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/Practice/AppDetailView.swift @@ -88,14 +88,18 @@ class AppDetailView: UIView { private let feedbackBoxView = UIView() private let feedbackTitleLabel = ContentLabel() private let feedbackStarStackView = StarStackView() - private let feedbackDateLabel = SubtitleLabel() + private let feedbackAuthorDateLabel = SubtitleLabel() private let feedbackAuthorLabel = SubtitleLabel() private let feedbackContentLabel = ContentLabel() private let feedbackDeveloperTitleLabel = ContentLabel() private let feedbackDeveloperContentLabel = ContentLabel() + private let feedbackDeveloperDateLabel = SubtitleLabel() private let feedbackMoreButton1 = UIButton() private let feedbackMoreButton2 = UIButton() + private let feedbackWriteButton = UIButton() + private let appSupportButton = UIButton() + // MARK: - Methods override init(frame: CGRect) { super.init(frame: frame) @@ -130,7 +134,7 @@ class AppDetailView: UIView { iconImageView.layer.borderColor = UIColor.systemGray5.cgColor iconImageView.layer.borderWidth = 1 - titleLabel.text = "토스" + titleLabel.configureLabel(size: 23, weight: .semibold, text: "토스") subtitleLabel.text = "금융이 쉬워진다" @@ -141,8 +145,8 @@ class AppDetailView: UIView { foregroundColor: .white, backgroundColor: .tintColor) - shareButton.configureButton(image: UIImage(systemName: "square.and.arrow.up"), - symbolWeight: .semibold) + shareButton.configureButton(systemName: "square.and.arrow.up", + symbolWeight: .medium) } @@ -205,8 +209,7 @@ class AppDetailView: UIView { previewImageView.layer.borderColor = UIColor.systemGray5.cgColor previewImageView.layer.borderWidth = 1 - let symbolConfig = UIImage.SymbolConfiguration(weight: .regular) - previewDeviceImageView.image = UIImage(systemName: "iphone", withConfiguration: symbolConfig)?.withTintColor(.secondaryLabel) + previewDeviceImageView.image = UIImage.configureImage(systemName: "iphone", symbolWeight: .regular)?.withTintColor(.secondaryLabel) previewDeviceImageView.contentMode = .scaleAspectFit previewDeviceLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .semibold, text: "iPhone") @@ -244,7 +247,7 @@ class AppDetailView: UIView { private func setFeedbackSummaryViewUI() { feedbackSummaryTitleLabel.text = "평가 및 리뷰" - feedbackSummaryAverageLabel.configureLabel(color: .label, size: 68, weight: .bold, text: "4.4") + feedbackSummaryAverageLabel.configureLabel(color: .label, size: 64, weight: .bold, text: "4.4") feedbackSummarySubtitleLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .bold, text: "5점 만점") @@ -258,28 +261,41 @@ class AppDetailView: UIView { private func setFeedbackViewUI() { feedbackTapToRateStackView.axis = .horizontal + feedbackTapToRateStackView.spacing = 10 - feedbackTapToRateLabel.text = "탭하여 평가하기:" + feedbackTapToRateLabel.configureLabel(color: .secondaryLabel, size: 18, weight: .light, text: "탭하여 평가하기:") feedbackTapToRateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) feedbackTapToRateStarStackView.setContentHuggingPriority(.defaultLow, for: .horizontal) - feedbackBoxView.backgroundColor = UIColor(named: "reviewbox") - feedbackTitleLabel.text = "김유림" - feedbackStarStackView.bind(2, .yellow) - feedbackDateLabel.text = "24.10.25" - feedbackAuthorLabel.text = "ISTJ" - feedbackContentLabel.text = """ -"1. 동해물과 백두산이 마르고 닳도록 - 하느님이 보우하사 우리나라 만세 - 무궁화 삼천리 화려 강산 - 대한 사람 대한으로 길이 보전하세 -""" - feedbackDeveloperTitleLabel.text = "개발자 답변" + feedbackBoxView.backgroundColor = .systemGray6 + feedbackBoxView.layer.cornerRadius = 10 + + feedbackTitleLabel.configureLabel(size: 18, weight: .semibold, text: "김유림") + + feedbackStarStackView.bind(2, .orange) + + feedbackAuthorDateLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .regular, text: "10월 25") + + feedbackAuthorLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .regular, text: "ISTJ") + + feedbackContentLabel.text = "1. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려 강산 대한 사람 대한으로 길이 보전하세" + feedbackContentLabel.setLineSpacing(4) + + feedbackDeveloperTitleLabel.configureLabel(size: 17, weight: .medium, text: "개발자 답변") + feedbackDeveloperContentLabel.text = "안녕하세요, 감사합니다." + feedbackDeveloperContentLabel.setLineSpacing(4) + + feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .regular, text: "10월 25") + [feedbackMoreButton1, feedbackMoreButton2].forEach { $0.configureButton(title: "더 보기", removeContentInsets: true) } + + feedbackWriteButton.configureButton(title: " 리뷰 작성", systemName: "square.and.pencil") + + appSupportButton.configureButton(title: " 앱 지원", systemName: "questionmark.circle") } // MARK: - Hierarchy @@ -362,7 +378,7 @@ class AppDetailView: UIView { } private func setFeedbackViewHierarchy() { - [feedbackTapToRateStackView, feedbackBoxView].forEach { + [feedbackTapToRateStackView, feedbackBoxView, feedbackWriteButton, appSupportButton].forEach { feedbackView.addSubview($0) } @@ -370,7 +386,7 @@ class AppDetailView: UIView { feedbackTapToRateStackView.addArrangedSubview($0) } - [feedbackTitleLabel, feedbackStarStackView, feedbackDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { + [feedbackTitleLabel, feedbackStarStackView, feedbackAuthorDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackDeveloperDateLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { feedbackBoxView.addSubview($0) } } @@ -629,36 +645,39 @@ class AppDetailView: UIView { feedbackTapToRateStackView.snp.makeConstraints { $0.top.horizontalEdges.equalToSuperview() + $0.height.equalTo(28) } feedbackBoxView.snp.makeConstraints { - $0.top.equalTo(feedbackTapToRateStackView.snp.bottom).offset(10) + $0.top.equalTo(feedbackTapToRateStackView.snp.bottom).offset(20) $0.horizontalEdges.equalToSuperview() } feedbackTitleLabel.snp.makeConstraints { - $0.top.leading.equalToSuperview().offset(20) + $0.top.equalToSuperview().offset(18) + $0.leading.equalTo(feedbackContentLabel) } feedbackStarStackView.snp.makeConstraints { - $0.leading.equalTo(feedbackTitleLabel) - $0.top.equalTo(feedbackTitleLabel.snp.bottom).offset(5) - $0.height.equalTo(20) + $0.leading.equalTo(feedbackContentLabel) + $0.top.equalTo(feedbackTitleLabel.snp.bottom).offset(4) + $0.height.equalTo(16) + $0.width.equalTo(80) } - feedbackDateLabel.snp.makeConstraints { - $0.trailing.equalToSuperview().offset(-20) + feedbackAuthorDateLabel.snp.makeConstraints { + $0.trailing.equalTo(feedbackContentLabel) $0.centerY.equalTo(feedbackTitleLabel) } feedbackAuthorLabel.snp.makeConstraints { - $0.trailing.equalTo(feedbackDateLabel) + $0.trailing.equalTo(feedbackContentLabel) $0.centerY.equalTo(feedbackStarStackView) } feedbackContentLabel.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(20) - $0.top.equalTo(feedbackStarStackView.snp.bottom).offset(15) + $0.top.equalTo(feedbackStarStackView.snp.bottom).offset(10) } feedbackMoreButton1.snp.makeConstraints { @@ -670,6 +689,30 @@ class AppDetailView: UIView { $0.leading.equalTo(feedbackContentLabel) } + feedbackDeveloperDateLabel.snp.makeConstraints { + $0.trailing.equalTo(feedbackContentLabel) + $0.centerY.equalTo(feedbackDeveloperTitleLabel) + } + + feedbackDeveloperContentLabel.snp.makeConstraints { + $0.horizontalEdges.equalTo(feedbackContentLabel) + $0.top.equalTo(feedbackDeveloperTitleLabel.snp.bottom).offset(5) + $0.bottom.equalToSuperview().offset(-20) + } + + feedbackMoreButton2.snp.makeConstraints { + $0.bottom.trailing.equalTo(feedbackDeveloperContentLabel) + } + + feedbackWriteButton.snp.makeConstraints { + $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) + $0.leading.equalTo(feedbackBoxView) + $0.bottom.equalToSuperview().offset(-10) + } + appSupportButton.snp.makeConstraints { + $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) + $0.trailing.equalTo(feedbackBoxView) + } } -} \ No newline at end of file +} diff --git a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift index 9a42480..7404d4e 100644 --- a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift @@ -11,7 +11,7 @@ class ContentLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .label, size: 17, weight: .light, numberOfLines: 0) + self.configureLabel(color: .label, size: 15, weight: .light, numberOfLines: 0) } required init?(coder: NSCoder) { diff --git a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift index 7a63bca..86bcd88 100644 --- a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift @@ -11,7 +11,7 @@ class SubtitleLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .secondaryLabel, size: 17, weight: .light) + self.configureLabel(color: .secondaryLabel, size: 15, weight: .light) } required init?(coder: NSCoder) { diff --git a/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift index 2f3ad59..b7e2e11 100644 --- a/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/TitleLabel.swift @@ -11,7 +11,7 @@ class TitleLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(size: 24, weight: .semibold) + self.configureLabel(size: 23, weight: .bold) } required init?(coder: NSCoder) { diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift new file mode 100644 index 0000000..832ffd5 --- /dev/null +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -0,0 +1,718 @@ +// +// AppDetailView 2.swift +// 35-seminar +// +// Created by 김유림 on 10/25/24. +// + + +import UIKit +import SnapKit + +class AppDetailView: UIView { + + // MARK: - Properties + private let scrollView = UIScrollView() + private var contentStackView = UIStackView() + + // 타이틀뷰 + private let titleView = UIView() + private let iconImageView = UIImageView() + private let titleLabel = TitleLabel() + private let subtitleLabel = SubtitleLabel() + private let openButton = UIButton() + private let shareButton = UIButton() + + // 요약뷰 + private let summaryStackView = UIStackView() + private let verticalBorderView1 = BorderView() + private let verticalBorderView2 = BorderView() + + // 1번칸 + private let summaryRatingStackView = UIStackView() + private let summaryRatingTitleLabel = SubtitleLabel() + private let summaryRatingAverageLabel = SubtitleLabel() + private let summaryRatingStarStackView = StarStackView() + // 2번칸 + private let summaryPrizeStackView = UIStackView() + private let summaryPrizeTitleLabel = SubtitleLabel() + private let summaryPrizeContentImageView = UIImageView() + private let summaryPrizeSubtitleLabel = SubtitleLabel() + //3번칸 + private let summaryAgeStackView = UIStackView() + private let summaryAgeTitleLabel = SubtitleLabel() + private let summaryAgeLimitLabel = SubtitleLabel() + private let summaryAgeSubtitleLabel = SubtitleLabel() + + // 업데이트뷰 + private let updateView = UIView() + private let updateTitleLabel = TitleLabel() + private let updateSubtitleLabel = SubtitleLabel() + private let updateContentLabel = ContentLabel() + private let updateRecordButton = UIButton() + private let updateDateLabel = SubtitleLabel() + + // 미리보기뷰 + private let previewView = UIView() + private let previewTitleLabel = TitleLabel() + private let previewImageView = UIImageView() + private let previewDeviceImageView = UIImageView() + private let previewDeviceLabel = SubtitleLabel() + + // 앱 설명 뷰 + private let descriptionView = UIView() + private let descriptionLabel = ContentLabel() + private let descriptionMoreButton = UIButton() + + private let developerView = UIView() + private let developerNameLabel = ContentLabel() + private let developerRoleLabel = SubtitleLabel() + private let chevronImageView = UIImageView() + lazy var developerButton = UIButton() + + // 피드백 요약 뷰 + private let feedbackSummaryView = UIView() + private let feedbackSummaryTitleLabel = TitleLabel() + private let feedbackSummaryAverageLabel = TitleLabel() + private let feedbackSummarySubtitleLabel = SubtitleLabel() + lazy var feedbackSummaryAllButton = UIButton() + private let feedbackSummaryStarsImageView = UIImageView() + private let feedbackSummaryCountLabel = SubtitleLabel() + + // 피드백 뷰 + private let feedbackView = UIView() + private let feedbackTapToRateStackView = UIStackView() + private let feedbackTapToRateLabel = SubtitleLabel() + var feedbackTapToRateStarStackView = StarStackView() + + private let feedbackBoxView = UIView() + private let feedbackTitleLabel = ContentLabel() + private let feedbackStarStackView = StarStackView() + private let feedbackAuthorDateLabel = SubtitleLabel() + private let feedbackAuthorLabel = SubtitleLabel() + private let feedbackContentLabel = ContentLabel() + private let feedbackDeveloperTitleLabel = ContentLabel() + private let feedbackDeveloperContentLabel = ContentLabel() + private let feedbackDeveloperDateLabel = SubtitleLabel() + private let feedbackMoreButton1 = UIButton() + private let feedbackMoreButton2 = UIButton() + + private let feedbackWriteButton = UIButton() + private let appSupportButton = UIButton() + + // MARK: - Methods + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + setHierarchy() + setConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: UI + private func setUI() { + self.backgroundColor = .systemBackground + contentStackView.axis = .vertical + contentStackView.spacing = 10 + + setTitleViewUI() + setSummaryViewUI() + setUpdateViewUI() + setPreviewViewUI() + setDescriptionViewUI() + setFeedbackSummaryViewUI() + setFeedbackViewUI() + } + + private func setTitleViewUI() { + iconImageView.image = UIImage(named: "toss_icon") + iconImageView.clipsToBounds = true + iconImageView.layer.cornerRadius = 20 + iconImageView.layer.borderColor = UIColor.systemGray5.cgColor + iconImageView.layer.borderWidth = 1 + + titleLabel.configureLabel(size: 23, weight: .semibold, text: "토스") + + subtitleLabel.text = "금융이 쉬워진다" + + openButton.configureButton(configType: .filled, + title: "열기", + fontWeight: .bold, + cornerStyle: .capsule, + foregroundColor: .white, + backgroundColor: .tintColor) + + shareButton.configureButton(systemName: "square.and.arrow.up", + symbolWeight: .medium) + + } + + private func setSummaryViewUI() { + summaryStackView.axis = .horizontal + summaryStackView.alignment = .center + + [summaryRatingStackView, summaryPrizeStackView, summaryAgeStackView].forEach { + $0.axis = .vertical + $0.alignment = .center + } + + [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { + $0.configureLabel(color: .secondaryLabel, size: 12, weight: .regular) + $0.textAlignment = .center + } + + [summaryRatingAverageLabel, summaryAgeLimitLabel].forEach { + $0.configureLabel(color: .secondaryLabel, size: 22, weight: .bold) + $0.textAlignment = .center + } + + [summaryPrizeSubtitleLabel, summaryAgeSubtitleLabel].forEach { + $0.configureLabel(color: .secondaryLabel, size: 13, weight: .regular) + $0.textAlignment = .center + } + + summaryRatingTitleLabel.text = "8.4만개의 평가" + summaryRatingAverageLabel.text = "4.4" + summaryRatingStarStackView.bind(4, .gray) + + summaryPrizeTitleLabel.text = "수상" + summaryPrizeContentImageView.image = UIImage(systemName: "person") + summaryPrizeContentImageView.tintColor = .secondaryLabel + summaryPrizeContentImageView.contentMode = .scaleAspectFit + summaryPrizeSubtitleLabel.text = "앱" + + summaryAgeTitleLabel.text = "연령" + summaryAgeLimitLabel.text = "4+" + summaryAgeSubtitleLabel.text = "세" + } + + private func setUpdateViewUI() { + updateTitleLabel.text = "새로운 소식" + updateSubtitleLabel.text = "버전 5.185.0" + updateContentLabel.text = "• 구석구석 숨어있던 버그들을 잡았어요. 또 다른 버그가 나타나면 토스 고객센터를 찾아주세요. 늘 열려있답니다. 365일 24시간 언제든지요." + updateContentLabel.setLineSpacing(8) + + updateRecordButton.configureButton(title: "버전 기록", fontSize: 16, fontWeight: .light, removeContentInsets: true) + updateDateLabel.text = "3시간 전" + } + + private func setPreviewViewUI() { + previewTitleLabel.text = "미리 보기" + + previewImageView.image = UIImage(named: "toss_preview") // NSBundle 오류 발생 + previewImageView.contentMode = .scaleAspectFill + previewImageView.clipsToBounds = true + previewImageView.layer.cornerRadius = 20 + previewImageView.layer.borderColor = UIColor.systemGray5.cgColor + previewImageView.layer.borderWidth = 1 + + previewDeviceImageView.image = UIImage.configureImage(systemName: "iphone", symbolWeight: .regular)?.withTintColor(.secondaryLabel) + previewDeviceImageView.contentMode = .scaleAspectFit + + previewDeviceLabel.configureLabel(color: .secondaryLabel, size: 13, weight: .semibold, text: "iPhone") + } + + private func setDescriptionViewUI() { + let description = """ +토스뱅크, 토스증권 서비스를 이용하시려면 토스 앱 설치가 필요합니다. + • 내 금융 현황을 한눈에, 홈•소비 + • 모든 계좌의 모든 정보를 한 곳에서, 따로 보았던 예적금, 청약, 증권, 대출 계좌의 정보를 한 곳에서 확인할 수 있어 요. + • 얼마나 벌고 얼마나 썼을까? 한 달 동안의 수입과 소비를 시간순으로 모아볼 수 있고, 소비 분석 리포트도 제공해드 려요. + • 카드 실적 헷갈릴 필요 없이, 실적을 충족한 카드가 무엇 인지 얼마나 더 써야 실적을 달성하는지 한눈에 확인할 수 있어요. + • 매달 고정적으로 나가는 보험비, 생활요금, 구독료 등도 쉽게 확인할 수 있어요. + • 평생 무료로 간편하고 안전하게, 송금 + • 송금을 자유롭게, 토스에서는 은행 상관없이 수수료가 평 생 무료에요. + • 송금을 안전하게, 송금 전 사기계좌를 미리 조회해 안전 하게 송금할 수 있어요. + • 송금을 간편하게, 단 한 번의 터치까지 줄였어요. 최소한 의 터치로 송금하세요. + • 그리고 마음까지, 간단한 메시지와 이모티콘을 함께 보내 보세요. +""" + descriptionLabel.text = description + descriptionLabel.numberOfLines = 3 + descriptionLabel.setLineSpacing(8) + + descriptionMoreButton.configureButton(title: "더 보기", fontWeight: .light, removeContentInsets: true) + + developerNameLabel.configureLabel(color: .tintColor, size: 15, weight: .regular, text: "Viva Republica") + + developerRoleLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .regular, text: "개발자") + + chevronImageView.image = UIImage(systemName: "chevron.right") + chevronImageView.contentMode = .scaleAspectFit + chevronImageView.tintColor = .secondaryLabel + } + + private func setFeedbackSummaryViewUI() { + feedbackSummaryTitleLabel.text = "평가 및 리뷰" + + feedbackSummaryAverageLabel.configureLabel(color: .label, size: 60, weight: .bold, text: "4.4") + + feedbackSummarySubtitleLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .bold, text: "5점 만점") + + feedbackSummaryAllButton.configureButton(title: "모두 보기", removeContentInsets: true) + + feedbackSummaryStarsImageView.image = UIImage(systemName: "photo")?.withTintColor(.secondaryLabel, renderingMode: .alwaysOriginal) + feedbackSummaryStarsImageView.backgroundColor = .systemGray5 + + feedbackSummaryCountLabel.text = "8.4만개의 평가" + } + + private func setFeedbackViewUI() { + feedbackTapToRateStackView.axis = .horizontal + feedbackTapToRateStackView.spacing = 10 + + feedbackTapToRateLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .medium, text: "탭하여 평가하기:") + feedbackTapToRateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) + + feedbackTapToRateStarStackView.setContentHuggingPriority(.defaultLow, for: .horizontal) + + feedbackBoxView.backgroundColor = .systemGray6 + feedbackBoxView.layer.cornerRadius = 10 + + feedbackTitleLabel.configureLabel(size: 15, weight: .semibold, text: "김유림") + + feedbackStarStackView.bind(2, .orange) + + feedbackAuthorDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: "10월 25") + + feedbackAuthorLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .regular, text: "ISTJ") + + feedbackContentLabel.text = "1. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려 강산 대한 사람 대한으로 길이 보전하세" + feedbackContentLabel.setLineSpacing(4) + + feedbackDeveloperTitleLabel.configureLabel(size: 15, weight: .medium, text: "개발자 답변") + + feedbackDeveloperContentLabel.text = "안녕하세요, 감사합니다." + feedbackDeveloperContentLabel.setLineSpacing(4) + + feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: "10월 25") + + [feedbackMoreButton1, feedbackMoreButton2].forEach { + $0.configureButton(title: "더 보기", removeContentInsets: true) + } + + feedbackWriteButton.configureButton(title: " 리뷰 작성", systemName: "square.and.pencil") + + appSupportButton.configureButton(title: " 앱 지원", systemName: "questionmark.circle") + } + + // MARK: - Hierarchy + private func setHierarchy() { + setBaseHierarchy() + setTitleViewHierarchy() + setSummaryViewHierarchy() + setUpdateViewHierarchy() + setPreviewViewHierarchy() + setDescriptionViewHierarchy() + setFeedbackSummaryViewHierarchy() + setFeedbackViewHierarchy() + } + + private func setBaseHierarchy() { + self.addSubview(scrollView) + scrollView.addSubview(contentStackView) + + [titleView, summaryStackView, updateView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { + let borderView = BorderView() + contentStackView.addArrangedSubview($0) + contentStackView.addArrangedSubview(borderView) + borderView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(0.5) + } + } + } + + private func setTitleViewHierarchy() { + [iconImageView, titleLabel, subtitleLabel, openButton, shareButton].forEach { + titleView.addSubview($0) + } + } + + private func setSummaryViewHierarchy() { + [summaryRatingStackView, verticalBorderView1, summaryPrizeStackView, verticalBorderView2, summaryAgeStackView].forEach { + summaryStackView.addArrangedSubview($0) + } + + [summaryRatingTitleLabel, summaryRatingAverageLabel, summaryRatingStarStackView].forEach { + summaryRatingStackView.addArrangedSubview($0) + } + + [summaryPrizeTitleLabel, summaryPrizeContentImageView, summaryPrizeSubtitleLabel].forEach { + summaryPrizeStackView.addArrangedSubview($0) + } + + [summaryAgeTitleLabel, summaryAgeLimitLabel, summaryAgeSubtitleLabel].forEach { + summaryAgeStackView.addArrangedSubview($0) + } + } + + private func setUpdateViewHierarchy() { + [updateTitleLabel, updateSubtitleLabel, updateContentLabel, updateRecordButton, updateDateLabel].forEach { + updateView.addSubview($0) + } + } + + private func setPreviewViewHierarchy() { + [previewTitleLabel, previewImageView, previewDeviceImageView, previewDeviceLabel].forEach { + previewView.addSubview($0) + } + } + + private func setDescriptionViewHierarchy() { + [descriptionLabel, descriptionMoreButton, developerView].forEach { + descriptionView.addSubview($0) + } + + [developerNameLabel, developerRoleLabel, chevronImageView, developerButton].forEach { + developerView.addSubview($0) + } + } + + private func setFeedbackSummaryViewHierarchy() { + [feedbackSummaryTitleLabel, feedbackSummaryAverageLabel, feedbackSummarySubtitleLabel, feedbackSummaryAllButton, feedbackSummaryStarsImageView, feedbackSummaryCountLabel].forEach { + feedbackSummaryView.addSubview($0) + } + } + + private func setFeedbackViewHierarchy() { + [feedbackTapToRateStackView, feedbackBoxView, feedbackWriteButton, appSupportButton].forEach { + feedbackView.addSubview($0) + } + + [feedbackTapToRateLabel, feedbackTapToRateStarStackView].forEach { + feedbackTapToRateStackView.addArrangedSubview($0) + } + + [feedbackTitleLabel, feedbackStarStackView, feedbackAuthorDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackDeveloperDateLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { + feedbackBoxView.addSubview($0) + } + } + + // MARK: - Constraints + private func setConstraints() { + setBaseConstraints() + setTitleViewConstraints() + setSummaryViewConstraints() + setUpdateViewConstraints() + setPreviewViewConstraints() + setDescriptionViewConstraints() + setFeedbackSummaryViewConstraints() + setFeedbackViewConstraints() + } + + private func setBaseConstraints() { + scrollView.snp.makeConstraints { + $0.edges.equalTo(self.safeAreaLayoutGuide) + } + + contentStackView.snp.makeConstraints { + $0.edges.equalToSuperview() + $0.width.equalToSuperview() + $0.height.greaterThanOrEqualToSuperview().priority(.low) + } + } + + private func setTitleViewConstraints() { + titleView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview() + } + + iconImageView.snp.makeConstraints { + $0.size.equalTo(128) + $0.leading.equalToSuperview().inset(20) + $0.top.equalToSuperview() + $0.bottom.equalToSuperview().inset(10) + } + + titleLabel.snp.makeConstraints { + $0.leading.equalTo(iconImageView.snp.trailing).offset(16) + $0.top.equalTo(iconImageView) + } + + subtitleLabel.snp.makeConstraints { + $0.leading.equalTo(titleLabel) + $0.top.equalTo(titleLabel.snp.bottom).offset(5) + } + + openButton.snp.makeConstraints { + $0.leading.equalTo(titleLabel) + $0.bottom.equalTo(iconImageView) + $0.width.equalTo(76) + $0.height.equalTo(34) + } + + shareButton.snp.makeConstraints { + $0.trailing.equalToSuperview().inset(20) + $0.bottom.equalTo(iconImageView) + } + } + + private func setSummaryViewConstraints() { + summaryStackView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.height.equalTo(84) + } + + [verticalBorderView1, verticalBorderView2].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(40) + $0.width.equalTo(0.5) + } + } + + summaryRatingStackView.snp.makeConstraints { + $0.height.equalToSuperview() + $0.width.equalTo(summaryPrizeStackView) + $0.width.equalTo(summaryAgeStackView) + } + + summaryPrizeStackView.snp.makeConstraints { + $0.height.equalToSuperview() + $0.width.equalTo(summaryRatingStackView) + $0.width.equalTo(summaryAgeStackView) + } + + summaryAgeStackView.snp.makeConstraints { + $0.height.equalToSuperview() + $0.width.equalTo(summaryPrizeStackView) + $0.width.equalTo(summaryRatingStackView) + } + + [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(30) + } + } + + [summaryRatingAverageLabel, summaryPrizeContentImageView, summaryAgeLimitLabel].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(30) + $0.horizontalEdges.equalToSuperview() + } + } + + [summaryRatingStarStackView, summaryPrizeSubtitleLabel, summaryAgeSubtitleLabel].forEach { + $0.snp.makeConstraints { + $0.height.equalTo(24) + $0.horizontalEdges.equalToSuperview().inset(16) + } + } + } + + private func setUpdateViewConstraints() { + updateView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + updateTitleLabel.snp.makeConstraints { + $0.top.equalToSuperview() + $0.leading.equalToSuperview() + } + + updateSubtitleLabel.snp.makeConstraints { + $0.top.equalTo(updateTitleLabel.snp.bottom).offset(5) + $0.leading.equalTo(updateTitleLabel) + } + + updateContentLabel.snp.makeConstraints { + $0.top.equalTo(updateSubtitleLabel.snp.bottom).offset(16) + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview().inset(10) + } + + updateRecordButton.snp.makeConstraints { + $0.bottom.equalTo(updateTitleLabel) + $0.trailing.equalToSuperview() + } + + updateDateLabel.snp.makeConstraints { + $0.bottom.equalTo(updateSubtitleLabel) + $0.trailing.equalToSuperview() + } + } + + private func setPreviewViewConstraints() { + previewView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + previewTitleLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + previewImageView.snp.makeConstraints { + $0.top.equalTo(previewTitleLabel.snp.bottom).offset(5) + $0.centerX.equalToSuperview() + $0.height.equalTo(500) + $0.width.equalTo(240) + } + + previewDeviceImageView.snp.makeConstraints { + $0.top.equalTo(previewImageView.snp.bottom).offset(10) + $0.leading.equalToSuperview() + $0.size.equalTo(20) + $0.bottom.equalToSuperview().offset(-10) + } + + previewDeviceLabel.snp.makeConstraints { + $0.bottom.equalTo(previewDeviceImageView) + $0.leading.equalTo(previewDeviceImageView.snp.trailing).offset(5) + } + } + + private func setDescriptionViewConstraints() { + descriptionView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + descriptionLabel.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview().offset(10) + } + + descriptionMoreButton.snp.makeConstraints { + $0.bottom.equalTo(descriptionLabel) + $0.trailing.equalToSuperview() + } + + developerView.snp.makeConstraints { + $0.top.equalTo(descriptionLabel.snp.bottom).offset(30) + $0.bottom.equalToSuperview().offset(-30) + $0.horizontalEdges.equalToSuperview() + } + + developerNameLabel.snp.makeConstraints { + $0.top.leading.equalToSuperview() + } + + developerRoleLabel.snp.makeConstraints { + $0.top.equalTo(developerNameLabel.snp.bottom).offset(2) + $0.leading.equalToSuperview() + $0.bottom.equalToSuperview() + } + + chevronImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview() + $0.size.equalTo(20) + } + } + + private func setFeedbackSummaryViewConstraints() { + feedbackSummaryView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + feedbackSummaryTitleLabel.snp.makeConstraints { + $0.leading.top.equalToSuperview() + } + + feedbackSummaryAverageLabel.snp.makeConstraints { + $0.leading.equalToSuperview() + $0.top.equalTo(feedbackSummaryTitleLabel.snp.bottom) + $0.width.equalTo(120) + } + + feedbackSummarySubtitleLabel.snp.makeConstraints { + $0.centerX.equalTo(feedbackSummaryAverageLabel) + $0.top.equalTo(feedbackSummaryAverageLabel.snp.bottom) + $0.bottom.equalToSuperview().offset(-10) + } + + feedbackSummaryAllButton.snp.makeConstraints { + $0.trailing.equalToSuperview() + $0.centerY.equalTo(feedbackSummaryTitleLabel) + } + + feedbackSummaryStarsImageView.snp.makeConstraints { + $0.leading.equalTo(feedbackSummaryAverageLabel.snp.trailing).offset(30) + $0.trailing.equalToSuperview() + $0.verticalEdges.equalTo(feedbackSummaryAverageLabel).inset(5) + } + + feedbackSummaryCountLabel.snp.makeConstraints { + $0.trailing.equalToSuperview() + $0.centerY.equalTo(feedbackSummarySubtitleLabel) + } + } + + private func setFeedbackViewConstraints() { + feedbackView.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + } + + feedbackTapToRateStackView.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + $0.height.equalTo(28) + } + + feedbackBoxView.snp.makeConstraints { + $0.top.equalTo(feedbackTapToRateStackView.snp.bottom).offset(20) + $0.horizontalEdges.equalToSuperview() + } + + feedbackTitleLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(18) + $0.leading.equalTo(feedbackContentLabel) + } + + feedbackStarStackView.snp.makeConstraints { + $0.leading.equalTo(feedbackContentLabel) + $0.top.equalTo(feedbackTitleLabel.snp.bottom).offset(4) + $0.height.equalTo(16) + $0.width.equalTo(80) + } + + feedbackAuthorDateLabel.snp.makeConstraints { + $0.trailing.equalTo(feedbackContentLabel) + $0.centerY.equalTo(feedbackTitleLabel) + } + + feedbackAuthorLabel.snp.makeConstraints { + $0.trailing.equalTo(feedbackContentLabel) + $0.centerY.equalTo(feedbackStarStackView) + } + + feedbackContentLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(20) + $0.top.equalTo(feedbackStarStackView.snp.bottom).offset(10) + } + + feedbackMoreButton1.snp.makeConstraints { + $0.bottom.trailing.equalTo(feedbackContentLabel) + } + + feedbackDeveloperTitleLabel.snp.makeConstraints { + $0.top.equalTo(feedbackContentLabel.snp.bottom).offset(15) + $0.leading.equalTo(feedbackContentLabel) + } + + feedbackDeveloperDateLabel.snp.makeConstraints { + $0.trailing.equalTo(feedbackContentLabel) + $0.centerY.equalTo(feedbackDeveloperTitleLabel) + } + + feedbackDeveloperContentLabel.snp.makeConstraints { + $0.horizontalEdges.equalTo(feedbackContentLabel) + $0.top.equalTo(feedbackDeveloperTitleLabel.snp.bottom).offset(5) + $0.bottom.equalToSuperview().offset(-20) + } + + feedbackMoreButton2.snp.makeConstraints { + $0.bottom.trailing.equalTo(feedbackDeveloperContentLabel) + } + + feedbackWriteButton.snp.makeConstraints { + $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) + $0.leading.equalTo(feedbackBoxView) + $0.bottom.equalToSuperview().offset(-10) + } + + appSupportButton.snp.makeConstraints { + $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) + $0.trailing.equalTo(feedbackBoxView) + } + } +} diff --git a/35-seminar/Presentation/Week2/Presentations/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift similarity index 100% rename from 35-seminar/Presentation/Week2/Presentations/AppDetailViewController.swift rename to 35-seminar/Presentation/Week2/View/AppDetailViewController.swift From 27994c2c781521c2f65c9daa86010161877e3a5f Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 04:13:52 +0900 Subject: [PATCH 34/71] =?UTF-8?q?[Feat]=20#6=20-=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EA=B8=80=EC=94=A8=20=EB=91=90=EA=BB=98=20=EB=B3=80=EA=B2=BD(li?= =?UTF-8?q?ght->regular)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/Reusables/ContentLabel.swift | 2 +- 35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift index 7404d4e..b88c8ee 100644 --- a/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/ContentLabel.swift @@ -11,7 +11,7 @@ class ContentLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .label, size: 15, weight: .light, numberOfLines: 0) + self.configureLabel(color: .label, size: 15, weight: .regular, numberOfLines: 0) } required init?(coder: NSCoder) { diff --git a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift index 86bcd88..48b7e50 100644 --- a/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift +++ b/35-seminar/Presentation/Week2/Reusables/SubtitleLabel.swift @@ -11,7 +11,7 @@ class SubtitleLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) - self.configureLabel(color: .secondaryLabel, size: 15, weight: .light) + self.configureLabel(color: .secondaryLabel, size: 15, weight: .regular) } required init?(coder: NSCoder) { From 50d1a021b949477d7dcf7ed13d449c52c8125467 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 04:15:41 +0900 Subject: [PATCH 35/71] =?UTF-8?q?[Move]=20=ED=8C=8C=EC=9D=BC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=90=98=EB=8F=8C=EB=A6=AC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Practice/AppDetailView.swift | 718 ------------------ 1 file changed, 718 deletions(-) delete mode 100644 35-seminar/Presentation/Week2/Practice/AppDetailView.swift diff --git a/35-seminar/Presentation/Week2/Practice/AppDetailView.swift b/35-seminar/Presentation/Week2/Practice/AppDetailView.swift deleted file mode 100644 index 97ed243..0000000 --- a/35-seminar/Presentation/Week2/Practice/AppDetailView.swift +++ /dev/null @@ -1,718 +0,0 @@ -// -// AppDetailView 2.swift -// 35-seminar -// -// Created by 김유림 on 10/25/24. -// - - -import UIKit -import SnapKit - -class AppDetailView: UIView { - - // MARK: - Properties - private let scrollView = UIScrollView() - private var contentStackView = UIStackView() - - // 타이틀뷰 - private let titleView = UIView() - private let iconImageView = UIImageView() - private let titleLabel = TitleLabel() - private let subtitleLabel = SubtitleLabel() - private let openButton = UIButton() - private let shareButton = UIButton() - - // 요약뷰 - private let summaryStackView = UIStackView() - private let verticalBorderView1 = BorderView() - private let verticalBorderView2 = BorderView() - - // 1번칸 - private let summaryRatingStackView = UIStackView() - private let summaryRatingTitleLabel = SubtitleLabel() - private let summaryRatingAverageLabel = SubtitleLabel() - private let summaryRatingStarStackView = StarStackView() - // 2번칸 - private let summaryPrizeStackView = UIStackView() - private let summaryPrizeTitleLabel = SubtitleLabel() - private let summaryPrizeContentImageView = UIImageView() - private let summaryPrizeSubtitleLabel = SubtitleLabel() - //3번칸 - private let summaryAgeStackView = UIStackView() - private let summaryAgeTitleLabel = SubtitleLabel() - private let summaryAgeLimitLabel = SubtitleLabel() - private let summaryAgeSubtitleLabel = SubtitleLabel() - - // 업데이트뷰 - private let updateView = UIView() - private let updateTitleLabel = TitleLabel() - private let updateSubtitleLabel = SubtitleLabel() - private let updateContentLabel = ContentLabel() - private let updateRecordButton = UIButton() - private let updateDateLabel = SubtitleLabel() - - // 미리보기뷰 - private let previewView = UIView() - private let previewTitleLabel = TitleLabel() - private let previewImageView = UIImageView() - private let previewDeviceImageView = UIImageView() - private let previewDeviceLabel = SubtitleLabel() - - // 앱 설명 뷰 - private let descriptionView = UIView() - private let descriptionLabel = ContentLabel() - private let descriptionMoreButton = UIButton() - - private let developerView = UIView() - private let developerNameLabel = ContentLabel() - private let developerRoleLabel = SubtitleLabel() - private let chevronImageView = UIImageView() - lazy var developerButton = UIButton() - - // 피드백 요약 뷰 - private let feedbackSummaryView = UIView() - private let feedbackSummaryTitleLabel = TitleLabel() - private let feedbackSummaryAverageLabel = TitleLabel() - private let feedbackSummarySubtitleLabel = SubtitleLabel() - lazy var feedbackSummaryAllButton = UIButton() - private let feedbackSummaryStarsImageView = UIImageView() - private let feedbackSummaryCountLabel = SubtitleLabel() - - // 피드백 뷰 - private let feedbackView = UIView() - private let feedbackTapToRateStackView = UIStackView() - private let feedbackTapToRateLabel = SubtitleLabel() - var feedbackTapToRateStarStackView = StarStackView() - - private let feedbackBoxView = UIView() - private let feedbackTitleLabel = ContentLabel() - private let feedbackStarStackView = StarStackView() - private let feedbackAuthorDateLabel = SubtitleLabel() - private let feedbackAuthorLabel = SubtitleLabel() - private let feedbackContentLabel = ContentLabel() - private let feedbackDeveloperTitleLabel = ContentLabel() - private let feedbackDeveloperContentLabel = ContentLabel() - private let feedbackDeveloperDateLabel = SubtitleLabel() - private let feedbackMoreButton1 = UIButton() - private let feedbackMoreButton2 = UIButton() - - private let feedbackWriteButton = UIButton() - private let appSupportButton = UIButton() - - // MARK: - Methods - override init(frame: CGRect) { - super.init(frame: frame) - setUI() - setHierarchy() - setConstraints() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: UI - private func setUI() { - self.backgroundColor = .systemBackground - contentStackView.axis = .vertical - contentStackView.spacing = 10 - - setTitleViewUI() - setSummaryViewUI() - setUpdateViewUI() - setPreviewViewUI() - setDescriptionViewUI() - setFeedbackSummaryViewUI() - setFeedbackViewUI() - } - - private func setTitleViewUI() { - iconImageView.image = UIImage(named: "toss_icon") - iconImageView.clipsToBounds = true - iconImageView.layer.cornerRadius = 20 - iconImageView.layer.borderColor = UIColor.systemGray5.cgColor - iconImageView.layer.borderWidth = 1 - - titleLabel.configureLabel(size: 23, weight: .semibold, text: "토스") - - subtitleLabel.text = "금융이 쉬워진다" - - openButton.configureButton(configType: .filled, - title: "열기", - fontWeight: .bold, - cornerStyle: .capsule, - foregroundColor: .white, - backgroundColor: .tintColor) - - shareButton.configureButton(systemName: "square.and.arrow.up", - symbolWeight: .medium) - - } - - private func setSummaryViewUI() { - summaryStackView.axis = .horizontal - summaryStackView.alignment = .center - - [summaryRatingStackView, summaryPrizeStackView, summaryAgeStackView].forEach { - $0.axis = .vertical - $0.alignment = .center - } - - [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { - $0.configureLabel(color: .secondaryLabel, size: 13, weight: .regular) - $0.textAlignment = .center - } - - [summaryRatingAverageLabel, summaryAgeLimitLabel].forEach { - $0.configureLabel(color: .secondaryLabel, size: 24, weight: .bold) - $0.textAlignment = .center - } - - [summaryPrizeSubtitleLabel, summaryAgeSubtitleLabel].forEach { - $0.configureLabel(color: .secondaryLabel, size: 15, weight: .regular) - $0.textAlignment = .center - } - - summaryRatingTitleLabel.text = "8.4만개의 평가" - summaryRatingAverageLabel.text = "4.4" - summaryRatingStarStackView.bind(4, .gray) - - summaryPrizeTitleLabel.text = "수상" - summaryPrizeContentImageView.image = UIImage(systemName: "person") - summaryPrizeContentImageView.tintColor = .secondaryLabel - summaryPrizeContentImageView.contentMode = .scaleAspectFit - summaryPrizeSubtitleLabel.text = "앱" - - summaryAgeTitleLabel.text = "연령" - summaryAgeLimitLabel.text = "4+" - summaryAgeSubtitleLabel.text = "세" - } - - private func setUpdateViewUI() { - updateTitleLabel.text = "새로운 소식" - updateSubtitleLabel.text = "버전 5.185.0" - updateContentLabel.text = "• 구석구석 숨어있던 버그들을 잡았어요. 또 다른 버그가 나타나면 토스 고객센터를 찾아주세요. 늘 열려있답니다. 365일 24시간 언제든지요." - updateContentLabel.setLineSpacing(8) - - updateRecordButton.configureButton(title: "버전 기록", fontSize: 19, fontWeight: .light, removeContentInsets: true) - updateDateLabel.text = "3시간 전" - } - - private func setPreviewViewUI() { - previewTitleLabel.text = "미리 보기" - - previewImageView.image = UIImage(named: "toss_preview") // NSBundle 오류 발생 - previewImageView.contentMode = .scaleAspectFill - previewImageView.clipsToBounds = true - previewImageView.layer.cornerRadius = 20 - previewImageView.layer.borderColor = UIColor.systemGray5.cgColor - previewImageView.layer.borderWidth = 1 - - previewDeviceImageView.image = UIImage.configureImage(systemName: "iphone", symbolWeight: .regular)?.withTintColor(.secondaryLabel) - previewDeviceImageView.contentMode = .scaleAspectFit - - previewDeviceLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .semibold, text: "iPhone") - } - - private func setDescriptionViewUI() { - let description = """ -토스뱅크, 토스증권 서비스를 이용하시려면 토스 앱 설치가 필요합니다. - • 내 금융 현황을 한눈에, 홈•소비 - • 모든 계좌의 모든 정보를 한 곳에서, 따로 보았던 예적금, 청약, 증권, 대출 계좌의 정보를 한 곳에서 확인할 수 있어 요. - • 얼마나 벌고 얼마나 썼을까? 한 달 동안의 수입과 소비를 시간순으로 모아볼 수 있고, 소비 분석 리포트도 제공해드 려요. - • 카드 실적 헷갈릴 필요 없이, 실적을 충족한 카드가 무엇 인지 얼마나 더 써야 실적을 달성하는지 한눈에 확인할 수 있어요. - • 매달 고정적으로 나가는 보험비, 생활요금, 구독료 등도 쉽게 확인할 수 있어요. - • 평생 무료로 간편하고 안전하게, 송금 - • 송금을 자유롭게, 토스에서는 은행 상관없이 수수료가 평 생 무료에요. - • 송금을 안전하게, 송금 전 사기계좌를 미리 조회해 안전 하게 송금할 수 있어요. - • 송금을 간편하게, 단 한 번의 터치까지 줄였어요. 최소한 의 터치로 송금하세요. - • 그리고 마음까지, 간단한 메시지와 이모티콘을 함께 보내 보세요. -""" - descriptionLabel.text = description - descriptionLabel.numberOfLines = 3 - descriptionLabel.setLineSpacing(8) - - descriptionMoreButton.configureButton(title: "더 보기", fontWeight: .light, removeContentInsets: true) - - developerNameLabel.configureLabel(color: .tintColor, size: 17, weight: .regular, text: "Viva Republica") - - developerRoleLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: "개발자") - - chevronImageView.image = UIImage(systemName: "chevron.right") - chevronImageView.contentMode = .scaleAspectFit - chevronImageView.tintColor = .secondaryLabel - } - - private func setFeedbackSummaryViewUI() { - feedbackSummaryTitleLabel.text = "평가 및 리뷰" - - feedbackSummaryAverageLabel.configureLabel(color: .label, size: 64, weight: .bold, text: "4.4") - - feedbackSummarySubtitleLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .bold, text: "5점 만점") - - feedbackSummaryAllButton.configureButton(title: "모두 보기", removeContentInsets: true) - - feedbackSummaryStarsImageView.image = UIImage(systemName: "photo")?.withTintColor(.secondaryLabel, renderingMode: .alwaysOriginal) - feedbackSummaryStarsImageView.backgroundColor = .systemGray5 - - feedbackSummaryCountLabel.text = "8.4만개의 평가" - } - - private func setFeedbackViewUI() { - feedbackTapToRateStackView.axis = .horizontal - feedbackTapToRateStackView.spacing = 10 - - feedbackTapToRateLabel.configureLabel(color: .secondaryLabel, size: 18, weight: .light, text: "탭하여 평가하기:") - feedbackTapToRateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) - - feedbackTapToRateStarStackView.setContentHuggingPriority(.defaultLow, for: .horizontal) - - feedbackBoxView.backgroundColor = .systemGray6 - feedbackBoxView.layer.cornerRadius = 10 - - feedbackTitleLabel.configureLabel(size: 18, weight: .semibold, text: "김유림") - - feedbackStarStackView.bind(2, .orange) - - feedbackAuthorDateLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .regular, text: "10월 25") - - feedbackAuthorLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .regular, text: "ISTJ") - - feedbackContentLabel.text = "1. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려 강산 대한 사람 대한으로 길이 보전하세" - feedbackContentLabel.setLineSpacing(4) - - feedbackDeveloperTitleLabel.configureLabel(size: 17, weight: .medium, text: "개발자 답변") - - feedbackDeveloperContentLabel.text = "안녕하세요, 감사합니다." - feedbackDeveloperContentLabel.setLineSpacing(4) - - feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .regular, text: "10월 25") - - [feedbackMoreButton1, feedbackMoreButton2].forEach { - $0.configureButton(title: "더 보기", removeContentInsets: true) - } - - feedbackWriteButton.configureButton(title: " 리뷰 작성", systemName: "square.and.pencil") - - appSupportButton.configureButton(title: " 앱 지원", systemName: "questionmark.circle") - } - - // MARK: - Hierarchy - private func setHierarchy() { - setBaseHierarchy() - setTitleViewHierarchy() - setSummaryViewHierarchy() - setUpdateViewHierarchy() - setPreviewViewHierarchy() - setDescriptionViewHierarchy() - setFeedbackSummaryViewHierarchy() - setFeedbackViewHierarchy() - } - - private func setBaseHierarchy() { - self.addSubview(scrollView) - scrollView.addSubview(contentStackView) - - [titleView, summaryStackView, updateView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { - let borderView = BorderView() - contentStackView.addArrangedSubview($0) - contentStackView.addArrangedSubview(borderView) - borderView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - $0.height.equalTo(0.5) - } - } - } - - private func setTitleViewHierarchy() { - [iconImageView, titleLabel, subtitleLabel, openButton, shareButton].forEach { - titleView.addSubview($0) - } - } - - private func setSummaryViewHierarchy() { - [summaryRatingStackView, verticalBorderView1, summaryPrizeStackView, verticalBorderView2, summaryAgeStackView].forEach { - summaryStackView.addArrangedSubview($0) - } - - [summaryRatingTitleLabel, summaryRatingAverageLabel, summaryRatingStarStackView].forEach { - summaryRatingStackView.addArrangedSubview($0) - } - - [summaryPrizeTitleLabel, summaryPrizeContentImageView, summaryPrizeSubtitleLabel].forEach { - summaryPrizeStackView.addArrangedSubview($0) - } - - [summaryAgeTitleLabel, summaryAgeLimitLabel, summaryAgeSubtitleLabel].forEach { - summaryAgeStackView.addArrangedSubview($0) - } - } - - private func setUpdateViewHierarchy() { - [updateTitleLabel, updateSubtitleLabel, updateContentLabel, updateRecordButton, updateDateLabel].forEach { - updateView.addSubview($0) - } - } - - private func setPreviewViewHierarchy() { - [previewTitleLabel, previewImageView, previewDeviceImageView, previewDeviceLabel].forEach { - previewView.addSubview($0) - } - } - - private func setDescriptionViewHierarchy() { - [descriptionLabel, descriptionMoreButton, developerView].forEach { - descriptionView.addSubview($0) - } - - [developerNameLabel, developerRoleLabel, chevronImageView, developerButton].forEach { - developerView.addSubview($0) - } - } - - private func setFeedbackSummaryViewHierarchy() { - [feedbackSummaryTitleLabel, feedbackSummaryAverageLabel, feedbackSummarySubtitleLabel, feedbackSummaryAllButton, feedbackSummaryStarsImageView, feedbackSummaryCountLabel].forEach { - feedbackSummaryView.addSubview($0) - } - } - - private func setFeedbackViewHierarchy() { - [feedbackTapToRateStackView, feedbackBoxView, feedbackWriteButton, appSupportButton].forEach { - feedbackView.addSubview($0) - } - - [feedbackTapToRateLabel, feedbackTapToRateStarStackView].forEach { - feedbackTapToRateStackView.addArrangedSubview($0) - } - - [feedbackTitleLabel, feedbackStarStackView, feedbackAuthorDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackDeveloperDateLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { - feedbackBoxView.addSubview($0) - } - } - - // MARK: - Constraints - private func setConstraints() { - setBaseConstraints() - setTitleViewConstraints() - setSummaryViewConstraints() - setUpdateViewConstraints() - setPreviewViewConstraints() - setDescriptionViewConstraints() - setFeedbackSummaryViewConstraints() - setFeedbackViewConstraints() - } - - private func setBaseConstraints() { - scrollView.snp.makeConstraints { - $0.edges.equalTo(self.safeAreaLayoutGuide) - } - - contentStackView.snp.makeConstraints { - $0.edges.equalToSuperview() - $0.width.equalToSuperview() - $0.height.greaterThanOrEqualToSuperview().priority(.low) - } - } - - private func setTitleViewConstraints() { - titleView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview() - } - - iconImageView.snp.makeConstraints { - $0.size.equalTo(128) - $0.leading.equalToSuperview().inset(20) - $0.top.equalToSuperview() - $0.bottom.equalToSuperview().inset(10) - } - - titleLabel.snp.makeConstraints { - $0.leading.equalTo(iconImageView.snp.trailing).offset(16) - $0.top.equalTo(iconImageView) - } - - subtitleLabel.snp.makeConstraints { - $0.leading.equalTo(titleLabel) - $0.top.equalTo(titleLabel.snp.bottom).offset(5) - } - - openButton.snp.makeConstraints { - $0.leading.equalTo(titleLabel) - $0.bottom.equalTo(iconImageView) - $0.width.equalTo(76) - $0.height.equalTo(34) - } - - shareButton.snp.makeConstraints { - $0.trailing.equalToSuperview().inset(20) - $0.bottom.equalTo(iconImageView) - } - } - - private func setSummaryViewConstraints() { - summaryStackView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - $0.height.equalTo(84) - } - - [verticalBorderView1, verticalBorderView2].forEach { - $0.snp.makeConstraints { - $0.height.equalTo(40) - $0.width.equalTo(0.5) - } - } - - summaryRatingStackView.snp.makeConstraints { - $0.height.equalToSuperview() - $0.width.equalTo(summaryPrizeStackView) - $0.width.equalTo(summaryAgeStackView) - } - - summaryPrizeStackView.snp.makeConstraints { - $0.height.equalToSuperview() - $0.width.equalTo(summaryRatingStackView) - $0.width.equalTo(summaryAgeStackView) - } - - summaryAgeStackView.snp.makeConstraints { - $0.height.equalToSuperview() - $0.width.equalTo(summaryPrizeStackView) - $0.width.equalTo(summaryRatingStackView) - } - - [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { - $0.snp.makeConstraints { - $0.height.equalTo(30) - } - } - - [summaryRatingAverageLabel, summaryPrizeContentImageView, summaryAgeLimitLabel].forEach { - $0.snp.makeConstraints { - $0.height.equalTo(30) - $0.horizontalEdges.equalToSuperview() - } - } - - [summaryRatingStarStackView, summaryPrizeSubtitleLabel, summaryAgeSubtitleLabel].forEach { - $0.snp.makeConstraints { - $0.height.equalTo(24) - $0.horizontalEdges.equalToSuperview().inset(16) - } - } - } - - private func setUpdateViewConstraints() { - updateView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - } - - updateTitleLabel.snp.makeConstraints { - $0.top.equalToSuperview() - $0.leading.equalToSuperview() - } - - updateSubtitleLabel.snp.makeConstraints { - $0.top.equalTo(updateTitleLabel.snp.bottom).offset(8) - $0.leading.equalTo(updateTitleLabel) - } - - updateContentLabel.snp.makeConstraints { - $0.top.equalTo(updateSubtitleLabel.snp.bottom).offset(16) - $0.horizontalEdges.equalToSuperview() - $0.bottom.equalToSuperview().inset(10) - } - - updateRecordButton.snp.makeConstraints { - $0.bottom.equalTo(updateTitleLabel) - $0.trailing.equalToSuperview() - } - - updateDateLabel.snp.makeConstraints { - $0.bottom.equalTo(updateSubtitleLabel) - $0.trailing.equalToSuperview() - } - } - - private func setPreviewViewConstraints() { - previewView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - } - - previewTitleLabel.snp.makeConstraints { - $0.top.leading.equalToSuperview() - } - - previewImageView.snp.makeConstraints { - $0.top.equalTo(previewTitleLabel.snp.bottom).offset(5) - $0.centerX.equalToSuperview() - $0.height.equalTo(500) - $0.width.equalTo(240) - } - - previewDeviceImageView.snp.makeConstraints { - $0.top.equalTo(previewImageView.snp.bottom).offset(10) - $0.leading.equalToSuperview() - $0.size.equalTo(22) - $0.bottom.equalToSuperview() - } - - previewDeviceLabel.snp.makeConstraints { - $0.bottom.equalTo(previewDeviceImageView) - $0.leading.equalTo(previewDeviceImageView.snp.trailing).offset(5) - } - } - - private func setDescriptionViewConstraints() { - descriptionView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - } - - descriptionLabel.snp.makeConstraints { - $0.top.horizontalEdges.equalToSuperview().offset(10) - } - - descriptionMoreButton.snp.makeConstraints { - $0.bottom.equalTo(descriptionLabel) - $0.trailing.equalToSuperview() - } - - developerView.snp.makeConstraints { - $0.top.equalTo(descriptionLabel.snp.bottom).offset(30) - $0.bottom.equalToSuperview().offset(-30) - $0.horizontalEdges.equalToSuperview() - } - - developerNameLabel.snp.makeConstraints { - $0.top.leading.equalToSuperview() - } - - developerRoleLabel.snp.makeConstraints { - $0.top.equalTo(developerNameLabel.snp.bottom).offset(2) - $0.leading.equalToSuperview() - $0.bottom.equalToSuperview() - } - - chevronImageView.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.trailing.equalToSuperview() - $0.size.equalTo(22) - } - } - - private func setFeedbackSummaryViewConstraints() { - feedbackSummaryView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - } - - feedbackSummaryTitleLabel.snp.makeConstraints { - $0.leading.top.equalToSuperview() - } - - feedbackSummaryAverageLabel.snp.makeConstraints { - $0.leading.equalToSuperview() - $0.top.equalTo(feedbackSummaryTitleLabel.snp.bottom) - $0.width.equalTo(120) - } - - feedbackSummarySubtitleLabel.snp.makeConstraints { - $0.centerX.equalTo(feedbackSummaryAverageLabel) - $0.top.equalTo(feedbackSummaryAverageLabel.snp.bottom) - $0.bottom.equalToSuperview().offset(-10) - } - - feedbackSummaryAllButton.snp.makeConstraints { - $0.trailing.equalToSuperview() - $0.centerY.equalTo(feedbackSummaryTitleLabel) - } - - feedbackSummaryStarsImageView.snp.makeConstraints { - $0.leading.equalTo(feedbackSummaryAverageLabel.snp.trailing).offset(30) - $0.trailing.equalToSuperview() - $0.verticalEdges.equalTo(feedbackSummaryAverageLabel).inset(5) - } - - feedbackSummaryCountLabel.snp.makeConstraints { - $0.trailing.equalToSuperview() - $0.centerY.equalTo(feedbackSummarySubtitleLabel) - } - } - - private func setFeedbackViewConstraints() { - feedbackView.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - } - - feedbackTapToRateStackView.snp.makeConstraints { - $0.top.horizontalEdges.equalToSuperview() - $0.height.equalTo(28) - } - - feedbackBoxView.snp.makeConstraints { - $0.top.equalTo(feedbackTapToRateStackView.snp.bottom).offset(20) - $0.horizontalEdges.equalToSuperview() - } - - feedbackTitleLabel.snp.makeConstraints { - $0.top.equalToSuperview().offset(18) - $0.leading.equalTo(feedbackContentLabel) - } - - feedbackStarStackView.snp.makeConstraints { - $0.leading.equalTo(feedbackContentLabel) - $0.top.equalTo(feedbackTitleLabel.snp.bottom).offset(4) - $0.height.equalTo(16) - $0.width.equalTo(80) - } - - feedbackAuthorDateLabel.snp.makeConstraints { - $0.trailing.equalTo(feedbackContentLabel) - $0.centerY.equalTo(feedbackTitleLabel) - } - - feedbackAuthorLabel.snp.makeConstraints { - $0.trailing.equalTo(feedbackContentLabel) - $0.centerY.equalTo(feedbackStarStackView) - } - - feedbackContentLabel.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - $0.top.equalTo(feedbackStarStackView.snp.bottom).offset(10) - } - - feedbackMoreButton1.snp.makeConstraints { - $0.bottom.trailing.equalTo(feedbackContentLabel) - } - - feedbackDeveloperTitleLabel.snp.makeConstraints { - $0.top.equalTo(feedbackContentLabel.snp.bottom).offset(15) - $0.leading.equalTo(feedbackContentLabel) - } - - feedbackDeveloperDateLabel.snp.makeConstraints { - $0.trailing.equalTo(feedbackContentLabel) - $0.centerY.equalTo(feedbackDeveloperTitleLabel) - } - - feedbackDeveloperContentLabel.snp.makeConstraints { - $0.horizontalEdges.equalTo(feedbackContentLabel) - $0.top.equalTo(feedbackDeveloperTitleLabel.snp.bottom).offset(5) - $0.bottom.equalToSuperview().offset(-20) - } - - feedbackMoreButton2.snp.makeConstraints { - $0.bottom.trailing.equalTo(feedbackDeveloperContentLabel) - } - - feedbackWriteButton.snp.makeConstraints { - $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) - $0.leading.equalTo(feedbackBoxView) - $0.bottom.equalToSuperview().offset(-10) - } - - appSupportButton.snp.makeConstraints { - $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) - $0.trailing.equalTo(feedbackBoxView) - } - } -} From 4d227f0cff852ddabe6694ea434cf89db3455abc Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 04:17:28 +0900 Subject: [PATCH 36/71] =?UTF-8?q?[Feat]=20#6=20-=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B6=80=EB=B6=84=20UIImage=20ex?= =?UTF-8?q?tension=20=ED=95=A8=EC=88=98=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Extensions/UIButton+Extension.swift | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift index ef08147..56a8504 100644 --- a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift @@ -15,9 +15,9 @@ enum ConfigurationType { extension UIButton { func configureButton(configType: ConfigurationType = .plain, title: String? = nil, - fontSize: CGFloat = 17, + fontSize: CGFloat = 15, fontWeight: UIFont.Weight = .regular, - image: UIImage? = nil, + systemName: String = "", symbolWeight: UIImage.SymbolWeight = .unspecified, cornerStyle: UIButton.Configuration.CornerStyle? = nil, foregroundColor: UIColor = .tintColor, @@ -40,11 +40,7 @@ extension UIButton { self.setAttributedTitle(attributedTitle, for: state) } - if let image = image { - let symbolConfig = UIImage.SymbolConfiguration(weight: symbolWeight) - let configuredImage = image.withConfiguration(symbolConfig) - config.image = configuredImage - } + config.image = UIImage.configureImage(systemName: systemName, symbolWeight: symbolWeight) if let cornerStyle = cornerStyle { config.cornerStyle = cornerStyle From 4b557dda66e01ebde3ac58be1a0e58f9804961aa Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 04:18:47 +0900 Subject: [PATCH 37/71] =?UTF-8?q?[Design]=20#6=20-=20=EC=83=89=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/Reusables/BorderView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Reusables/BorderView.swift b/35-seminar/Presentation/Week2/Reusables/BorderView.swift index 8a01785..02eabed 100644 --- a/35-seminar/Presentation/Week2/Reusables/BorderView.swift +++ b/35-seminar/Presentation/Week2/Reusables/BorderView.swift @@ -12,7 +12,7 @@ class BorderView: UIView { override init(frame: CGRect) { super.init(frame: frame) - self.backgroundColor = .systemGray5 + self.backgroundColor = .systemGray4 } required init(coder: NSCoder) { From 714216e820a8a061cf06218b216f2a8bde3a7e54 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 04:19:49 +0900 Subject: [PATCH 38/71] =?UTF-8?q?[Feat]=20#6=20-=20UIImage=20extension=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=82=AC=EC=9A=A9,=20yellow=20->=20orange?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/Reusables/StarStackView.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift index 56c97a1..00ea3b1 100644 --- a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift +++ b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift @@ -10,7 +10,7 @@ import UIKit enum StarColor { case tint case gray - case yellow + case orange } class StarStackView: UIStackView { @@ -25,8 +25,8 @@ class StarStackView: UIStackView { private let starImageView4 = UIImageView() private let starImageView5 = UIImageView() - private let starEmptyImage = UIImage(systemName: "star") - private let starFilledImage = UIImage(systemName:"star.fill") + private let starEmptyImage = UIImage.configureImage(systemName: "star", symbolWeight: .regular) + private let starFilledImage = UIImage.configureImage(systemName: "star.fill", symbolWeight: .regular) // MARK: - Methods override init(frame: CGRect) { @@ -74,8 +74,8 @@ class StarStackView: UIStackView { imageView.tintColor = .tintColor case .gray: imageView.tintColor = .secondaryLabel - case .yellow: - imageView.tintColor = .yellow + case .orange: + imageView.tintColor = .systemOrange } } } From 468fde9ff0b3fc300ddc5d48ba0804336c820dc5 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 04:20:37 +0900 Subject: [PATCH 39/71] =?UTF-8?q?[Design]=20#6=20-=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=ED=81=AC=EA=B8=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 20 ++++++++++++------- .../Week2/View/AppDetailView.swift | 19 +++++++++--------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index 7e3cacc..6409407 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -23,8 +23,9 @@ 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6312CBE6C6A00FB32AE /* Week1MainViewController.swift */; }; 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */; }; 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */; }; - 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */; }; 15EC30532CCA434700A0480B /* UIButton+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30522CCA434700A0480B /* UIButton+Extension.swift */; }; + 15EC30552CCAB69000A0480B /* AppDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30542CCAB69000A0480B /* AppDetailView.swift */; }; + 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */; }; 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */; }; 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */; }; /* End PBXBuildFile section */ @@ -47,8 +48,9 @@ 1590A6382CBE6C6A00FB32AE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 1590A6A02CBE737600FB32AE /* PractScrollViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PractScrollViewController.swift; sourceTree = ""; }; 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailViewController.swift; sourceTree = ""; }; - 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailView.swift; sourceTree = ""; }; 15EC30522CCA434700A0480B /* UIButton+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Extension.swift"; sourceTree = ""; }; + 15EC30542CCAB69000A0480B /* AppDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailView.swift; sourceTree = ""; }; + 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarStackView.swift; sourceTree = ""; }; 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -98,6 +100,7 @@ isa = PBXGroup; children = ( 15EC30522CCA434700A0480B /* UIButton+Extension.swift */, + 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */, 157119DC2CBE96F500362252 /* UILabel+Extension.swift */, ); path = Extensions; @@ -174,18 +177,18 @@ 157119DB2CBE96DE00362252 /* Extensions */, 157119D42CBE8FB700362252 /* Reusables */, 15F4FD092CC7405800C99A20 /* Practice */, - 15F4FD082CC73E1D00C99A20 /* Presentations */, + 15F4FD082CC73E1D00C99A20 /* View */, ); path = Week2; sourceTree = ""; }; - 15F4FD082CC73E1D00C99A20 /* Presentations */ = { + 15F4FD082CC73E1D00C99A20 /* View */ = { isa = PBXGroup; children = ( - 1590A6A52CBE8AA600FB32AE /* AppDetailView.swift */, + 15EC30542CCAB69000A0480B /* AppDetailView.swift */, 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */, ); - path = Presentations; + path = View; sourceTree = ""; }; 15F4FD092CC7405800C99A20 /* Practice */ = { @@ -276,12 +279,12 @@ files = ( 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */, 157119D82CBE965700362252 /* SubtitleLabel.swift in Sources */, + 15EC30552CCAB69000A0480B /* AppDetailView.swift in Sources */, 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */, 1590A6412CBE6C6A00FB32AE /* SceneDelegate.swift in Sources */, 157119D62CBE962F00362252 /* TitleLabel.swift in Sources */, 15EC30532CCA434700A0480B /* UIButton+Extension.swift in Sources */, 1590A6A42CBE8A9200FB32AE /* AppDetailViewController.swift in Sources */, - 1590A6A62CBE8AA600FB32AE /* AppDetailView.swift in Sources */, 1590A6422CBE6C6A00FB32AE /* Week1DetailView.swift in Sources */, 157119DA2CBE96BB00362252 /* ContentLabel.swift in Sources */, 1590A6432CBE6C6A00FB32AE /* Week1DetailViewController.swift in Sources */, @@ -289,6 +292,7 @@ 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */, 157119DD2CBE96F500362252 /* UILabel+Extension.swift in Sources */, 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */, + 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */, 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -321,6 +325,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -348,6 +353,7 @@ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.6; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 832ffd5..45e28f0 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -157,10 +157,11 @@ class AppDetailView: UIView { [summaryRatingStackView, summaryPrizeStackView, summaryAgeStackView].forEach { $0.axis = .vertical $0.alignment = .center + $0.distribution = .equalSpacing } [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { - $0.configureLabel(color: .secondaryLabel, size: 12, weight: .regular) + $0.configureLabel(color: .secondaryLabel, size: 11, weight: .regular) $0.textAlignment = .center } @@ -195,7 +196,7 @@ class AppDetailView: UIView { updateContentLabel.text = "• 구석구석 숨어있던 버그들을 잡았어요. 또 다른 버그가 나타나면 토스 고객센터를 찾아주세요. 늘 열려있답니다. 365일 24시간 언제든지요." updateContentLabel.setLineSpacing(8) - updateRecordButton.configureButton(title: "버전 기록", fontSize: 16, fontWeight: .light, removeContentInsets: true) + updateRecordButton.configureButton(title: "버전 기록", fontSize: 17, fontWeight: .regular, removeContentInsets: true) updateDateLabel.text = "3시간 전" } @@ -320,7 +321,7 @@ class AppDetailView: UIView { contentStackView.addArrangedSubview(borderView) borderView.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(20) - $0.height.equalTo(0.5) + $0.height.equalTo(0.4) } } } @@ -453,13 +454,13 @@ class AppDetailView: UIView { private func setSummaryViewConstraints() { summaryStackView.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(20) - $0.height.equalTo(84) + $0.height.equalTo(72) } [verticalBorderView1, verticalBorderView2].forEach { $0.snp.makeConstraints { $0.height.equalTo(40) - $0.width.equalTo(0.5) + $0.width.equalTo(0.4) } } @@ -483,21 +484,21 @@ class AppDetailView: UIView { [summaryRatingTitleLabel, summaryPrizeTitleLabel, summaryAgeTitleLabel].forEach { $0.snp.makeConstraints { - $0.height.equalTo(30) + $0.height.equalTo(20) } } [summaryRatingAverageLabel, summaryPrizeContentImageView, summaryAgeLimitLabel].forEach { $0.snp.makeConstraints { - $0.height.equalTo(30) + $0.height.equalTo(24) $0.horizontalEdges.equalToSuperview() } } [summaryRatingStarStackView, summaryPrizeSubtitleLabel, summaryAgeSubtitleLabel].forEach { $0.snp.makeConstraints { - $0.height.equalTo(24) - $0.horizontalEdges.equalToSuperview().inset(16) + $0.height.equalTo(20) + $0.horizontalEdges.equalToSuperview().inset(20) } } } From 6b4a67aaae4414fa31bd73cbb37799f87c00ecad Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 04:34:27 +0900 Subject: [PATCH 40/71] =?UTF-8?q?[Add,=20Feat]=20#6=20-=20=EB=B3=84?= =?UTF-8?q?=EC=A0=90=20=EC=9A=94=EC=95=BD=20=EC=82=AC=EC=A7=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailView.swift | 9 +++---- .../summary_stars.imageset/Contents.json | 22 ++++++++++++++++++ .../summary_stars_dark.png | Bin 0 -> 15842 bytes .../summary_stars_light.png | Bin 0 -> 8786 bytes 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 35-seminar/Resource/Assets.xcassets/summary_stars.imageset/Contents.json create mode 100644 35-seminar/Resource/Assets.xcassets/summary_stars.imageset/summary_stars_dark.png create mode 100644 35-seminar/Resource/Assets.xcassets/summary_stars.imageset/summary_stars_light.png diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 45e28f0..6f68569 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -254,8 +254,8 @@ class AppDetailView: UIView { feedbackSummaryAllButton.configureButton(title: "모두 보기", removeContentInsets: true) - feedbackSummaryStarsImageView.image = UIImage(systemName: "photo")?.withTintColor(.secondaryLabel, renderingMode: .alwaysOriginal) - feedbackSummaryStarsImageView.backgroundColor = .systemGray5 + feedbackSummaryStarsImageView.image = UIImage(named: "summary_stars") + feedbackSummaryStarsImageView.contentMode = .scaleAspectFit feedbackSummaryCountLabel.text = "8.4만개의 평가" } @@ -613,7 +613,8 @@ class AppDetailView: UIView { feedbackSummaryAverageLabel.snp.makeConstraints { $0.leading.equalToSuperview() $0.top.equalTo(feedbackSummaryTitleLabel.snp.bottom) - $0.width.equalTo(120) + $0.width.equalTo(100) + $0.height.equalTo(64) } feedbackSummarySubtitleLabel.snp.makeConstraints { @@ -628,7 +629,7 @@ class AppDetailView: UIView { } feedbackSummaryStarsImageView.snp.makeConstraints { - $0.leading.equalTo(feedbackSummaryAverageLabel.snp.trailing).offset(30) + $0.leading.equalTo(feedbackSummaryAverageLabel.snp.trailing).offset(20) $0.trailing.equalToSuperview() $0.verticalEdges.equalTo(feedbackSummaryAverageLabel).inset(5) } diff --git a/35-seminar/Resource/Assets.xcassets/summary_stars.imageset/Contents.json b/35-seminar/Resource/Assets.xcassets/summary_stars.imageset/Contents.json new file mode 100644 index 0000000..2dc0ab4 --- /dev/null +++ b/35-seminar/Resource/Assets.xcassets/summary_stars.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "summary_stars_light.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "summary_stars_dark.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/35-seminar/Resource/Assets.xcassets/summary_stars.imageset/summary_stars_dark.png b/35-seminar/Resource/Assets.xcassets/summary_stars.imageset/summary_stars_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c3fbfbe3d47d475581b06b5ff60cb7fe5abdd660 GIT binary patch literal 15842 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 literal 0 HcmV?d00001 From 9c76966aa39316db5e4726b9c4f193e54f86525f Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 05:07:03 +0900 Subject: [PATCH 41/71] =?UTF-8?q?[feat]=20#6=20-=20ConfigureImage=ED=95=A8?= =?UTF-8?q?=EC=88=98=20pointSize=20=EC=98=B5=EC=85=94=EB=84=90=EB=A1=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 --- .../Week2/Extensions/UIButton+Extension.swift | 3 ++- .../Week2/Extensions/UIImage+Extension.swift | 7 ++++++- .../Presentation/Week2/View/AppDetailView.swift | 11 +++++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift index 56a8504..4c79975 100644 --- a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift @@ -18,6 +18,7 @@ extension UIButton { fontSize: CGFloat = 15, fontWeight: UIFont.Weight = .regular, systemName: String = "", + pointSize: CGFloat? = nil, symbolWeight: UIImage.SymbolWeight = .unspecified, cornerStyle: UIButton.Configuration.CornerStyle? = nil, foregroundColor: UIColor = .tintColor, @@ -40,7 +41,7 @@ extension UIButton { self.setAttributedTitle(attributedTitle, for: state) } - config.image = UIImage.configureImage(systemName: systemName, symbolWeight: symbolWeight) + config.image = UIImage.configureImage(systemName: systemName, pointSize: pointSize, symbolWeight: symbolWeight) if let cornerStyle = cornerStyle { config.cornerStyle = cornerStyle diff --git a/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift index f2dec02..773fac1 100644 --- a/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift @@ -8,7 +8,12 @@ import UIKit extension UIImage { - class func configureImage(systemName: String, symbolWeight: UIImage.SymbolWeight) -> UIImage? { + class func configureImage(systemName: String, pointSize: CGFloat? = nil, symbolWeight: UIImage.SymbolWeight) -> UIImage? { + if let pointSize = pointSize { + let symbolConfig = UIImage.SymbolConfiguration(pointSize: pointSize, weight: symbolWeight) + return UIImage(systemName: systemName, withConfiguration: symbolConfig) + } + let symbolConfig = UIImage.SymbolConfiguration(weight: symbolWeight) return UIImage(systemName: systemName, withConfiguration: symbolConfig) } diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 6f68569..cab2798 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -140,13 +140,15 @@ class AppDetailView: UIView { openButton.configureButton(configType: .filled, title: "열기", + fontSize: 16, fontWeight: .bold, cornerStyle: .capsule, foregroundColor: .white, backgroundColor: .tintColor) shareButton.configureButton(systemName: "square.and.arrow.up", - symbolWeight: .medium) + pointSize: 16, + symbolWeight: .semibold) } @@ -441,13 +443,14 @@ class AppDetailView: UIView { openButton.snp.makeConstraints { $0.leading.equalTo(titleLabel) $0.bottom.equalTo(iconImageView) - $0.width.equalTo(76) - $0.height.equalTo(34) + $0.width.equalTo(72) + $0.height.equalTo(32) } shareButton.snp.makeConstraints { $0.trailing.equalToSuperview().inset(20) $0.bottom.equalTo(iconImageView) + $0.size.equalTo(32) } } @@ -554,7 +557,7 @@ class AppDetailView: UIView { previewDeviceImageView.snp.makeConstraints { $0.top.equalTo(previewImageView.snp.bottom).offset(10) $0.leading.equalToSuperview() - $0.size.equalTo(20) + $0.size.equalTo(18) $0.bottom.equalToSuperview().offset(-10) } From de8ae7f524257562123ab28445d63e3f0e150f1c Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 12:59:15 +0900 Subject: [PATCH 42/71] =?UTF-8?q?[Feat]=20#6=20-=20UIImage=20symbol=20weig?= =?UTF-8?q?ht=20=ED=95=A8=EC=88=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Extensions/UIButton+Extension.swift | 3 ++- .../Week2/Extensions/UIImage+Extension.swift | 7 ++++++- .../Presentation/Week2/View/AppDetailView.swift | 11 +++++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift index 56a8504..4c79975 100644 --- a/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UIButton+Extension.swift @@ -18,6 +18,7 @@ extension UIButton { fontSize: CGFloat = 15, fontWeight: UIFont.Weight = .regular, systemName: String = "", + pointSize: CGFloat? = nil, symbolWeight: UIImage.SymbolWeight = .unspecified, cornerStyle: UIButton.Configuration.CornerStyle? = nil, foregroundColor: UIColor = .tintColor, @@ -40,7 +41,7 @@ extension UIButton { self.setAttributedTitle(attributedTitle, for: state) } - config.image = UIImage.configureImage(systemName: systemName, symbolWeight: symbolWeight) + config.image = UIImage.configureImage(systemName: systemName, pointSize: pointSize, symbolWeight: symbolWeight) if let cornerStyle = cornerStyle { config.cornerStyle = cornerStyle diff --git a/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift index f2dec02..773fac1 100644 --- a/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UIImage+Extension.swift @@ -8,7 +8,12 @@ import UIKit extension UIImage { - class func configureImage(systemName: String, symbolWeight: UIImage.SymbolWeight) -> UIImage? { + class func configureImage(systemName: String, pointSize: CGFloat? = nil, symbolWeight: UIImage.SymbolWeight) -> UIImage? { + if let pointSize = pointSize { + let symbolConfig = UIImage.SymbolConfiguration(pointSize: pointSize, weight: symbolWeight) + return UIImage(systemName: systemName, withConfiguration: symbolConfig) + } + let symbolConfig = UIImage.SymbolConfiguration(weight: symbolWeight) return UIImage(systemName: systemName, withConfiguration: symbolConfig) } diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 6f68569..cab2798 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -140,13 +140,15 @@ class AppDetailView: UIView { openButton.configureButton(configType: .filled, title: "열기", + fontSize: 16, fontWeight: .bold, cornerStyle: .capsule, foregroundColor: .white, backgroundColor: .tintColor) shareButton.configureButton(systemName: "square.and.arrow.up", - symbolWeight: .medium) + pointSize: 16, + symbolWeight: .semibold) } @@ -441,13 +443,14 @@ class AppDetailView: UIView { openButton.snp.makeConstraints { $0.leading.equalTo(titleLabel) $0.bottom.equalTo(iconImageView) - $0.width.equalTo(76) - $0.height.equalTo(34) + $0.width.equalTo(72) + $0.height.equalTo(32) } shareButton.snp.makeConstraints { $0.trailing.equalToSuperview().inset(20) $0.bottom.equalTo(iconImageView) + $0.size.equalTo(32) } } @@ -554,7 +557,7 @@ class AppDetailView: UIView { previewDeviceImageView.snp.makeConstraints { $0.top.equalTo(previewImageView.snp.bottom).offset(10) $0.leading.equalToSuperview() - $0.size.equalTo(20) + $0.size.equalTo(18) $0.bottom.equalToSuperview().offset(-10) } From c5c8aee9be74d147a0c11c519f0c00e6ff1b4e70 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 15:29:43 +0900 Subject: [PATCH 43/71] =?UTF-8?q?[Feat]=20#6=20-=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=8D=BC=ED=8B=B0=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD(up?= =?UTF-8?q?date=20->=20vesrion)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailView.swift | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index cab2798..94e2872 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -44,13 +44,13 @@ class AppDetailView: UIView { private let summaryAgeLimitLabel = SubtitleLabel() private let summaryAgeSubtitleLabel = SubtitleLabel() - // 업데이트뷰 - private let updateView = UIView() - private let updateTitleLabel = TitleLabel() - private let updateSubtitleLabel = SubtitleLabel() - private let updateContentLabel = ContentLabel() - private let updateRecordButton = UIButton() - private let updateDateLabel = SubtitleLabel() + // 버전 뷰 + private let versionView = UIView() + private let versionTitleLabel = TitleLabel() + private let versionSubtitleLabel = SubtitleLabel() + private let versionContentLabel = ContentLabel() + private let versionRecordButton = UIButton() + private let versionDateLabel = SubtitleLabel() // 미리보기뷰 private let previewView = UIView() @@ -120,7 +120,7 @@ class AppDetailView: UIView { setTitleViewUI() setSummaryViewUI() - setUpdateViewUI() + setVersionViewUI() setPreviewViewUI() setDescriptionViewUI() setFeedbackSummaryViewUI() @@ -192,14 +192,14 @@ class AppDetailView: UIView { summaryAgeSubtitleLabel.text = "세" } - private func setUpdateViewUI() { - updateTitleLabel.text = "새로운 소식" - updateSubtitleLabel.text = "버전 5.185.0" - updateContentLabel.text = "• 구석구석 숨어있던 버그들을 잡았어요. 또 다른 버그가 나타나면 토스 고객센터를 찾아주세요. 늘 열려있답니다. 365일 24시간 언제든지요." - updateContentLabel.setLineSpacing(8) + private func setVersionViewUI() { + versionTitleLabel.text = "새로운 소식" + versionSubtitleLabel.text = "버전 5.185.0" + versionContentLabel.text = "• 구석구석 숨어있던 버그들을 잡았어요. 또 다른 버그가 나타나면 토스 고객센터를 찾아주세요. 늘 열려있답니다. 365일 24시간 언제든지요." + versionContentLabel.setLineSpacing(8) - updateRecordButton.configureButton(title: "버전 기록", fontSize: 17, fontWeight: .regular, removeContentInsets: true) - updateDateLabel.text = "3시간 전" + versionRecordButton.configureButton(title: "버전 기록", fontSize: 17, fontWeight: .regular, removeContentInsets: true) + versionDateLabel.text = "3시간 전" } private func setPreviewViewUI() { @@ -306,7 +306,7 @@ class AppDetailView: UIView { setBaseHierarchy() setTitleViewHierarchy() setSummaryViewHierarchy() - setUpdateViewHierarchy() + setVersioinViewHierarchy() setPreviewViewHierarchy() setDescriptionViewHierarchy() setFeedbackSummaryViewHierarchy() @@ -317,7 +317,7 @@ class AppDetailView: UIView { self.addSubview(scrollView) scrollView.addSubview(contentStackView) - [titleView, summaryStackView, updateView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { + [titleView, summaryStackView, versionView, previewView, descriptionView, feedbackSummaryView, feedbackView].forEach { let borderView = BorderView() contentStackView.addArrangedSubview($0) contentStackView.addArrangedSubview(borderView) @@ -352,9 +352,9 @@ class AppDetailView: UIView { } } - private func setUpdateViewHierarchy() { - [updateTitleLabel, updateSubtitleLabel, updateContentLabel, updateRecordButton, updateDateLabel].forEach { - updateView.addSubview($0) + private func setVersioinViewHierarchy() { + [versionTitleLabel, versionSubtitleLabel, versionContentLabel, versionRecordButton, versionDateLabel].forEach { + versionView.addSubview($0) } } @@ -399,7 +399,7 @@ class AppDetailView: UIView { setBaseConstraints() setTitleViewConstraints() setSummaryViewConstraints() - setUpdateViewConstraints() + setVersionViewConstraints() setPreviewViewConstraints() setDescriptionViewConstraints() setFeedbackSummaryViewConstraints() @@ -506,34 +506,34 @@ class AppDetailView: UIView { } } - private func setUpdateViewConstraints() { - updateView.snp.makeConstraints { + private func setVersionViewConstraints() { + versionView.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(20) } - updateTitleLabel.snp.makeConstraints { + versionTitleLabel.snp.makeConstraints { $0.top.equalToSuperview() $0.leading.equalToSuperview() } - updateSubtitleLabel.snp.makeConstraints { - $0.top.equalTo(updateTitleLabel.snp.bottom).offset(5) - $0.leading.equalTo(updateTitleLabel) + versionSubtitleLabel.snp.makeConstraints { + $0.top.equalTo(versionTitleLabel.snp.bottom).offset(5) + $0.leading.equalTo(versionTitleLabel) } - updateContentLabel.snp.makeConstraints { - $0.top.equalTo(updateSubtitleLabel.snp.bottom).offset(16) + versionContentLabel.snp.makeConstraints { + $0.top.equalTo(versionSubtitleLabel.snp.bottom).offset(16) $0.horizontalEdges.equalToSuperview() $0.bottom.equalToSuperview().inset(10) } - updateRecordButton.snp.makeConstraints { - $0.bottom.equalTo(updateTitleLabel) + versionRecordButton.snp.makeConstraints { + $0.bottom.equalTo(versionTitleLabel) $0.trailing.equalToSuperview() } - updateDateLabel.snp.makeConstraints { - $0.bottom.equalTo(updateSubtitleLabel) + versionDateLabel.snp.makeConstraints { + $0.bottom.equalTo(versionSubtitleLabel) $0.trailing.equalToSuperview() } } From dd8f4e0c08d9c03e3abd1d623432e2784084cd1c Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 15:30:50 +0900 Subject: [PATCH 44/71] =?UTF-8?q?[Add]=20#6=20-=20(VersionRecordVC)=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 4 ++++ .../Week2/View/VersionRecordViewController.swift | 15 +++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 35-seminar/Presentation/Week2/View/VersionRecordViewController.swift diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index 6409407..e2b3d68 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 15EC30532CCA434700A0480B /* UIButton+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30522CCA434700A0480B /* UIButton+Extension.swift */; }; 15EC30552CCAB69000A0480B /* AppDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30542CCAB69000A0480B /* AppDetailView.swift */; }; 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */; }; + 15EC30592CCB727300A0480B /* VersionRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */; }; 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */; }; 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */; }; /* End PBXBuildFile section */ @@ -51,6 +52,7 @@ 15EC30522CCA434700A0480B /* UIButton+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Extension.swift"; sourceTree = ""; }; 15EC30542CCAB69000A0480B /* AppDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailView.swift; sourceTree = ""; }; 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; + 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionRecordViewController.swift; sourceTree = ""; }; 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarStackView.swift; sourceTree = ""; }; 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -187,6 +189,7 @@ children = ( 15EC30542CCAB69000A0480B /* AppDetailView.swift */, 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */, + 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */, ); path = View; sourceTree = ""; @@ -277,6 +280,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 15EC30592CCB727300A0480B /* VersionRecordViewController.swift in Sources */, 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */, 157119D82CBE965700362252 /* SubtitleLabel.swift in Sources */, 15EC30552CCAB69000A0480B /* AppDetailView.swift in Sources */, diff --git a/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift b/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift new file mode 100644 index 0000000..4e378a0 --- /dev/null +++ b/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift @@ -0,0 +1,15 @@ +// +// VersionRecordViewController.swift +// 35-seminar +// +// Created by 김유림 on 10/25/24. +// + +import UIKit + +class VersionRecordViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + } +} From 40b1651e4256f2568a6eecf4374927f73c4420f1 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 15:49:04 +0900 Subject: [PATCH 45/71] =?UTF-8?q?[Feat]=20#6=20-=20VersionRecordVC=20?= =?UTF-8?q?=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailView.swift | 20 +++++++++---------- .../Week2/View/AppDetailViewController.swift | 9 +++++++++ .../View/VersionRecordViewController.swift | 1 + 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 94e2872..87d4106 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -20,8 +20,8 @@ class AppDetailView: UIView { private let iconImageView = UIImageView() private let titleLabel = TitleLabel() private let subtitleLabel = SubtitleLabel() - private let openButton = UIButton() - private let shareButton = UIButton() + let openButton = UIButton() + let shareButton = UIButton() // 요약뷰 private let summaryStackView = UIStackView() @@ -49,7 +49,7 @@ class AppDetailView: UIView { private let versionTitleLabel = TitleLabel() private let versionSubtitleLabel = SubtitleLabel() private let versionContentLabel = ContentLabel() - private let versionRecordButton = UIButton() + let versionRecordButton = UIButton() private let versionDateLabel = SubtitleLabel() // 미리보기뷰 @@ -62,20 +62,20 @@ class AppDetailView: UIView { // 앱 설명 뷰 private let descriptionView = UIView() private let descriptionLabel = ContentLabel() - private let descriptionMoreButton = UIButton() + let descriptionMoreButton = UIButton() private let developerView = UIView() private let developerNameLabel = ContentLabel() private let developerRoleLabel = SubtitleLabel() private let chevronImageView = UIImageView() - lazy var developerButton = UIButton() + let developerButton = UIButton() // 피드백 요약 뷰 private let feedbackSummaryView = UIView() private let feedbackSummaryTitleLabel = TitleLabel() private let feedbackSummaryAverageLabel = TitleLabel() private let feedbackSummarySubtitleLabel = SubtitleLabel() - lazy var feedbackSummaryAllButton = UIButton() + let feedbackSummaryAllButton = UIButton() private let feedbackSummaryStarsImageView = UIImageView() private let feedbackSummaryCountLabel = SubtitleLabel() @@ -94,11 +94,11 @@ class AppDetailView: UIView { private let feedbackDeveloperTitleLabel = ContentLabel() private let feedbackDeveloperContentLabel = ContentLabel() private let feedbackDeveloperDateLabel = SubtitleLabel() - private let feedbackMoreButton1 = UIButton() - private let feedbackMoreButton2 = UIButton() + let feedbackMoreButton1 = UIButton() + let feedbackMoreButton2 = UIButton() - private let feedbackWriteButton = UIButton() - private let appSupportButton = UIButton() + let feedbackWriteButton = UIButton() + let appSupportButton = UIButton() // MARK: - Methods override init(frame: CGRect) { diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index d8f6d05..0ad1558 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -19,5 +19,14 @@ class AppDetailViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + setButtonAction() + } + + private func setButtonAction() { + appDetailView.versionRecordButton.addTarget(self, action: #selector (tappedVersionRecordButton), for: .touchUpInside) + } + + @objc private func tappedVersionRecordButton() { + self.navigationController?.pushViewController(VersionRecordViewController(), animated: true) } } diff --git a/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift b/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift index 4e378a0..c9f08b3 100644 --- a/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift +++ b/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift @@ -11,5 +11,6 @@ class VersionRecordViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + view.backgroundColor = .systemBackground } } From 6ee36ee6f4294330a7496cbdd7982955f7a212eb Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 15:52:07 +0900 Subject: [PATCH 46/71] =?UTF-8?q?[Add,=20Feat]=20#6=20-=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=ED=8F=89=EA=B0=80=20=EB=B0=8F=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20VC=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 4 ++++ .../Week2/View/AllFeedbackViewController.swift | 16 ++++++++++++++++ .../Week2/View/AppDetailViewController.swift | 6 ++++++ 3 files changed, 26 insertions(+) create mode 100644 35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index e2b3d68..ce3f611 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ 15EC30552CCAB69000A0480B /* AppDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30542CCAB69000A0480B /* AppDetailView.swift */; }; 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */; }; 15EC30592CCB727300A0480B /* VersionRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */; }; + 15EC305B2CCB76F500A0480B /* AllFeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */; }; 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */; }; 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */; }; /* End PBXBuildFile section */ @@ -53,6 +54,7 @@ 15EC30542CCAB69000A0480B /* AppDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDetailView.swift; sourceTree = ""; }; 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionRecordViewController.swift; sourceTree = ""; }; + 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllFeedbackViewController.swift; sourceTree = ""; }; 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarStackView.swift; sourceTree = ""; }; 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -189,6 +191,7 @@ children = ( 15EC30542CCAB69000A0480B /* AppDetailView.swift */, 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */, + 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */, 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */, ); path = View; @@ -296,6 +299,7 @@ 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */, 157119DD2CBE96F500362252 /* UILabel+Extension.swift in Sources */, 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */, + 15EC305B2CCB76F500A0480B /* AllFeedbackViewController.swift in Sources */, 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */, 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */, ); diff --git a/35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift b/35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift new file mode 100644 index 0000000..5fba47f --- /dev/null +++ b/35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift @@ -0,0 +1,16 @@ +// +// AllFeedbackViewController.swift +// 35-seminar +// +// Created by 김유림 on 10/25/24. +// + +import UIKit + +class AllFeedbackViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + } +} diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index 0ad1558..3d9c277 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -24,9 +24,15 @@ class AppDetailViewController: UIViewController { private func setButtonAction() { appDetailView.versionRecordButton.addTarget(self, action: #selector (tappedVersionRecordButton), for: .touchUpInside) + + appDetailView.feedbackSummaryAllButton.addTarget(self, action: #selector (tappedFeedbackSummaryAllButton), for: .touchUpInside) } @objc private func tappedVersionRecordButton() { self.navigationController?.pushViewController(VersionRecordViewController(), animated: true) } + + @objc private func tappedFeedbackSummaryAllButton() { + self.navigationController?.pushViewController(AllFeedbackViewController(), animated: true) + } } From 2bdba1f4b79220780a5d2a011630ecbd383fdd9f Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 16:04:28 +0900 Subject: [PATCH 47/71] =?UTF-8?q?[Add]=20#6=20-=20FeedbackWrite=20View,=20?= =?UTF-8?q?VC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 8 ++++ .../Week2/View/FeedbackWriteView.swift | 37 +++++++++++++++++++ .../View/FeedbackWriteViewController.swift | 23 ++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 35-seminar/Presentation/Week2/View/FeedbackWriteView.swift create mode 100644 35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index ce3f611..369e062 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */; }; 15EC30592CCB727300A0480B /* VersionRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */; }; 15EC305B2CCB76F500A0480B /* AllFeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */; }; + 15EC305D2CCB792300A0480B /* FeedbackWriteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC305C2CCB792300A0480B /* FeedbackWriteViewController.swift */; }; + 15EC305F2CCB793500A0480B /* FeedbackWriteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC305E2CCB793500A0480B /* FeedbackWriteView.swift */; }; 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */; }; 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */; }; /* End PBXBuildFile section */ @@ -55,6 +57,8 @@ 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionRecordViewController.swift; sourceTree = ""; }; 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllFeedbackViewController.swift; sourceTree = ""; }; + 15EC305C2CCB792300A0480B /* FeedbackWriteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackWriteViewController.swift; sourceTree = ""; }; + 15EC305E2CCB793500A0480B /* FeedbackWriteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackWriteView.swift; sourceTree = ""; }; 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarStackView.swift; sourceTree = ""; }; 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -192,6 +196,8 @@ 15EC30542CCAB69000A0480B /* AppDetailView.swift */, 1590A6A32CBE8A9200FB32AE /* AppDetailViewController.swift */, 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */, + 15EC305E2CCB793500A0480B /* FeedbackWriteView.swift */, + 15EC305C2CCB792300A0480B /* FeedbackWriteViewController.swift */, 15EC30582CCB727300A0480B /* VersionRecordViewController.swift */, ); path = View; @@ -296,9 +302,11 @@ 157119DA2CBE96BB00362252 /* ContentLabel.swift in Sources */, 1590A6432CBE6C6A00FB32AE /* Week1DetailViewController.swift in Sources */, 1590A6442CBE6C6A00FB32AE /* Week1MainView.swift in Sources */, + 15EC305D2CCB792300A0480B /* FeedbackWriteViewController.swift in Sources */, 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */, 157119DD2CBE96F500362252 /* UILabel+Extension.swift in Sources */, 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */, + 15EC305F2CCB793500A0480B /* FeedbackWriteView.swift in Sources */, 15EC305B2CCB76F500A0480B /* AllFeedbackViewController.swift in Sources */, 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */, 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */, diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift new file mode 100644 index 0000000..036447b --- /dev/null +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift @@ -0,0 +1,37 @@ +// +// FeedbackWriteView.swift +// 35-seminar +// +// Created by 김유림 on 10/25/24. +// + +import UIKit + +class FeedbackWriteView: UIView { + + // MARK: - Properties + + // MARK: - Methods + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + setHierarchy() + setConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUI() { + + } + + private func setHierarchy() { + + } + + private func setConstraints() { + + } +} diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift new file mode 100644 index 0000000..313dd47 --- /dev/null +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift @@ -0,0 +1,23 @@ +// +// FeedbackWriteViewController.swift +// 35-seminar +// +// Created by 김유림 on 10/25/24. +// + +import UIKit + +class FeedbackWriteViewController: UIViewController { + + // MARK: - Properties + private let feedbackWriteView = FeedbackWriteView() + + // MARK: - Methods + override func loadView() { + view = feedbackWriteView + } + + override func viewDidLoad() { + super.viewDidLoad() + } +} From 683696c47df89692e6a0b321db395491a0b894bf Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 16:46:56 +0900 Subject: [PATCH 48/71] =?UTF-8?q?[Feat]=20#6=20-=20FeedbackWriteView=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/FeedbackWriteView.swift | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift index 036447b..612567b 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift @@ -6,10 +6,21 @@ // import UIKit +import SnapKit class FeedbackWriteView: UIView { // MARK: - Properties + private let titleLabel = UILabel() + let cancelButton = UIButton() + let sendButton = UIButton() + + let tapToRateStarStackView = StarStackView() + private let tapToRateGuideLabel = SubtitleLabel() + + let feedbackStackView = UIStackView() + let feedbackTitleTextField = UITextField() + let feedbackTextView = UITextView() // MARK: - Methods override init(frame: CGRect) { @@ -24,14 +35,76 @@ class FeedbackWriteView: UIView { } private func setUI() { + self.backgroundColor = .systemBackground + + titleLabel.configureLabel(size: 17, weight: .medium, text: "리뷰 작성하기") + + cancelButton.configureButton(title: "취소", fontSize: 17, fontWeight: .regular, removeContentInsets: true) + + sendButton.configureButton(title: "보내기", fontSize: 17, fontWeight: .medium, removeContentInsets: true) + + tapToRateGuideLabel.configureLabel(color: .secondaryLabel, size: 10, weight: .regular, text: "별점을 탭하여 평가하기") + feedbackStackView.axis = .vertical + feedbackStackView.spacing = 10 + + feedbackTitleTextField.placeholder = "제목" + feedbackTitleTextField.setContentHuggingPriority(.defaultHigh, for: .vertical) + + feedbackTextView.text = "리뷰(선택사항)" + feedbackTextView.textContainerInset = .zero + feedbackTextView.textContainer.lineFragmentPadding = 0 + feedbackTextView.font = .systemFont(ofSize: 15, weight: .regular) } private func setHierarchy() { + [cancelButton, sendButton, titleLabel, tapToRateStarStackView, tapToRateGuideLabel, feedbackStackView].forEach { + self.addSubview($0) + } + [feedbackTitleTextField, feedbackTextView].forEach { + let border = BorderView() + feedbackStackView.addArrangedSubview(border) + feedbackStackView.addArrangedSubview($0) + + border.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(0.4) + } + } } private func setConstraints() { + titleLabel.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.top.equalToSuperview().offset(20) + } + + cancelButton.snp.makeConstraints { + $0.leading.equalToSuperview().offset(20) + $0.top.equalTo(titleLabel) + } + + sendButton.snp.makeConstraints { + $0.trailing.equalToSuperview().offset(-20) + $0.top.equalTo(titleLabel) + } + + tapToRateStarStackView.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(30) + $0.centerX.equalToSuperview() + $0.width.equalTo(200) + } + + tapToRateGuideLabel.snp.makeConstraints { + $0.top.equalTo(tapToRateStarStackView.snp.bottom).offset(2) + $0.centerX.equalToSuperview() + } + feedbackStackView.snp.makeConstraints { + $0.top.equalTo(tapToRateGuideLabel.snp.bottom).offset(2) + $0.horizontalEdges.equalToSuperview().inset(20) + $0.bottom.equalTo(self.safeAreaLayoutGuide) + } } } From b2fc57a133454da795675d5c7e89352e8b843c44 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 16:47:35 +0900 Subject: [PATCH 49/71] =?UTF-8?q?[Refactor]=20#6=20-=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=EC=A0=9C=EC=96=B4=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/View/AppDetailView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 87d4106..0cc16ad 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -13,7 +13,7 @@ class AppDetailView: UIView { // MARK: - Properties private let scrollView = UIScrollView() - private var contentStackView = UIStackView() + private let contentStackView = UIStackView() // 타이틀뷰 private let titleView = UIView() @@ -83,7 +83,7 @@ class AppDetailView: UIView { private let feedbackView = UIView() private let feedbackTapToRateStackView = UIStackView() private let feedbackTapToRateLabel = SubtitleLabel() - var feedbackTapToRateStarStackView = StarStackView() + let feedbackTapToRateStarStackView = StarStackView() private let feedbackBoxView = UIView() private let feedbackTitleLabel = ContentLabel() From 3e75b73d7e0d1c88529b72eabe55fe54fad2f42f Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 16:47:58 +0900 Subject: [PATCH 50/71] =?UTF-8?q?[Feat]=20#6=20-=20FeedbackWriteView=20?= =?UTF-8?q?=EB=AA=A8=EB=8B=AC=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/View/AppDetailViewController.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index 3d9c277..b96a022 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -26,6 +26,8 @@ class AppDetailViewController: UIViewController { appDetailView.versionRecordButton.addTarget(self, action: #selector (tappedVersionRecordButton), for: .touchUpInside) appDetailView.feedbackSummaryAllButton.addTarget(self, action: #selector (tappedFeedbackSummaryAllButton), for: .touchUpInside) + + appDetailView.feedbackWriteButton.addTarget(self, action: #selector(tappedFeedbackWriteButton), for: .touchUpInside) } @objc private func tappedVersionRecordButton() { @@ -35,4 +37,8 @@ class AppDetailViewController: UIViewController { @objc private func tappedFeedbackSummaryAllButton() { self.navigationController?.pushViewController(AllFeedbackViewController(), animated: true) } + + @objc private func tappedFeedbackWriteButton() { + self.present(FeedbackWriteViewController(), animated: true) + } } From 1cdafd434ca0be004fff097a5a6be2c0f33685c8 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 16:55:13 +0900 Subject: [PATCH 51/71] =?UTF-8?q?[Design]=20=ED=8F=B0=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/View/AppDetailView.swift | 4 ++-- .../Presentation/Week2/View/FeedbackWriteView.swift | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 0cc16ad..4b03cf0 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -296,9 +296,9 @@ class AppDetailView: UIView { $0.configureButton(title: "더 보기", removeContentInsets: true) } - feedbackWriteButton.configureButton(title: " 리뷰 작성", systemName: "square.and.pencil") + feedbackWriteButton.configureButton(title: " 리뷰 작성", fontSize: 17, systemName: "square.and.pencil") - appSupportButton.configureButton(title: " 앱 지원", systemName: "questionmark.circle") + appSupportButton.configureButton(title: " 앱 지원", fontSize: 17, systemName: "questionmark.circle") } // MARK: - Hierarchy diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift index 612567b..5dafe70 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift @@ -37,11 +37,11 @@ class FeedbackWriteView: UIView { private func setUI() { self.backgroundColor = .systemBackground - titleLabel.configureLabel(size: 17, weight: .medium, text: "리뷰 작성하기") + titleLabel.configureLabel(size: 17, weight: .semibold, text: "리뷰 작성하기") - cancelButton.configureButton(title: "취소", fontSize: 17, fontWeight: .regular, removeContentInsets: true) + cancelButton.configureButton(title: "취소", fontSize: 17, fontWeight: .medium, removeContentInsets: true) - sendButton.configureButton(title: "보내기", fontSize: 17, fontWeight: .medium, removeContentInsets: true) + sendButton.configureButton(title: "보내기", fontSize: 17, fontWeight: .semibold, removeContentInsets: true) tapToRateGuideLabel.configureLabel(color: .secondaryLabel, size: 10, weight: .regular, text: "별점을 탭하여 평가하기") @@ -49,12 +49,13 @@ class FeedbackWriteView: UIView { feedbackStackView.spacing = 10 feedbackTitleTextField.placeholder = "제목" + feedbackTitleTextField.font = .systemFont(ofSize: 17, weight: .regular) feedbackTitleTextField.setContentHuggingPriority(.defaultHigh, for: .vertical) feedbackTextView.text = "리뷰(선택사항)" feedbackTextView.textContainerInset = .zero feedbackTextView.textContainer.lineFragmentPadding = 0 - feedbackTextView.font = .systemFont(ofSize: 15, weight: .regular) + feedbackTextView.font = .systemFont(ofSize: 17, weight: .regular) } private func setHierarchy() { @@ -93,7 +94,7 @@ class FeedbackWriteView: UIView { tapToRateStarStackView.snp.makeConstraints { $0.top.equalTo(titleLabel.snp.bottom).offset(30) $0.centerX.equalToSuperview() - $0.width.equalTo(200) + $0.width.equalTo(180) } tapToRateGuideLabel.snp.makeConstraints { From 14a08bf5d8566ed635e50dbc22a662a48c2137c6 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 16:57:34 +0900 Subject: [PATCH 52/71] =?UTF-8?q?[Feat]=20#6=20-=20=EC=B7=A8=EC=86=8C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20dismiss=20=EC=95=A1=EC=85=98=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/FeedbackWriteViewController.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift index 313dd47..fedb844 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift @@ -19,5 +19,14 @@ class FeedbackWriteViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + setButtonAction() + } + + private func setButtonAction() { + feedbackWriteView.cancelButton.addTarget(self, action: #selector(tappedCancelButton), for: .touchUpInside) + } + + @objc private func tappedCancelButton() { + self.dismiss(animated: true) } } From f0d299cc72e3abc92dd08fd63e97755f091cc5f0 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 18:34:24 +0900 Subject: [PATCH 53/71] =?UTF-8?q?[Add,=20Feat]=20#6=20-=20date=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20str=20=EB=B3=80=ED=99=98=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Extensions/Date+Extension.swift | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 35-seminar/Presentation/Week2/Extensions/Date+Extension.swift diff --git a/35-seminar/Presentation/Week2/Extensions/Date+Extension.swift b/35-seminar/Presentation/Week2/Extensions/Date+Extension.swift new file mode 100644 index 0000000..ba812d0 --- /dev/null +++ b/35-seminar/Presentation/Week2/Extensions/Date+Extension.swift @@ -0,0 +1,35 @@ +// +// Date+Extension.swift +// 35-seminar +// +// Created by 김유림 on 10/25/24. +// + +import Foundation + +extension Date { + static func form(year: Int, month: Int, day: Int) -> Date? { + var dateComponents = DateComponents() + dateComponents.year = year + dateComponents.month = month + dateComponents.day = day + + return Calendar.current.date(from: dateComponents) + } + + static func formattedDate(date: Date?) -> String { + guard let inputDate = date else { return "날짜 없음" } + + let currentYear = Calendar.current.component(.year, from: Date()) + let inputYear = Calendar.current.component(.year, from: inputDate) + let yearDifference = currentYear - inputYear + + guard yearDifference > 0 else { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "M월 d" + return dateFormatter.string(from: inputDate) + } + + return "\(yearDifference)년 전" + } +} From ccda275f047fb3027b0194ab26756dda9ab4f190 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 18:34:58 +0900 Subject: [PATCH 54/71] [Add] #6 - (Date+Extension) --- 35-seminar.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index 369e062..4bee294 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -30,6 +30,7 @@ 15EC305B2CCB76F500A0480B /* AllFeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */; }; 15EC305D2CCB792300A0480B /* FeedbackWriteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC305C2CCB792300A0480B /* FeedbackWriteViewController.swift */; }; 15EC305F2CCB793500A0480B /* FeedbackWriteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC305E2CCB793500A0480B /* FeedbackWriteView.swift */; }; + 15EC30612CCB8E9C00A0480B /* Date+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15EC30602CCB8E9C00A0480B /* Date+Extension.swift */; }; 15F4FD072CC73D0A00C99A20 /* StarStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */; }; 15F4FD0F2CC7649A00C99A20 /* BorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */; }; /* End PBXBuildFile section */ @@ -59,6 +60,7 @@ 15EC305A2CCB76F500A0480B /* AllFeedbackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllFeedbackViewController.swift; sourceTree = ""; }; 15EC305C2CCB792300A0480B /* FeedbackWriteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackWriteViewController.swift; sourceTree = ""; }; 15EC305E2CCB793500A0480B /* FeedbackWriteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackWriteView.swift; sourceTree = ""; }; + 15EC30602CCB8E9C00A0480B /* Date+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extension.swift"; sourceTree = ""; }; 15F4FD062CC73D0A00C99A20 /* StarStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarStackView.swift; sourceTree = ""; }; 15F4FD0E2CC7649A00C99A20 /* BorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BorderView.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -110,6 +112,7 @@ 15EC30522CCA434700A0480B /* UIButton+Extension.swift */, 15EC30562CCAC33700A0480B /* UIImage+Extension.swift */, 157119DC2CBE96F500362252 /* UILabel+Extension.swift */, + 15EC30602CCB8E9C00A0480B /* Date+Extension.swift */, ); path = Extensions; sourceTree = ""; @@ -290,6 +293,7 @@ buildActionMask = 2147483647; files = ( 15EC30592CCB727300A0480B /* VersionRecordViewController.swift in Sources */, + 15EC30612CCB8E9C00A0480B /* Date+Extension.swift in Sources */, 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */, 157119D82CBE965700362252 /* SubtitleLabel.swift in Sources */, 15EC30552CCAB69000A0480B /* AppDetailView.swift in Sources */, From 4ed71376eeec2c98557fff88846d03d3b701f351 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 18:35:53 +0900 Subject: [PATCH 55/71] =?UTF-8?q?[Feat]=20#6=20-=20Feedback=20=EB=B3=B4?= =?UTF-8?q?=EB=82=B4=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84(de?= =?UTF-8?q?legate=20=ED=8C=A8=ED=84=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailView.swift | 52 +++++++++++++++---- .../Week2/View/AppDetailViewController.swift | 11 +++- .../Week2/View/FeedbackWriteView.swift | 11 ++++ .../View/FeedbackWriteViewController.swift | 8 +++ 4 files changed, 72 insertions(+), 10 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 4b03cf0..0f82041 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -9,9 +9,32 @@ import UIKit import SnapKit +struct Feedback { + let title: String + let author: String + let starCount: Int + let authorDate: Date? + let content: String + let developerContent: String + let developerDate: Date? +} + +protocol FeedbackDelegate: AnyObject { + func dataBind(feedback: Feedback) +} + class AppDetailView: UIView { // MARK: - Properties + // data + private var feedback: Feedback = .init(title: "김유림", + author: "ISTJ", + starCount: 2, + authorDate: Date.form(year: 2023, month: 8, day: 25), + content: "1. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려 강산 대한 사람 대한으로 길이 보전하세", + developerContent: "안녕하세요, 토스팀입니다. 소중한 의견을 주셔서 너무나 감사합니다.", + developerDate: Date.form(year: 2024, month: 1, day: 25)) + private let scrollView = UIScrollView() private let contentStackView = UIStackView() @@ -88,7 +111,7 @@ class AppDetailView: UIView { private let feedbackBoxView = UIView() private let feedbackTitleLabel = ContentLabel() private let feedbackStarStackView = StarStackView() - private let feedbackAuthorDateLabel = SubtitleLabel() + private let feedbackDateLabel = SubtitleLabel() private let feedbackAuthorLabel = SubtitleLabel() private let feedbackContentLabel = ContentLabel() private let feedbackDeveloperTitleLabel = ContentLabel() @@ -274,23 +297,23 @@ class AppDetailView: UIView { feedbackBoxView.backgroundColor = .systemGray6 feedbackBoxView.layer.cornerRadius = 10 - feedbackTitleLabel.configureLabel(size: 15, weight: .semibold, text: "김유림") + feedbackTitleLabel.configureLabel(size: 15, weight: .semibold, text: feedback.title) feedbackStarStackView.bind(2, .orange) - feedbackAuthorDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: "10월 25") + feedbackDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback.authorDate)) - feedbackAuthorLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .regular, text: "ISTJ") + feedbackAuthorLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .regular, text: feedback.author) - feedbackContentLabel.text = "1. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려 강산 대한 사람 대한으로 길이 보전하세" + feedbackContentLabel.text = feedback.content feedbackContentLabel.setLineSpacing(4) feedbackDeveloperTitleLabel.configureLabel(size: 15, weight: .medium, text: "개발자 답변") - feedbackDeveloperContentLabel.text = "안녕하세요, 감사합니다." + feedbackDeveloperContentLabel.text = feedback.developerContent feedbackDeveloperContentLabel.setLineSpacing(4) - feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: "10월 25") + feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback.authorDate)) [feedbackMoreButton1, feedbackMoreButton2].forEach { $0.configureButton(title: "더 보기", removeContentInsets: true) @@ -389,7 +412,7 @@ class AppDetailView: UIView { feedbackTapToRateStackView.addArrangedSubview($0) } - [feedbackTitleLabel, feedbackStarStackView, feedbackAuthorDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackDeveloperDateLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { + [feedbackTitleLabel, feedbackStarStackView, feedbackDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackDeveloperDateLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { feedbackBoxView.addSubview($0) } } @@ -670,7 +693,7 @@ class AppDetailView: UIView { $0.width.equalTo(80) } - feedbackAuthorDateLabel.snp.makeConstraints { + feedbackDateLabel.snp.makeConstraints { $0.trailing.equalTo(feedbackContentLabel) $0.centerY.equalTo(feedbackTitleLabel) } @@ -720,4 +743,15 @@ class AppDetailView: UIView { $0.trailing.equalTo(feedbackBoxView) } } + + func dataBind(feedback: Feedback) { + self.feedback = feedback + feedbackTitleLabel.text = feedback.title + feedbackAuthorLabel.text = feedback.author + feedbackStarStackView.bind(feedback.starCount, .orange) + feedbackDateLabel.text = Date.formattedDate(date: feedback.authorDate) + feedbackContentLabel.text = feedback.content + feedbackDeveloperContentLabel.text = feedback.developerContent + feedbackDeveloperDateLabel.text = Date.formattedDate(date: feedback.developerDate) + } } diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index b96a022..b49e067 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -39,6 +39,15 @@ class AppDetailViewController: UIViewController { } @objc private func tappedFeedbackWriteButton() { - self.present(FeedbackWriteViewController(), animated: true) + let feedbackWriteVC = FeedbackWriteViewController() + feedbackWriteVC.delegate = self + self.present(feedbackWriteVC, animated: true) + } +} + + +extension AppDetailViewController: FeedbackDelegate { + func dataBind(feedback: Feedback) { + appDetailView.dataBind(feedback: feedback) } } diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift index 5dafe70..028debd 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift @@ -108,4 +108,15 @@ class FeedbackWriteView: UIView { $0.bottom.equalTo(self.safeAreaLayoutGuide) } } + + func returnFeedback() -> Feedback { + let feedback = Feedback(title: feedbackTitleTextField.text ?? "", + author: "김유림", + starCount: 5, + authorDate: Date(), + content: feedbackTextView.text ?? "", + developerContent: "", + developerDate: nil) + return feedback + } } diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift index fedb844..232c0cc 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift @@ -11,6 +11,7 @@ class FeedbackWriteViewController: UIViewController { // MARK: - Properties private let feedbackWriteView = FeedbackWriteView() + weak var delegate: FeedbackDelegate? // MARK: - Methods override func loadView() { @@ -24,9 +25,16 @@ class FeedbackWriteViewController: UIViewController { private func setButtonAction() { feedbackWriteView.cancelButton.addTarget(self, action: #selector(tappedCancelButton), for: .touchUpInside) + + feedbackWriteView.sendButton.addTarget(self, action: #selector(tappedSendButton), for: .touchUpInside) } @objc private func tappedCancelButton() { self.dismiss(animated: true) } + + @objc private func tappedSendButton() { + delegate?.dataBind(feedback: feedbackWriteView.returnFeedback()) + self.dismiss(animated: true) + } } From 89becd1aa58a58bffaf223f78f9b912085a836c2 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:00:03 +0900 Subject: [PATCH 56/71] =?UTF-8?q?[Feat]=20-=20(UIlabel+Extension)=20?= =?UTF-8?q?=EC=98=B5=EC=85=94=EB=84=90=20=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/Extensions/UILabel+Extension.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift index 2f6bc8c..a8928c0 100644 --- a/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift +++ b/35-seminar/Presentation/Week2/Extensions/UILabel+Extension.swift @@ -17,8 +17,9 @@ extension UILabel { } func setLineSpacing(_ lineSpacing: CGFloat) { + guard let text = self.text else { return } let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineSpacing = lineSpacing - self.attributedText = NSAttributedString(string: self.text!, attributes: [.paragraphStyle: paragraphStyle]) + self.attributedText = NSAttributedString(string: text, attributes: [.paragraphStyle: paragraphStyle]) } } From 94624e8721e6bff9c03311a0332f5bf6694dc580 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:01:05 +0900 Subject: [PATCH 57/71] =?UTF-8?q?[Feat]=20-=20(FeedbackWriteView)=20Feedba?= =?UTF-8?q?ck=20=ED=83=80=EC=9E=85=20=EB=A7=9E=EC=B6=94=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/View/FeedbackWriteView.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift index 028debd..795aeb4 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift @@ -110,12 +110,12 @@ class FeedbackWriteView: UIView { } func returnFeedback() -> Feedback { - let feedback = Feedback(title: feedbackTitleTextField.text ?? "", + let feedback = Feedback(title: feedbackTitleTextField.text, author: "김유림", - starCount: 5, + starCount: 0, authorDate: Date(), - content: feedbackTextView.text ?? "", - developerContent: "", + content: feedbackTextView.text, + developerContent: nil, developerDate: nil) return feedback } From fd2d4885b40a1a7d143e461c9d45faeb616d17db Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:01:35 +0900 Subject: [PATCH 58/71] =?UTF-8?q?[Feat]=20#6=20-=20=EA=B0=9C=EB=B0=9C?= =?UTF-8?q?=EC=9E=90=20=ED=94=BC=EB=93=9C=EB=B0=B1=20=EC=9C=A0=EB=AC=B4?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20isHidden=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailView.swift | 141 ++++++++++-------- 1 file changed, 81 insertions(+), 60 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 0f82041..a36ae42 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -10,12 +10,12 @@ import UIKit import SnapKit struct Feedback { - let title: String - let author: String - let starCount: Int + let title: String? + let author: String? + let starCount: Int? let authorDate: Date? - let content: String - let developerContent: String + let content: String? + let developerContent: String? let developerDate: Date? } @@ -26,14 +26,8 @@ protocol FeedbackDelegate: AnyObject { class AppDetailView: UIView { // MARK: - Properties - // data - private var feedback: Feedback = .init(title: "김유림", - author: "ISTJ", - starCount: 2, - authorDate: Date.form(year: 2023, month: 8, day: 25), - content: "1. 동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려 강산 대한 사람 대한으로 길이 보전하세", - developerContent: "안녕하세요, 토스팀입니다. 소중한 의견을 주셔서 너무나 감사합니다.", - developerDate: Date.form(year: 2024, month: 1, day: 25)) + private var feedback: Feedback? + private let initialFeedback = Feedback(title: "김유림", author: "ISTJ", starCount: 2, authorDate: Date.form(year: 2023, month: 12, day: 20), content: "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세", developerContent: "안녕하세요, 토스팀입니다. 소중한 의견을 주셔서 너무나 감사합니다.", developerDate: Date.form(year: 2024, month: 5, day: 30)) private let scrollView = UIScrollView() private let contentStackView = UIStackView() @@ -108,13 +102,19 @@ class AppDetailView: UIView { private let feedbackTapToRateLabel = SubtitleLabel() let feedbackTapToRateStarStackView = StarStackView() - private let feedbackBoxView = UIView() + private let feedbackBoxStackView = UIStackView() + private let feedbackTitleStackView = UIStackView() private let feedbackTitleLabel = ContentLabel() - private let feedbackStarStackView = StarStackView() private let feedbackDateLabel = SubtitleLabel() + + private let feedbackSubtitleStackView = UIStackView() + private let feedbackStarStackView = StarStackView() private let feedbackAuthorLabel = SubtitleLabel() + + private let feedbackContentView = UIView() private let feedbackContentLabel = ContentLabel() private let feedbackDeveloperTitleLabel = ContentLabel() + private let feedbackDeveloperContentView = UIView() private let feedbackDeveloperContentLabel = ContentLabel() private let feedbackDeveloperDateLabel = SubtitleLabel() let feedbackMoreButton1 = UIButton() @@ -126,6 +126,7 @@ class AppDetailView: UIView { // MARK: - Methods override init(frame: CGRect) { super.init(frame: frame) + feedback = initialFeedback setUI() setHierarchy() setConstraints() @@ -294,26 +295,38 @@ class AppDetailView: UIView { feedbackTapToRateStarStackView.setContentHuggingPriority(.defaultLow, for: .horizontal) - feedbackBoxView.backgroundColor = .systemGray6 - feedbackBoxView.layer.cornerRadius = 10 + feedbackBoxStackView.axis = .vertical + feedbackBoxStackView.backgroundColor = .systemGray6 + feedbackBoxStackView.layer.cornerRadius = 10 + feedbackBoxStackView.spacing = 3 + feedbackBoxStackView.isLayoutMarginsRelativeArrangement = true + feedbackBoxStackView.directionalLayoutMargins = NSDirectionalEdgeInsets(top: 18, leading: 20, bottom: 18, trailing: 20) - feedbackTitleLabel.configureLabel(size: 15, weight: .semibold, text: feedback.title) - feedbackStarStackView.bind(2, .orange) + [feedbackTitleStackView, feedbackSubtitleStackView].forEach { + $0.axis = .horizontal + $0.spacing = 10 + } - feedbackDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback.authorDate)) + feedbackTitleLabel.configureLabel(size: 15, weight: .bold, text: feedback?.title) - feedbackAuthorLabel.configureLabel(color: .secondaryLabel, size: 14, weight: .regular, text: feedback.author) + feedbackDateLabel.configureLabel(alignment: .right, color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback?.authorDate)) + feedbackDateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) - feedbackContentLabel.text = feedback.content + feedbackStarStackView.bind(2, .orange) + feedbackStarStackView.setContentHuggingPriority(.defaultHigh, for: .horizontal) + + feedbackAuthorLabel.configureLabel(alignment: .right, color: .secondaryLabel, size: 14, weight: .regular, text: feedback?.author) + + feedbackContentLabel.text = feedback?.content feedbackContentLabel.setLineSpacing(4) - feedbackDeveloperTitleLabel.configureLabel(size: 15, weight: .medium, text: "개발자 답변") + feedbackDeveloperTitleLabel.configureLabel(size: 15, weight: .semibold, text: "개발자 답변") - feedbackDeveloperContentLabel.text = feedback.developerContent + feedbackDeveloperContentLabel.text = feedback?.developerContent feedbackDeveloperContentLabel.setLineSpacing(4) - feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback.authorDate)) + feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback?.authorDate)) [feedbackMoreButton1, feedbackMoreButton2].forEach { $0.configureButton(title: "더 보기", removeContentInsets: true) @@ -404,7 +417,7 @@ class AppDetailView: UIView { } private func setFeedbackViewHierarchy() { - [feedbackTapToRateStackView, feedbackBoxView, feedbackWriteButton, appSupportButton].forEach { + [feedbackTapToRateStackView, feedbackBoxStackView, feedbackWriteButton, appSupportButton].forEach { feedbackView.addSubview($0) } @@ -412,8 +425,24 @@ class AppDetailView: UIView { feedbackTapToRateStackView.addArrangedSubview($0) } - [feedbackTitleLabel, feedbackStarStackView, feedbackDateLabel, feedbackAuthorLabel, feedbackContentLabel, feedbackDeveloperTitleLabel, feedbackDeveloperContentLabel, feedbackDeveloperDateLabel, feedbackMoreButton1, feedbackMoreButton2].forEach { - feedbackBoxView.addSubview($0) + [feedbackTitleStackView, feedbackSubtitleStackView, feedbackContentView, feedbackDeveloperContentView].forEach { + feedbackBoxStackView.addArrangedSubview($0) + } + + [feedbackTitleLabel, feedbackDateLabel].forEach { + feedbackTitleStackView.addArrangedSubview($0) + } + + [feedbackStarStackView, feedbackAuthorLabel].forEach { + feedbackSubtitleStackView.addArrangedSubview($0) + } + + [feedbackContentLabel, feedbackMoreButton1].forEach { + feedbackContentView.addSubview($0) + } + + [feedbackDeveloperTitleLabel, feedbackDeveloperDateLabel, feedbackDeveloperContentLabel, feedbackMoreButton2].forEach { + feedbackDeveloperContentView.addSubview($0) } } @@ -676,71 +705,56 @@ class AppDetailView: UIView { $0.height.equalTo(28) } - feedbackBoxView.snp.makeConstraints { + feedbackBoxStackView.snp.makeConstraints { $0.top.equalTo(feedbackTapToRateStackView.snp.bottom).offset(20) $0.horizontalEdges.equalToSuperview() } - feedbackTitleLabel.snp.makeConstraints { - $0.top.equalToSuperview().offset(18) - $0.leading.equalTo(feedbackContentLabel) - } - feedbackStarStackView.snp.makeConstraints { - $0.leading.equalTo(feedbackContentLabel) - $0.top.equalTo(feedbackTitleLabel.snp.bottom).offset(4) $0.height.equalTo(16) $0.width.equalTo(80) } - feedbackDateLabel.snp.makeConstraints { - $0.trailing.equalTo(feedbackContentLabel) - $0.centerY.equalTo(feedbackTitleLabel) - } - - feedbackAuthorLabel.snp.makeConstraints { - $0.trailing.equalTo(feedbackContentLabel) - $0.centerY.equalTo(feedbackStarStackView) - } - feedbackContentLabel.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(20) - $0.top.equalTo(feedbackStarStackView.snp.bottom).offset(10) + $0.horizontalEdges.equalToSuperview() + $0.verticalEdges.equalToSuperview().inset(10) } feedbackMoreButton1.snp.makeConstraints { - $0.bottom.trailing.equalTo(feedbackContentLabel) + $0.trailing.equalToSuperview() + $0.bottom.equalTo(feedbackContentLabel) } feedbackDeveloperTitleLabel.snp.makeConstraints { - $0.top.equalTo(feedbackContentLabel.snp.bottom).offset(15) - $0.leading.equalTo(feedbackContentLabel) + $0.leading.equalToSuperview() + $0.top.equalToSuperview().offset(5) } feedbackDeveloperDateLabel.snp.makeConstraints { - $0.trailing.equalTo(feedbackContentLabel) + $0.trailing.equalToSuperview() $0.centerY.equalTo(feedbackDeveloperTitleLabel) } feedbackDeveloperContentLabel.snp.makeConstraints { - $0.horizontalEdges.equalTo(feedbackContentLabel) + $0.horizontalEdges.equalToSuperview() $0.top.equalTo(feedbackDeveloperTitleLabel.snp.bottom).offset(5) - $0.bottom.equalToSuperview().offset(-20) + $0.bottom.equalToSuperview() } feedbackMoreButton2.snp.makeConstraints { - $0.bottom.trailing.equalTo(feedbackDeveloperContentLabel) + $0.trailing.equalToSuperview() + $0.bottom.equalTo(feedbackDeveloperContentLabel) } feedbackWriteButton.snp.makeConstraints { - $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) - $0.leading.equalTo(feedbackBoxView) + $0.top.equalTo(feedbackBoxStackView.snp.bottom).offset(20) + $0.leading.equalTo(feedbackBoxStackView) $0.bottom.equalToSuperview().offset(-10) } appSupportButton.snp.makeConstraints { - $0.top.equalTo(feedbackBoxView.snp.bottom).offset(20) - $0.trailing.equalTo(feedbackBoxView) + $0.top.equalTo(feedbackBoxStackView.snp.bottom).offset(20) + $0.trailing.equalTo(feedbackBoxStackView) } } @@ -748,10 +762,17 @@ class AppDetailView: UIView { self.feedback = feedback feedbackTitleLabel.text = feedback.title feedbackAuthorLabel.text = feedback.author - feedbackStarStackView.bind(feedback.starCount, .orange) + feedbackStarStackView.bind(feedback.starCount ?? 0, .orange) feedbackDateLabel.text = Date.formattedDate(date: feedback.authorDate) feedbackContentLabel.text = feedback.content feedbackDeveloperContentLabel.text = feedback.developerContent feedbackDeveloperDateLabel.text = Date.formattedDate(date: feedback.developerDate) + + // 개발자 답변 있는지 확인 + if feedback.developerContent == nil { + feedbackDeveloperContentView.isHidden = true + } else { + feedbackDeveloperContentView.isHidden = false + } } } From 5cdce7eeac9b174819c9174dd475955602f9e464 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:08:43 +0900 Subject: [PATCH 59/71] =?UTF-8?q?[Feat]=20#6=20-=20=EC=95=B1=20=EC=84=A4?= =?UTF-8?q?=EB=AA=85=20=EB=8D=94=EB=B3=B4=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=95=A1=EC=85=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/View/AppDetailView.swift | 5 +++++ .../Presentation/Week2/View/AppDetailViewController.swift | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index a36ae42..5d9bc17 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -775,4 +775,9 @@ class AppDetailView: UIView { feedbackDeveloperContentView.isHidden = false } } + + func expandDescriptionLabel() { + descriptionLabel.numberOfLines = 0 + descriptionMoreButton.isHidden = true + } } diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index b49e067..448ef71 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -28,6 +28,8 @@ class AppDetailViewController: UIViewController { appDetailView.feedbackSummaryAllButton.addTarget(self, action: #selector (tappedFeedbackSummaryAllButton), for: .touchUpInside) appDetailView.feedbackWriteButton.addTarget(self, action: #selector(tappedFeedbackWriteButton), for: .touchUpInside) + + appDetailView.descriptionMoreButton.addTarget(self, action: #selector(tappedDescriptionMoreButton), for: .touchUpInside) } @objc private func tappedVersionRecordButton() { @@ -43,6 +45,10 @@ class AppDetailViewController: UIViewController { feedbackWriteVC.delegate = self self.present(feedbackWriteVC, animated: true) } + + @objc private func tappedDescriptionMoreButton() { + appDetailView.expandDescriptionLabel() + } } From 317f59ec9485f3546d016283e0f7c74a25328450 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:33:49 +0900 Subject: [PATCH 60/71] =?UTF-8?q?[Feat]=20#6=20-=20=EB=B3=84=EC=A0=90=20?= =?UTF-8?q?=EB=93=9C=EB=9E=98=EA=B7=B8/=ED=83=AD=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/Reusables/StarStackView.swift | 34 +++++++++++++++++++ .../Week2/View/AppDetailViewController.swift | 9 +++++ 2 files changed, 43 insertions(+) diff --git a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift index 00ea3b1..bf8159b 100644 --- a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift +++ b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift @@ -13,9 +13,15 @@ enum StarColor { case orange } +protocol StarStackViewDelegate: AnyObject { + func starStackView(_ view: StarStackView, newCount: Int) +} + class StarStackView: UIStackView { // MARK: - Properties + weak var delegate: StarStackViewDelegate? + private var starCount: Int = 0 private var starColor: StarColor = .tint @@ -85,4 +91,32 @@ class StarStackView: UIStackView { self.starColor = color updateStarImage() } + + // 드래그 제스처 핸들러 + @objc func handlePangesture(_ gesture: UIPanGestureRecognizer) { + let location = gesture.location(in: self) + let startWidth = bounds.width / 5 + let selectedStarIndex = Int(location.x / startWidth) + let newCount = selectedStarIndex + 1 + + if newCount != starCount { + starCount = newCount + updateStarImage() + delegate?.starStackView(self, newCount: newCount) + } + } + + // 클릭 제스처 핸들러 + @objc func handleTapGesture(_ gesture: UITapGestureRecognizer) { + let location = gesture.location(in: self) + let startWidth = bounds.width / 5 + let selectedStarIndex = Int(location.x / startWidth) + let newCount = selectedStarIndex + 1 + + if newCount != starCount { + starCount = newCount + updateStarImage() + delegate?.starStackView(self, newCount: newCount) + } + } } diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index 448ef71..aa74910 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -20,6 +20,7 @@ class AppDetailViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setButtonAction() + setStarStackViewGesture() } private func setButtonAction() { @@ -32,6 +33,14 @@ class AppDetailViewController: UIViewController { appDetailView.descriptionMoreButton.addTarget(self, action: #selector(tappedDescriptionMoreButton), for: .touchUpInside) } + private func setStarStackViewGesture() { + let panGesture = UIPanGestureRecognizer(target: appDetailView.feedbackTapToRateStarStackView, action: #selector(appDetailView.feedbackTapToRateStarStackView.handlePangesture)) + appDetailView.feedbackTapToRateStarStackView.addGestureRecognizer(panGesture) + + let tapGesture = UITapGestureRecognizer(target: appDetailView.feedbackTapToRateStarStackView, action: #selector(appDetailView.feedbackTapToRateStarStackView.handlePangesture)) + appDetailView.feedbackTapToRateStarStackView.addGestureRecognizer(tapGesture) + } + @objc private func tappedVersionRecordButton() { self.navigationController?.pushViewController(VersionRecordViewController(), animated: true) } From b7d0366b882b1a92befe3ca7e108ba729e385adc Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:37:54 +0900 Subject: [PATCH 61/71] =?UTF-8?q?[Feat]=20#6=20-=20=EB=B3=84=EC=A0=90=20?= =?UTF-8?q?=EB=93=9C=EB=9E=98=EA=B7=B8/=ED=83=AD=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/FeedbackWriteViewController.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift index 232c0cc..4d11648 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift @@ -21,6 +21,7 @@ class FeedbackWriteViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setButtonAction() + setStarStackViewGesture() } private func setButtonAction() { @@ -29,6 +30,14 @@ class FeedbackWriteViewController: UIViewController { feedbackWriteView.sendButton.addTarget(self, action: #selector(tappedSendButton), for: .touchUpInside) } + private func setStarStackViewGesture() { + let panGesture = UIPanGestureRecognizer(target: feedbackWriteView.tapToRateStarStackView, action: #selector(feedbackWriteView.tapToRateStarStackView.handlePangesture)) + feedbackWriteView.tapToRateStarStackView.addGestureRecognizer(panGesture) + + let tapGesture = UITapGestureRecognizer(target: feedbackWriteView.tapToRateStarStackView, action: #selector(feedbackWriteView.tapToRateStarStackView.handlePangesture)) + feedbackWriteView.tapToRateStarStackView.addGestureRecognizer(tapGesture) + } + @objc private func tappedCancelButton() { self.dismiss(animated: true) } From d0e1cc8b5ca61f2607a67025247613a242e6df5b Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:44:57 +0900 Subject: [PATCH 62/71] =?UTF-8?q?[Feat]=20#6=20-=20=ED=83=AD=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=ED=8F=89=EA=B0=80=ED=96=88=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EB=B0=95=EC=8A=A4=20=EB=85=B8?= =?UTF-8?q?=EB=9E=80=20=EB=B3=84=EB=8F=84=20=EB=B0=94=EB=80=8C=EA=B2=8C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailView.swift | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 5d9bc17..1486d98 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -10,13 +10,13 @@ import UIKit import SnapKit struct Feedback { - let title: String? - let author: String? - let starCount: Int? - let authorDate: Date? - let content: String? - let developerContent: String? - let developerDate: Date? + var title: String? + var author: String? + var starCount: Int? + var authorDate: Date? + var content: String? + var developerContent: String? + var developerDate: Date? } protocol FeedbackDelegate: AnyObject { @@ -130,6 +130,7 @@ class AppDetailView: UIView { setUI() setHierarchy() setConstraints() + feedbackTapToRateStarStackView.delegate = self } required init?(coder: NSCoder) { @@ -781,3 +782,10 @@ class AppDetailView: UIView { descriptionMoreButton.isHidden = true } } + +extension AppDetailView: StarStackViewDelegate { + func starStackView(_ view: StarStackView, newCount: Int) { + feedback?.starCount = newCount + feedbackStarStackView.bind(newCount, .orange) + } +} From 607f6fd3a83c6fb72f68867cfae4a3b6bcf95278 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 20:49:14 +0900 Subject: [PATCH 63/71] =?UTF-8?q?[Feat]=20#6=20-=20starCount=20=EB=B0=94?= =?UTF-8?q?=EC=9D=B8=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/View/FeedbackWriteView.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift index 795aeb4..63a2ff8 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift @@ -11,6 +11,8 @@ import SnapKit class FeedbackWriteView: UIView { // MARK: - Properties + var starCount: Int = 0 + private let titleLabel = UILabel() let cancelButton = UIButton() let sendButton = UIButton() @@ -28,6 +30,7 @@ class FeedbackWriteView: UIView { setUI() setHierarchy() setConstraints() + tapToRateStarStackView.delegate = self } required init?(coder: NSCoder) { @@ -112,7 +115,7 @@ class FeedbackWriteView: UIView { func returnFeedback() -> Feedback { let feedback = Feedback(title: feedbackTitleTextField.text, author: "김유림", - starCount: 0, + starCount: starCount, authorDate: Date(), content: feedbackTextView.text, developerContent: nil, @@ -120,3 +123,9 @@ class FeedbackWriteView: UIView { return feedback } } + +extension FeedbackWriteView: StarStackViewDelegate { + func starStackView(_ view: StarStackView, newCount: Int) { + starCount = newCount + } +} From b6b4b7b7d5270eafe0688d7c63651e84f40ad5e2 Mon Sep 17 00:00:00 2001 From: Yurim Date: Fri, 25 Oct 2024 21:07:07 +0900 Subject: [PATCH 64/71] =?UTF-8?q?[Feat]=20#6=20-=20=ED=83=AD=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=ED=8F=89=EA=B0=80=ED=95=98=EA=B8=B0=EC=99=80=20?= =?UTF-8?q?=EB=85=B8=EB=9E=80=20=EB=B3=84=20=EC=88=98=20=EC=9D=BC=EC=B9=98?= =?UTF-8?q?=EC=8B=9C=ED=82=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/View/AppDetailView.swift | 16 +++++++++------- .../Week2/View/AppDetailViewController.swift | 8 ++++---- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 1486d98..5ff4af1 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -99,8 +99,8 @@ class AppDetailView: UIView { // 피드백 뷰 private let feedbackView = UIView() private let feedbackTapToRateStackView = UIStackView() - private let feedbackTapToRateLabel = SubtitleLabel() - let feedbackTapToRateStarStackView = StarStackView() + private let tapToRateLabel = SubtitleLabel() + let tapToRateStarStackView = StarStackView() private let feedbackBoxStackView = UIStackView() private let feedbackTitleStackView = UIStackView() @@ -130,7 +130,7 @@ class AppDetailView: UIView { setUI() setHierarchy() setConstraints() - feedbackTapToRateStarStackView.delegate = self + tapToRateStarStackView.delegate = self } required init?(coder: NSCoder) { @@ -291,10 +291,11 @@ class AppDetailView: UIView { feedbackTapToRateStackView.axis = .horizontal feedbackTapToRateStackView.spacing = 10 - feedbackTapToRateLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .medium, text: "탭하여 평가하기:") - feedbackTapToRateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) + tapToRateLabel.configureLabel(color: .secondaryLabel, size: 17, weight: .medium, text: "탭하여 평가하기:") + tapToRateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) - feedbackTapToRateStarStackView.setContentHuggingPriority(.defaultLow, for: .horizontal) + tapToRateStarStackView.setContentHuggingPriority(.defaultLow, for: .horizontal) + tapToRateStarStackView.bind(feedback?.starCount ?? 0, .tint) feedbackBoxStackView.axis = .vertical feedbackBoxStackView.backgroundColor = .systemGray6 @@ -422,7 +423,7 @@ class AppDetailView: UIView { feedbackView.addSubview($0) } - [feedbackTapToRateLabel, feedbackTapToRateStarStackView].forEach { + [tapToRateLabel, tapToRateStarStackView].forEach { feedbackTapToRateStackView.addArrangedSubview($0) } @@ -768,6 +769,7 @@ class AppDetailView: UIView { feedbackContentLabel.text = feedback.content feedbackDeveloperContentLabel.text = feedback.developerContent feedbackDeveloperDateLabel.text = Date.formattedDate(date: feedback.developerDate) + tapToRateStarStackView.bind(feedback.starCount ?? 0, .tint) // 개발자 답변 있는지 확인 if feedback.developerContent == nil { diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index aa74910..43860a7 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -34,11 +34,11 @@ class AppDetailViewController: UIViewController { } private func setStarStackViewGesture() { - let panGesture = UIPanGestureRecognizer(target: appDetailView.feedbackTapToRateStarStackView, action: #selector(appDetailView.feedbackTapToRateStarStackView.handlePangesture)) - appDetailView.feedbackTapToRateStarStackView.addGestureRecognizer(panGesture) + let panGesture = UIPanGestureRecognizer(target: appDetailView.tapToRateStarStackView, action: #selector(appDetailView.tapToRateStarStackView.handlePangesture)) + appDetailView.tapToRateStarStackView.addGestureRecognizer(panGesture) - let tapGesture = UITapGestureRecognizer(target: appDetailView.feedbackTapToRateStarStackView, action: #selector(appDetailView.feedbackTapToRateStarStackView.handlePangesture)) - appDetailView.feedbackTapToRateStarStackView.addGestureRecognizer(tapGesture) + let tapGesture = UITapGestureRecognizer(target: appDetailView.tapToRateStarStackView, action: #selector(appDetailView.tapToRateStarStackView.handlePangesture)) + appDetailView.tapToRateStarStackView.addGestureRecognizer(tapGesture) } @objc private func tappedVersionRecordButton() { From fa881acb3de0d8a815f263e2528dbabafd54e62d Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 21:49:10 +0900 Subject: [PATCH 65/71] =?UTF-8?q?[Feat]=20#6=20-=20=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=20=EB=B0=94=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailViewController.swift | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index 43860a7..ae95646 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -19,10 +19,28 @@ class AppDetailViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + setNavigationBar() setButtonAction() setStarStackViewGesture() } + private func setNavigationBar() { + let iconImageView = UIImageView() + iconImageView.contentMode = .scaleAspectFit + iconImageView.image = .tossIcon + iconImageView.layer.cornerRadius = 8 + iconImageView.layer.borderColor = UIColor.systemGray5.cgColor + iconImageView.layer.borderWidth = 0.6 + iconImageView.snp.makeConstraints { + $0.size.equalTo(28) + } + + let rightBarButton = appDetailView.openButton + + self.navigationItem.titleView = iconImageView + self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightBarButton) + } + private func setButtonAction() { appDetailView.versionRecordButton.addTarget(self, action: #selector (tappedVersionRecordButton), for: .touchUpInside) From ae4fd340dbbb55c9b7486e76fabc3e776b505a61 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 22:05:58 +0900 Subject: [PATCH 66/71] =?UTF-8?q?[Feat]=20#6=20-=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EB=90=A0=20=EB=95=8C=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EB=B0=94=20=EC=95=84=EC=9D=B4=ED=85=9C=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/AppDetailView.swift | 2 +- .../Week2/View/AppDetailViewController.swift | 30 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 5ff4af1..b1092ab 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -29,7 +29,7 @@ class AppDetailView: UIView { private var feedback: Feedback? private let initialFeedback = Feedback(title: "김유림", author: "ISTJ", starCount: 2, authorDate: Date.form(year: 2023, month: 12, day: 20), content: "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세", developerContent: "안녕하세요, 토스팀입니다. 소중한 의견을 주셔서 너무나 감사합니다.", developerDate: Date.form(year: 2024, month: 5, day: 30)) - private let scrollView = UIScrollView() + let scrollView = UIScrollView() private let contentStackView = UIStackView() // 타이틀뷰 diff --git a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift index ae95646..a3ec4f6 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailViewController.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailViewController.swift @@ -22,10 +22,12 @@ class AppDetailViewController: UIViewController { setNavigationBar() setButtonAction() setStarStackViewGesture() + appDetailView.scrollView.delegate = self } private func setNavigationBar() { let iconImageView = UIImageView() + iconImageView.clipsToBounds = true iconImageView.contentMode = .scaleAspectFit iconImageView.image = .tossIcon iconImageView.layer.cornerRadius = 8 @@ -35,7 +37,18 @@ class AppDetailViewController: UIViewController { $0.size.equalTo(28) } - let rightBarButton = appDetailView.openButton + let rightBarButton = UIButton() + rightBarButton.configureButton(configType: .filled, + title: "열기", + fontSize: 16, + fontWeight: .bold, + cornerStyle: .capsule, + foregroundColor: .white, + backgroundColor: .tintColor) + rightBarButton.snp.makeConstraints { + $0.width.equalTo(72) + $0.height.equalTo(32) + } self.navigationItem.titleView = iconImageView self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightBarButton) @@ -84,3 +97,18 @@ extension AppDetailViewController: FeedbackDelegate { appDetailView.dataBind(feedback: feedback) } } + +extension AppDetailViewController: UIScrollViewDelegate { + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let offsetY = scrollView.contentOffset.y + let triggerOffset: CGFloat = 80 + + if offsetY > triggerOffset { + navigationItem.titleView?.isHidden = false + navigationItem.rightBarButtonItem?.isHidden = false + } else { + navigationItem.titleView?.isHidden = true + navigationItem.rightBarButtonItem?.isHidden = true + } + } +} From 72187880d1055c23c70e5ba412367a83f62f0764 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 22:13:26 +0900 Subject: [PATCH 67/71] =?UTF-8?q?=EC=A4=84=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Week2/View/AllFeedbackViewController.swift | 2 +- .../Presentation/Week2/View/VersionRecordViewController.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift b/35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift index 5fba47f..4e79466 100644 --- a/35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift +++ b/35-seminar/Presentation/Week2/View/AllFeedbackViewController.swift @@ -8,7 +8,7 @@ import UIKit class AllFeedbackViewController: UIViewController { - + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground diff --git a/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift b/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift index c9f08b3..13d5b28 100644 --- a/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift +++ b/35-seminar/Presentation/Week2/View/VersionRecordViewController.swift @@ -8,7 +8,7 @@ import UIKit class VersionRecordViewController: UIViewController { - + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground From 6a2b25cc520e805901b702c2b887443261242322 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 22:49:36 +0900 Subject: [PATCH 68/71] =?UTF-8?q?[Feat]=20#6=20-=20TextView=20delegate=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Week2/View/FeedbackWriteView.swift | 35 ++++++++++++++++--- .../View/FeedbackWriteViewController.swift | 11 ++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift index 63a2ff8..32afe08 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteView.swift @@ -12,6 +12,7 @@ class FeedbackWriteView: UIView { // MARK: - Properties var starCount: Int = 0 + let textViewPlaceHolder = "리뷰(선택사항)" private let titleLabel = UILabel() let cancelButton = UIButton() @@ -20,8 +21,8 @@ class FeedbackWriteView: UIView { let tapToRateStarStackView = StarStackView() private let tapToRateGuideLabel = SubtitleLabel() - let feedbackStackView = UIStackView() - let feedbackTitleTextField = UITextField() + private let feedbackStackView = UIStackView() + private let feedbackTitleTextField = UITextField() let feedbackTextView = UITextView() // MARK: - Methods @@ -55,10 +56,10 @@ class FeedbackWriteView: UIView { feedbackTitleTextField.font = .systemFont(ofSize: 17, weight: .regular) feedbackTitleTextField.setContentHuggingPriority(.defaultHigh, for: .vertical) - feedbackTextView.text = "리뷰(선택사항)" feedbackTextView.textContainerInset = .zero feedbackTextView.textContainer.lineFragmentPadding = 0 feedbackTextView.font = .systemFont(ofSize: 17, weight: .regular) + setTextViewPlaceholder() } private func setHierarchy() { @@ -112,12 +113,38 @@ class FeedbackWriteView: UIView { } } + func setTextViewPlaceholder() { + feedbackTextView.text = textViewPlaceHolder + feedbackTextView.textColor = .systemGray4 + } + + func setTextViewToWrite() { + if feedbackTextView.text == textViewPlaceHolder { + feedbackTextView.text = nil + feedbackTextView.textColor = .label + } + } + + func setTextViewToEnd() { + let isPlaceHolder = feedbackTextView.text == textViewPlaceHolder + let isEmpty = feedbackTextView.text.isEmpty + + if isPlaceHolder || isEmpty { + setTextViewPlaceholder() + } + } + func returnFeedback() -> Feedback { + var content = feedbackTextView.text + if content == textViewPlaceHolder { + content = nil + } + let feedback = Feedback(title: feedbackTitleTextField.text, author: "김유림", starCount: starCount, authorDate: Date(), - content: feedbackTextView.text, + content: content, developerContent: nil, developerDate: nil) return feedback diff --git a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift index 4d11648..7bbcf83 100644 --- a/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift +++ b/35-seminar/Presentation/Week2/View/FeedbackWriteViewController.swift @@ -22,6 +22,7 @@ class FeedbackWriteViewController: UIViewController { super.viewDidLoad() setButtonAction() setStarStackViewGesture() + feedbackWriteView.feedbackTextView.delegate = self } private func setButtonAction() { @@ -47,3 +48,13 @@ class FeedbackWriteViewController: UIViewController { self.dismiss(animated: true) } } + +extension FeedbackWriteViewController: UITextViewDelegate { + func textViewDidBeginEditing(_ textView: UITextView) { + feedbackWriteView.setTextViewToWrite() + } + + func textViewDidEndEditing(_ textView: UITextView) { + feedbackWriteView.setTextViewToEnd() + } +} From da9fce4c669910e3a7fb2e292e63b538c026525c Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Fri, 25 Oct 2024 23:54:15 +0900 Subject: [PATCH 69/71] =?UTF-8?q?[Feat]=20#6=20-=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EB=B3=84=EC=A0=90=205=EC=A0=90=EC=9C=BC=EB=A1=9C,=20=EB=B0=94?= =?UTF-8?q?=EC=9D=B8=EB=94=A9=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/View/AppDetailView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index b1092ab..973a67d 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -27,7 +27,7 @@ class AppDetailView: UIView { // MARK: - Properties private var feedback: Feedback? - private let initialFeedback = Feedback(title: "김유림", author: "ISTJ", starCount: 2, authorDate: Date.form(year: 2023, month: 12, day: 20), content: "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세", developerContent: "안녕하세요, 토스팀입니다. 소중한 의견을 주셔서 너무나 감사합니다.", developerDate: Date.form(year: 2024, month: 5, day: 30)) + private let initialFeedback = Feedback(title: "김유림", author: "ISTJ", starCount: 5, authorDate: Date.form(year: 2023, month: 12, day: 20), content: "동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세 무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세", developerContent: "안녕하세요, 토스팀입니다. 소중한 의견을 주셔서 너무나 감사합니다.", developerDate: Date.form(year: 2024, month: 5, day: 30)) let scrollView = UIScrollView() private let contentStackView = UIStackView() @@ -315,7 +315,7 @@ class AppDetailView: UIView { feedbackDateLabel.configureLabel(alignment: .right, color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback?.authorDate)) feedbackDateLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) - feedbackStarStackView.bind(2, .orange) + feedbackStarStackView.bind(feedback?.starCount ?? 0, .orange) feedbackStarStackView.setContentHuggingPriority(.defaultHigh, for: .horizontal) feedbackAuthorLabel.configureLabel(alignment: .right, color: .secondaryLabel, size: 14, weight: .regular, text: feedback?.author) From 1baebe8d523825a2082ec09bafad55aecea68008 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Sat, 26 Oct 2024 00:17:44 +0900 Subject: [PATCH 70/71] =?UTF-8?q?[Fix]=20#6=20-=20developer=20=EB=9D=BC?= =?UTF-8?q?=EB=B2=A8=EC=97=90=20author=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EB=84=A3=EC=9D=80=20=EA=B2=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar/Presentation/Week2/View/AppDetailView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 973a67d..51539d8 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -328,7 +328,7 @@ class AppDetailView: UIView { feedbackDeveloperContentLabel.text = feedback?.developerContent feedbackDeveloperContentLabel.setLineSpacing(4) - feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback?.authorDate)) + feedbackDeveloperDateLabel.configureLabel(color: .secondaryLabel, size: 15, weight: .regular, text: Date.formattedDate(date: feedback?.developerDate)) [feedbackMoreButton1, feedbackMoreButton2].forEach { $0.configureButton(title: "더 보기", removeContentInsets: true) From cb0550ede7e72fef9ff45b9b4327405b83f74e95 Mon Sep 17 00:00:00 2001 From: Yurim Kim Date: Sat, 26 Oct 2024 14:02:58 +0900 Subject: [PATCH 71/71] =?UTF-8?q?[Add,=20Refactor]=20#6=20-=20model=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 35-seminar.xcodeproj/project.pbxproj | 16 ++++++++++++++++ .../Presentation/Week2/Models/Feedback.swift | 18 ++++++++++++++++++ .../Presentation/Week2/Models/StarColor.swift | 14 ++++++++++++++ .../Week2/Reusables/StarStackView.swift | 6 ------ .../Week2/View/AppDetailView.swift | 10 ---------- 5 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 35-seminar/Presentation/Week2/Models/Feedback.swift create mode 100644 35-seminar/Presentation/Week2/Models/StarColor.swift diff --git a/35-seminar.xcodeproj/project.pbxproj b/35-seminar.xcodeproj/project.pbxproj index 4bee294..eed7e36 100644 --- a/35-seminar.xcodeproj/project.pbxproj +++ b/35-seminar.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 157119D82CBE965700362252 /* SubtitleLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157119D72CBE965700362252 /* SubtitleLabel.swift */; }; 157119DA2CBE96BB00362252 /* ContentLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157119D92CBE96BB00362252 /* ContentLabel.swift */; }; 157119DD2CBE96F500362252 /* UILabel+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157119DC2CBE96F500362252 /* UILabel+Extension.swift */; }; + 15728FC52CCCAF0100E1E151 /* Feedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15728FC42CCCAF0100E1E151 /* Feedback.swift */; }; + 15728FC72CCCAF3100E1E151 /* StarColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15728FC62CCCAF3100E1E151 /* StarColor.swift */; }; 1590A63D2CBE6C6A00FB32AE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1590A6352CBE6C6A00FB32AE /* Assets.xcassets */; }; 1590A63F2CBE6C6A00FB32AE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1590A6392CBE6C6A00FB32AE /* LaunchScreen.storyboard */; }; 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1590A62A2CBE6C6A00FB32AE /* AppDelegate.swift */; }; @@ -42,6 +44,8 @@ 157119D72CBE965700362252 /* SubtitleLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubtitleLabel.swift; sourceTree = ""; }; 157119D92CBE96BB00362252 /* ContentLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentLabel.swift; sourceTree = ""; }; 157119DC2CBE96F500362252 /* UILabel+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+Extension.swift"; sourceTree = ""; }; + 15728FC42CCCAF0100E1E151 /* Feedback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Feedback.swift; sourceTree = ""; }; + 15728FC62CCCAF3100E1E151 /* StarColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarColor.swift; sourceTree = ""; }; 1590A62A2CBE6C6A00FB32AE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1590A62B2CBE6C6A00FB32AE /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 1590A62D2CBE6C6A00FB32AE /* Week1DetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Week1DetailView.swift; sourceTree = ""; }; @@ -117,6 +121,15 @@ path = Extensions; sourceTree = ""; }; + 15728FC32CCCAEE000E1E151 /* Models */ = { + isa = PBXGroup; + children = ( + 15728FC42CCCAF0100E1E151 /* Feedback.swift */, + 15728FC62CCCAF3100E1E151 /* StarColor.swift */, + ); + path = Models; + sourceTree = ""; + }; 1590A62C2CBE6C6A00FB32AE /* Application */ = { isa = PBXGroup; children = ( @@ -185,6 +198,7 @@ 1590A69F2CBE719000FB32AE /* Week2 */ = { isa = PBXGroup; children = ( + 15728FC32CCCAEE000E1E151 /* Models */, 157119DB2CBE96DE00362252 /* Extensions */, 157119D42CBE8FB700362252 /* Reusables */, 15F4FD092CC7405800C99A20 /* Practice */, @@ -295,6 +309,7 @@ 15EC30592CCB727300A0480B /* VersionRecordViewController.swift in Sources */, 15EC30612CCB8E9C00A0480B /* Date+Extension.swift in Sources */, 1590A6A12CBE737600FB32AE /* PractScrollViewController.swift in Sources */, + 15728FC72CCCAF3100E1E151 /* StarColor.swift in Sources */, 157119D82CBE965700362252 /* SubtitleLabel.swift in Sources */, 15EC30552CCAB69000A0480B /* AppDetailView.swift in Sources */, 1590A6402CBE6C6A00FB32AE /* AppDelegate.swift in Sources */, @@ -314,6 +329,7 @@ 15EC305B2CCB76F500A0480B /* AllFeedbackViewController.swift in Sources */, 15EC30572CCAC33700A0480B /* UIImage+Extension.swift in Sources */, 1590A6452CBE6C6A00FB32AE /* Week1MainViewController.swift in Sources */, + 15728FC52CCCAF0100E1E151 /* Feedback.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/35-seminar/Presentation/Week2/Models/Feedback.swift b/35-seminar/Presentation/Week2/Models/Feedback.swift new file mode 100644 index 0000000..f6cd46f --- /dev/null +++ b/35-seminar/Presentation/Week2/Models/Feedback.swift @@ -0,0 +1,18 @@ +// +// Feedback.swift +// 35-seminar +// +// Created by 김유림 on 10/26/24. +// + +import Foundation + +struct Feedback { + var title: String? + var author: String? + var starCount: Int? + var authorDate: Date? + var content: String? + var developerContent: String? + var developerDate: Date? +} diff --git a/35-seminar/Presentation/Week2/Models/StarColor.swift b/35-seminar/Presentation/Week2/Models/StarColor.swift new file mode 100644 index 0000000..eb4ba2e --- /dev/null +++ b/35-seminar/Presentation/Week2/Models/StarColor.swift @@ -0,0 +1,14 @@ +// +// StarColor.swift +// 35-seminar +// +// Created by 김유림 on 10/26/24. +// + +import Foundation + +enum StarColor { + case tint + case gray + case orange +} diff --git a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift index bf8159b..489d23d 100644 --- a/35-seminar/Presentation/Week2/Reusables/StarStackView.swift +++ b/35-seminar/Presentation/Week2/Reusables/StarStackView.swift @@ -7,12 +7,6 @@ import UIKit -enum StarColor { - case tint - case gray - case orange -} - protocol StarStackViewDelegate: AnyObject { func starStackView(_ view: StarStackView, newCount: Int) } diff --git a/35-seminar/Presentation/Week2/View/AppDetailView.swift b/35-seminar/Presentation/Week2/View/AppDetailView.swift index 51539d8..5fa2344 100644 --- a/35-seminar/Presentation/Week2/View/AppDetailView.swift +++ b/35-seminar/Presentation/Week2/View/AppDetailView.swift @@ -9,16 +9,6 @@ import UIKit import SnapKit -struct Feedback { - var title: String? - var author: String? - var starCount: Int? - var authorDate: Date? - var content: String? - var developerContent: String? - var developerDate: Date? -} - protocol FeedbackDelegate: AnyObject { func dataBind(feedback: Feedback) }