From ee7e8023e1d161156ba1c0ea84b67d2b3b92e45c Mon Sep 17 00:00:00 2001 From: KimUiseong Date: Thu, 20 Jul 2023 15:16:56 +0900 Subject: [PATCH 01/17] =?UTF-8?q?[FIX]=20navigationbar=20type=EB=B3=84=20b?= =?UTF-8?q?ackground=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=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 --- .../Global/Enums/NavigationBarType.swift | 11 ++++++++++- .../Global/UIComponents/LHNavigationBarView.swift | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Enums/NavigationBarType.swift b/LionHeart-iOS/LionHeart-iOS/Global/Enums/NavigationBarType.swift index c60389bd..ef877160 100644 --- a/LionHeart-iOS/LionHeart-iOS/Global/Enums/NavigationBarType.swift +++ b/LionHeart-iOS/LionHeart-iOS/Global/Enums/NavigationBarType.swift @@ -5,7 +5,7 @@ // Created by 김민재 on 2023/07/10. // -import Foundation +import UIKit enum LHNavigationType { case today @@ -40,6 +40,15 @@ enum LHNavigationType { default: return .backButtonWithTitle } } + + var backgroundColor: UIColor? { + switch self { + case .today: + return .designSystem(.black) + case .explore, .curriculumMain, .curriculumByWeek, .challenge, .onboarding, .articleMain, .bookmark, .myPage, .exploreEachCategory: + return .designSystem(.background) + } + } } diff --git a/LionHeart-iOS/LionHeart-iOS/Global/UIComponents/LHNavigationBarView.swift b/LionHeart-iOS/LionHeart-iOS/Global/UIComponents/LHNavigationBarView.swift index 2dba14fe..c22fda91 100644 --- a/LionHeart-iOS/LionHeart-iOS/Global/UIComponents/LHNavigationBarView.swift +++ b/LionHeart-iOS/LionHeart-iOS/Global/UIComponents/LHNavigationBarView.swift @@ -81,7 +81,7 @@ final class LHNavigationBarView: UIView { } private func setStyle() { - self.backgroundColor = .designSystem(.black) + self.backgroundColor = type.backgroundColor } // MARK: - addsubView From 9e1a42091465b97d50b323b83c488ee9beff04d2 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 15:31:01 +0900 Subject: [PATCH 02/17] =?UTF-8?q?[CHORE]=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(#93)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Literals/ImageLiterals.swift | 4 ++++ .../Contents.json | 21 ++++++++++++++++++ .../onboarding_complete_image.png | Bin 0 -> 28484 bytes .../CompleteOnbardingViewController.swift | 3 ++- 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/onboarding_complete_image.imageset/Contents.json create mode 100644 LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/onboarding_complete_image.imageset/onboarding_complete_image.png diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Literals/ImageLiterals.swift b/LionHeart-iOS/LionHeart-iOS/Global/Literals/ImageLiterals.swift index afd226ea..21478f1c 100644 --- a/LionHeart-iOS/LionHeart-iOS/Global/Literals/ImageLiterals.swift +++ b/LionHeart-iOS/LionHeart-iOS/Global/Literals/ImageLiterals.swift @@ -93,6 +93,10 @@ enum ImageLiterals { static var loginBackgroundImage: UIImage { .load(named: "kakao_login_img") } static var kakaoLogo: UIImage { .load(named: "ic_kakao") } } + + enum Onboarding { + static var onboardingCompleteImage: UIImage { .load(named: "onboarding_complete_image") } + } } diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/onboarding_complete_image.imageset/Contents.json b/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/onboarding_complete_image.imageset/Contents.json new file mode 100644 index 00000000..d495d620 --- /dev/null +++ b/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/onboarding_complete_image.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "onboarding_complete_image.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/onboarding_complete_image.imageset/onboarding_complete_image.png b/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/onboarding_complete_image.imageset/onboarding_complete_image.png new file mode 100644 index 0000000000000000000000000000000000000000..7778ca21ed840c8f3d530b010c718381d97250e5 GIT binary patch literal 28484 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 MKyOGh}g`TpN& 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 Date: Thu, 20 Jul 2023 16:52:41 +0900 Subject: [PATCH 03/17] =?UTF-8?q?[FEAT]=20=EC=98=A8=EB=B3=B4=EB=94=A9=20?= =?UTF-8?q?=EB=A1=9C=EB=94=A9=EB=B0=94=20=EC=B6=94=EA=B0=80(#93)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnboardingViewController.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift index b01bf4cf..8c1beec4 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift @@ -26,6 +26,15 @@ final class OnboardingViewController: UIViewController { private var pageDataSource: OnboardingViews = [] private lazy var onboardingNavigationbar = LHNavigationBarView(type: .onboarding, viewController: self) + let loadingIndicatorView: UIActivityIndicatorView = { + let indicatorView = UIActivityIndicatorView(style: .large) + indicatorView.color = .designSystem(.lionRed) + indicatorView.backgroundColor = .designSystem(.black) + indicatorView.frame = .init(x: 0, y: 0, width: Constant.Screen.width, height: Constant.Screen.height) + return indicatorView + }() + + /// onboarding flow property private var currentPage: OnboardingPageType = .getPregnancy private var onboardingFlow: OnbardingFlowType = .toGetPregnacny { @@ -37,6 +46,7 @@ final class OnboardingViewController: UIViewController { presentOnboardingView(oldValue: onboardingFlow) case .toCompleteOnboarding: presentCompleteOnboardingView() + } } } @@ -160,6 +170,9 @@ private extension OnboardingViewController { } func presentCompleteOnboardingView() { + self.view.endEditing(true) + self.view.addSubview(loadingIndicatorView) + loadingIndicatorView.startAnimating() self.nextButton.isUserInteractionEnabled = false let completeViewController = CompleteOnbardingViewController() let passingData = UserOnboardingModel(kakaoAccessToken: self.kakaoAccessToken, pregnacny: self.pregnancy, fetalNickname: self.fetalNickName) @@ -167,7 +180,9 @@ private extension OnboardingViewController { Task { do { try await AuthService.shared.signUp(type: .kakao, onboardingModel: passingData) + self.loadingIndicatorView.stopAnimating() self.navigationController?.pushViewController(completeViewController, animated: true) + } catch { guard let error = error as? NetworkError else { return } handleError(error) From a066eb8c1201c7f2058dbb9c74586e0953b70829 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 17:25:50 +0900 Subject: [PATCH 04/17] =?UTF-8?q?[FIX]=20ProgressView=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EB=BA=B4=EA=B8=B0(#93)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LionHeart-iOS.xcodeproj/project.pbxproj | 4 ++++ .../OnboardingComponent/LHLoadingView.swift | 23 +++++++++++++++++++ .../OnboardingViewController.swift | 10 +------- 3 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingComponent/LHLoadingView.swift diff --git a/LionHeart-iOS/LionHeart-iOS.xcodeproj/project.pbxproj b/LionHeart-iOS/LionHeart-iOS.xcodeproj/project.pbxproj index 7092f595..27bacefa 100644 --- a/LionHeart-iOS/LionHeart-iOS.xcodeproj/project.pbxproj +++ b/LionHeart-iOS/LionHeart-iOS.xcodeproj/project.pbxproj @@ -169,6 +169,7 @@ C0F029E82A5FB9EF00E0D185 /* RoundContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0F029E72A5FB9EF00E0D185 /* RoundContainerView.swift */; }; C0F029EA2A5FD32900E0D185 /* LHRoundButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0F029E92A5FD32900E0D185 /* LHRoundButton.swift */; }; C0F62FCA2A67CDCE0003ADFA /* BookmarkDetailCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A8980C12A5FD6AF00746C58 /* BookmarkDetailCollectionViewCell.swift */; }; + C0F62FE72A691FC40003ADFA /* LHLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0F62FE62A691FC40003ADFA /* LHLoadingView.swift */; }; D30CBA1A2A60384C00C8636B /* ChallengeDummy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D30CBA192A60384C00C8636B /* ChallengeDummy.swift */; }; D34280772A66B90C00DA1499 /* UILabelPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34280762A66B90C00DA1499 /* UILabelPadding.swift */; }; D3AB54B62A625A7B0017BF53 /* ArticleListByCategoryHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3AB54B52A625A7B0017BF53 /* ArticleListByCategoryHeaderView.swift */; }; @@ -368,6 +369,7 @@ C0F62FBA2A67CDB60003ADFA /* progressbar_3m.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = progressbar_3m.json; sourceTree = ""; }; C0F62FBE2A67CDB60003ADFA /* progressbar_5m.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = progressbar_5m.json; sourceTree = ""; }; C0F62FBF2A67CDB60003ADFA /* progressbar_6m.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = progressbar_6m.json; sourceTree = ""; }; + C0F62FE62A691FC40003ADFA /* LHLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LHLoadingView.swift; sourceTree = ""; }; D30CBA192A60384C00C8636B /* ChallengeDummy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChallengeDummy.swift; sourceTree = ""; }; D34280762A66B90C00DA1499 /* UILabelPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UILabelPadding.swift; sourceTree = ""; }; D3AB54B52A625A7B0017BF53 /* ArticleListByCategoryHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleListByCategoryHeaderView.swift; sourceTree = ""; }; @@ -1270,6 +1272,7 @@ C0F029E52A5FB9DF00E0D185 /* ContainerView.swift */, C0F029E72A5FB9EF00E0D185 /* RoundContainerView.swift */, C0F029E92A5FD32900E0D185 /* LHRoundButton.swift */, + C0F62FE62A691FC40003ADFA /* LHLoadingView.swift */, ); path = OnboardingComponent; sourceTree = ""; @@ -1621,6 +1624,7 @@ C0DF033B2A5A94BA0037F740 /* UITextField+.swift in Sources */, C0F029C92A5EFC1F00E0D185 /* LHOnboardingPageViewController.swift in Sources */, C0DF03412A5A95E40037F740 /* UIImage+.swift in Sources */, + C0F62FE72A691FC40003ADFA /* LHLoadingView.swift in Sources */, 4A8980CE2A617F7100746C58 /* CollectionHeaderViewRegisterDequeueProtocol.swift in Sources */, 4A860AD62A6265B2002BA428 /* BookmarkModel.swift in Sources */, B5C6A2BE2A5DE6590021BE5E /* GeneralTitleTableViewCell.swift in Sources */, diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingComponent/LHLoadingView.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingComponent/LHLoadingView.swift new file mode 100644 index 00000000..9bfe9bb9 --- /dev/null +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingComponent/LHLoadingView.swift @@ -0,0 +1,23 @@ +// +// LHLoadingView.swift +// LionHeart-iOS +// +// Created by uiskim on 2023/07/20. +// + +import UIKit + +final class LHLoadingView: UIActivityIndicatorView { + + init() { + super.init(frame: .zero) + self.style = .large + self.color = .designSystem(.lionRed) + self.backgroundColor = .designSystem(.black) + self.frame = .init(x: 0, y: 0, width: Constant.Screen.width, height: Constant.Screen.height) + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift index 8c1beec4..aa4f85d1 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift @@ -25,15 +25,7 @@ final class OnboardingViewController: UIViewController { private let onboardingViewController = LHOnboardingPageViewController() private var pageDataSource: OnboardingViews = [] private lazy var onboardingNavigationbar = LHNavigationBarView(type: .onboarding, viewController: self) - - let loadingIndicatorView: UIActivityIndicatorView = { - let indicatorView = UIActivityIndicatorView(style: .large) - indicatorView.color = .designSystem(.lionRed) - indicatorView.backgroundColor = .designSystem(.black) - indicatorView.frame = .init(x: 0, y: 0, width: Constant.Screen.width, height: Constant.Screen.height) - return indicatorView - }() - + private let loadingIndicatorView = LHLoadingView() /// onboarding flow property private var currentPage: OnboardingPageType = .getPregnancy From 5767cd3c70df4eb22ec20f38cf0a47d428570e83 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 19:15:04 +0900 Subject: [PATCH 05/17] =?UTF-8?q?[FEAT]=20Today=ED=83=AD=20=EB=A1=9C?= =?UTF-8?q?=EB=94=A9=EB=B7=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scenes/Today/ViewControllers/TodayViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index 7025db84..4f6a3796 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -69,6 +69,7 @@ extension TodayViewController: ViewControllerServiceable { extension TodayViewController { func getInquireTodayArticle() { Task { + LoadingIndicator.showLoading() do { let responseArticle = try await ArticleService.shared.inquiryTodayArticle() titleLabel.title = responseArticle.articleTitle @@ -78,6 +79,7 @@ extension TodayViewController { guard let error = error as? NetworkError else { return } handleError(error) } + LoadingIndicator.hideLoading() } } } From b8c2c775f27a0dd465485b2bfdc37ed644f5e4f4 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 19:23:09 +0900 Subject: [PATCH 06/17] =?UTF-8?q?[FIX]=20loadingView=20=ED=98=B8=EC=B6=9C?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/OnboardingViewController.swift | 9 ++++++--- .../Today/ViewControllers/TodayViewController.swift | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift index aa4f85d1..499b0190 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift @@ -163,22 +163,24 @@ private extension OnboardingViewController { func presentCompleteOnboardingView() { self.view.endEditing(true) - self.view.addSubview(loadingIndicatorView) - loadingIndicatorView.startAnimating() + self.nextButton.isUserInteractionEnabled = false let completeViewController = CompleteOnbardingViewController() let passingData = UserOnboardingModel(kakaoAccessToken: self.kakaoAccessToken, pregnacny: self.pregnancy, fetalNickname: self.fetalNickName) completeViewController.userData = passingData Task { + self.view.addSubview(loadingIndicatorView) + loadingIndicatorView.startAnimating() do { try await AuthService.shared.signUp(type: .kakao, onboardingModel: passingData) - self.loadingIndicatorView.stopAnimating() + self.navigationController?.pushViewController(completeViewController, animated: true) } catch { guard let error = error as? NetworkError else { return } handleError(error) } + } } } @@ -243,5 +245,6 @@ extension OnboardingViewController: ViewControllerServiceable { case .serverError: LHToast.show(message: "서버놈들") } + self.loadingIndicatorView.stopAnimating() } } diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index 4f6a3796..e68942bc 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -63,6 +63,7 @@ extension TodayViewController: ViewControllerServiceable { case .serverError: LHToast.show(message: "승준이어딧니 내목소리들리니", isTabBar: true) } + LoadingIndicator.hideLoading() } } @@ -79,7 +80,7 @@ extension TodayViewController { guard let error = error as? NetworkError else { return } handleError(error) } - LoadingIndicator.hideLoading() + } } } From 83a770b59a8d617eed3d7c3730cd056af9fa4a68 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 19:29:41 +0900 Subject: [PATCH 07/17] =?UTF-8?q?[FIX]=20loadingView=20=EB=B6=84=EA=B8=B0?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/OnboardingViewController.swift | 2 +- .../Scenes/Today/ViewControllers/TodayViewController.swift | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift index 499b0190..48b625ea 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift @@ -173,7 +173,7 @@ private extension OnboardingViewController { loadingIndicatorView.startAnimating() do { try await AuthService.shared.signUp(type: .kakao, onboardingModel: passingData) - + self.loadingIndicatorView.stopAnimating() self.navigationController?.pushViewController(completeViewController, animated: true) } catch { diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index e68942bc..94b01d97 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -19,6 +19,7 @@ final class TodayViewController: UIViewController { private var todayArticleID: Int? private lazy var todayNavigationBar = LHNavigationBarView(type: .today, viewController: self) + private let loadingIndicatorView = LHLoadingView() private let seperateLine: UIView = { let view = UIView() @@ -63,19 +64,21 @@ extension TodayViewController: ViewControllerServiceable { case .serverError: LHToast.show(message: "승준이어딧니 내목소리들리니", isTabBar: true) } - LoadingIndicator.hideLoading() + loadingIndicatorView.stopAnimating() } } extension TodayViewController { func getInquireTodayArticle() { Task { - LoadingIndicator.showLoading() + view.addSubview(loadingIndicatorView) + loadingIndicatorView.startAnimating() do { let responseArticle = try await ArticleService.shared.inquiryTodayArticle() titleLabel.title = responseArticle.articleTitle mainArticleView.data = responseArticle todayArticleID = responseArticle.aticleID + loadingIndicatorView.stopAnimating() } catch { guard let error = error as? NetworkError else { return } handleError(error) From 99f7a282238d501cee6f315590b8f591165d5401 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 21:42:39 +0900 Subject: [PATCH 08/17] =?UTF-8?q?[FIX]=20Today=20=EC=95=84=ED=8B=B0?= =?UTF-8?q?=ED=81=B4=20UI=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contents.json | 21 +++++++++++++++ .../TodayArticle_PointImage.png | Bin 0 -> 263 bytes .../Today/Component/LHTodayArticleTitle.swift | 16 +++++++++--- .../ViewControllers/TodayViewController.swift | 24 +++++++++++++++--- .../Scenes/Today/Views/TodayArticleView.swift | 7 ++--- 5 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/Today/TodayArticle_PointImage.imageset/Contents.json create mode 100644 LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/Today/TodayArticle_PointImage.imageset/TodayArticle_PointImage.png diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/Today/TodayArticle_PointImage.imageset/Contents.json b/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/Today/TodayArticle_PointImage.imageset/Contents.json new file mode 100644 index 00000000..f85187db --- /dev/null +++ b/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/Today/TodayArticle_PointImage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "TodayArticle_PointImage.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/Today/TodayArticle_PointImage.imageset/TodayArticle_PointImage.png b/LionHeart-iOS/LionHeart-iOS/Global/Resources/Assets.xcassets/Today/TodayArticle_PointImage.imageset/TodayArticle_PointImage.png new file mode 100644 index 0000000000000000000000000000000000000000..21d9a59b19cf477285f4fc227e89fff608cd4a68 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CB!3HGHK9Tzfq&N#aB8wRqxP?KOkzv*x37{Zj zage(c!@6@aFM%AEbVpxD28NCO+QMGqP9wCGoh2FQePim-by zu;y@0FeqqX)(K&Bk>P#9hujerfM+A(0np9M7*i+}qr+Z`S@xrOpOdmKi17 z`@CRn)x=*1_NdF)hnsPpbts?mx{vdcZ{uS3Y5AXjD8J)9VN|x_TdWk&oeZ9?elF{r G5}E*coL+PQ literal 0 HcmV?d00001 diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Component/LHTodayArticleTitle.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Component/LHTodayArticleTitle.swift index 031dc4b1..e1707619 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Component/LHTodayArticleTitle.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Component/LHTodayArticleTitle.swift @@ -9,9 +9,10 @@ import UIKit final class LHTodayArticleTitle: UILabel { - var title: String? { + var userNickName: String? { didSet { - self.text = title + guard let userNickName else { return } + self.text = userNickName + "님," } } @@ -19,9 +20,18 @@ final class LHTodayArticleTitle: UILabel { super.init(frame: .zero) self.font = .pretendard(.head1) self.textColor = .designSystem(.white) - self.numberOfLines = 2 + self.numberOfLines = 1 } + init(initalizeString: String) { + super.init(frame: .zero) + self.font = .pretendard(.head1) + self.textColor = .designSystem(.white) + self.text = initalizeString + self.numberOfLines = 1 + } + + @available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index 94b01d97..ebaf0259 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -28,7 +28,14 @@ final class TodayViewController: UIViewController { }() private var titleLabel = LHTodayArticleTitle() + private var subTitleLable = LHTodayArticleTitle(initalizeString: "오늘의 아티클이에요") private var mainArticleView = TodayArticleView() + + private var pointImage: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "TodayArticle_PointImage")) + imageView.contentMode = .scaleAspectFit + return imageView + }() public override func viewDidLoad() { super.viewDidLoad() @@ -75,7 +82,7 @@ extension TodayViewController { loadingIndicatorView.startAnimating() do { let responseArticle = try await ArticleService.shared.inquiryTodayArticle() - titleLabel.title = responseArticle.articleTitle + titleLabel.userNickName = responseArticle.fetalNickname mainArticleView.data = responseArticle todayArticleID = responseArticle.aticleID loadingIndicatorView.stopAnimating() @@ -100,7 +107,7 @@ private extension TodayViewController { func setHierarchy() { view.addSubviews(todayNavigationBar, seperateLine) - view.addSubviews(titleLabel, mainArticleView) + view.addSubviews(titleLabel, subTitleLable, pointImage, mainArticleView) } @@ -121,8 +128,19 @@ private extension TodayViewController { make.leading.equalToSuperview().inset(20) } + subTitleLable.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom) + make.leading.equalTo(titleLabel.snp.leading) + } + + pointImage.snp.makeConstraints { make in + make.top.equalTo(subTitleLable.snp.top) + make.leading.equalTo(subTitleLable.snp.trailing).offset(4) + make.size.equalTo(10) + } + mainArticleView.snp.makeConstraints { make in - make.top.equalTo(titleLabel.snp.bottom).offset(28) + make.top.equalTo(subTitleLable.snp.bottom).offset(28) make.width.equalTo(ScreenUtils.getWidth(335)) make.centerX.equalToSuperview() make.height.equalTo(mainArticleView.snp.width).multipliedBy(TodayArticleImage.ratio) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift index 702f0d91..471c0e60 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift @@ -113,9 +113,6 @@ final class TodayArticleView: UIView { make.leading.equalToSuperview().inset(20) make.trailing.equalToSuperview().inset(16) } - - articleTitleLabel.setTextWithLineHeight(lineHeight: 32) - descriptionLabel.setTextWithLineHeight(lineHeight: 24) } @available(*, unavailable) @@ -150,6 +147,10 @@ private extension TodayArticleView { weekInfomationLabel.text = data.currentWeek.description + "주 " + data.currentDay.description + "일차" articleTitleLabel.text = data.articleTitle descriptionLabel.text = data.articleDescription + articleTitleLabel.setTextWithLineHeight(lineHeight: 32) + descriptionLabel.setTextWithLineHeight(lineHeight: 24) + /// 얘도 text가 있을때 적용되는 녀석 + descriptionLabel.lineBreakMode = .byTruncatingTail } catch { print(error) } From 096d7bd866ed3c1db7f4c52d14e42013e755864c Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 21:50:07 +0900 Subject: [PATCH 09/17] =?UTF-8?q?[FIX]=20Today=EC=95=84=ED=8B=B0=ED=81=B4?= =?UTF-8?q?=20UI=EC=88=98=EC=A0=95(gradient=EC=86=8D=EB=8F=84=20=EA=B3=A0?= =?UTF-8?q?=EB=A0=A4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OnboardingPregnancyTextFieldResultType.swift | 2 +- .../ViewControllers/GetPregnancyViewController.swift | 2 +- .../Scenes/Today/ViewControllers/TodayViewController.swift | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingTextFieldResultType/OnboardingPregnancyTextFieldResultType.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingTextFieldResultType/OnboardingPregnancyTextFieldResultType.swift index 27d0493f..d0a106db 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingTextFieldResultType/OnboardingPregnancyTextFieldResultType.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/OnboardingTextFieldResultType/OnboardingPregnancyTextFieldResultType.swift @@ -19,7 +19,7 @@ enum OnboardingPregnancyTextFieldResultType { case .pregnancyTextFieldValid: return "정상입니다" case .pregnancyTextFieldOver: - return "1에서 40 사이의 숫자를 입력해주세요." + return "4에서 40 사이의 숫자를 입력해주세요." } } diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/GetPregnancyViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/GetPregnancyViewController.swift index a16f406f..f0c406f5 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/GetPregnancyViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/GetPregnancyViewController.swift @@ -119,7 +119,7 @@ extension GetPregnancyViewController: UITextFieldDelegate { guard let textNumber = Int(text) else { return } if textNumber == 0 { textFieldSettingWhenInputNumberZero() - } else if 1 <= textNumber && textNumber <= 40 { + } else if 4 <= textNumber && textNumber <= 40 { textFieldSettingWhenInputNumberValid() } else { textFieldSettingWhenInpubNumberOver() diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index ebaf0259..c0d91cab 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -85,7 +85,9 @@ extension TodayViewController { titleLabel.userNickName = responseArticle.fetalNickname mainArticleView.data = responseArticle todayArticleID = responseArticle.aticleID - loadingIndicatorView.stopAnimating() + DispatchQueue.main.asyncAfter(deadline: .now()+0.4) { + self.loadingIndicatorView.stopAnimating() + } } catch { guard let error = error as? NetworkError else { return } handleError(error) From d73947c66e784e4e58fd203c71206626786e91a4 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 21:57:09 +0900 Subject: [PATCH 10/17] =?UTF-8?q?[FIX]=20loadingView=20window=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/ArticleDetailViewController.swift | 7 +++++-- .../ViewControllers/OnboardingViewController.swift | 1 - 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift index 33561b05..2b8a6a21 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift @@ -18,6 +18,8 @@ final class ArticleDetailViewController: UIViewController { private var progressBar = LHProgressView() private let articleTableView = ArticleDetailTableView() + + private let loadingIndicatorView = LHLoadingView() private lazy var scrollToTopButton: UIButton = { let button = UIButton() @@ -52,7 +54,8 @@ final class ArticleDetailViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - LoadingIndicator.showLoading() + view.addSubview(loadingIndicatorView) + loadingIndicatorView.startAnimating() getArticleDetail() } @@ -70,7 +73,7 @@ extension ArticleDetailViewController { Task { do { self.articleDatas = try await ArticleService.shared.getArticleDetail(articleId: 0) - LoadingIndicator.hideLoading() + loadingIndicatorView.stopAnimating() } catch { guard let error = error as? NetworkError else { return } handleError(error) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift index 48b625ea..2a44df20 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Onboarding/ViewControllers/OnboardingViewController.swift @@ -245,6 +245,5 @@ extension OnboardingViewController: ViewControllerServiceable { case .serverError: LHToast.show(message: "서버놈들") } - self.loadingIndicatorView.stopAnimating() } } From a92ee4849c8739b27e738c366b2852385ea8c0cf Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 22:50:22 +0900 Subject: [PATCH 11/17] =?UTF-8?q?[FIX]=20viewWillappear=EC=97=90=EC=84=9C?= =?UTF-8?q?=20gradient=20=EA=B2=B9=EC=B9=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LionHeart-iOS/Global/Extensions/UIView+.swift | 7 +++++-- .../ViewControllers/CurriculumViewController.swift | 3 +-- .../Scenes/Today/ViewControllers/TodayViewController.swift | 4 ++++ .../Scenes/Today/Views/TodayArticleView.swift | 3 +-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift b/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift index 9ff8bdd3..d63275b9 100644 --- a/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift +++ b/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift @@ -45,8 +45,11 @@ extension UIView{ } else if axis == .vertical { gradient.type = .axial } - gradient.frame = bounds - layer.addSublayer(gradient) + layer.insertSublayer(gradient, at: 0) + } + + func removeGradientInDesignSystem() { + self.layer.sublayers?.filter { $0 is CAGradientLayer }.forEach { $0.removeFromSuperlayer() } } } diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Curriculum/ViewControllers/CurriculumViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Curriculum/ViewControllers/CurriculumViewController.swift index 5a84f76a..2d824db0 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Curriculum/ViewControllers/CurriculumViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Curriculum/ViewControllers/CurriculumViewController.swift @@ -42,7 +42,6 @@ final class CurriculumViewController: UIViewController, CurriculumTableViewToggl private enum Size { static let userInfoView: CGFloat = 70 / 375 - static let progressView: CGFloat = 124 / 375 } private var isFirstPresented: Bool = true @@ -138,7 +137,7 @@ private extension CurriculumViewController { $0.top.equalTo(curriculumUserInfoView.snp.bottom) $0.trailing.leading.equalToSuperview() $0.width.equalTo(Constant.Screen.width) - $0.height.equalTo(progressBar.snp.width).multipliedBy(Size.progressView) + $0.height.equalTo(ScreenUtils.getHeight(180)) } curriculumTableView.snp.makeConstraints{ diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index c0d91cab..121e1fc7 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -50,6 +50,10 @@ final class TodayViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { getInquireTodayArticle() } + + override func viewWillDisappear(_ animated: Bool) { + mainArticleView.mainArticlImageView.removeGradientInDesignSystem() + } } // MARK: - 네트워킹 diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift index 471c0e60..85c5ef39 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift @@ -26,7 +26,7 @@ final class TodayArticleView: UIView { return view }() - private var mainArticlImageView: UIImageView = { + var mainArticlImageView: UIImageView = { let imageView = UIImageView() imageView.contentMode = .scaleAspectFill imageView.layer.cornerRadius = 4 @@ -78,7 +78,6 @@ final class TodayArticleView: UIView { override func draw(_ rect: CGRect) { super.draw(rect) - mainArticlImageView.setGradient(firstColor: .designSystem(.black)!.withAlphaComponent(0.2), secondColor: .designSystem(.gray1000)!, axis: .vertical) weekInfomationView.addSubview(weekInfomationLabel) From 362afd2aa425a22c8d2031b4a30a8ac0723e3052 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Thu, 20 Jul 2023 22:50:59 +0900 Subject: [PATCH 12/17] =?UTF-8?q?[FIX]=20gradient=20remove=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EB=AA=85=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift b/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift index d63275b9..df1cd046 100644 --- a/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift +++ b/LionHeart-iOS/LionHeart-iOS/Global/Extensions/UIView+.swift @@ -49,7 +49,7 @@ extension UIView{ layer.insertSublayer(gradient, at: 0) } - func removeGradientInDesignSystem() { + func removeGradient() { self.layer.sublayers?.filter { $0 is CAGradientLayer }.forEach { $0.removeFromSuperlayer() } } } From cd6b920b5c44ace5e25f2980a2c554a7ae8490f6 Mon Sep 17 00:00:00 2001 From: Kim Minjae Date: Fri, 21 Jul 2023 00:41:50 +0900 Subject: [PATCH 13/17] =?UTF-8?q?[ADD]=20Task=EB=B0=B0=EC=97=B4=20unwrap?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80=20(#101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Network/Services/KingfisherService.swift | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/LionHeart-iOS/LionHeart-iOS/Network/Services/KingfisherService.swift b/LionHeart-iOS/LionHeart-iOS/Network/Services/KingfisherService.swift index 26cbc132..dc889e6e 100644 --- a/LionHeart-iOS/LionHeart-iOS/Network/Services/KingfisherService.swift +++ b/LionHeart-iOS/LionHeart-iOS/Network/Services/KingfisherService.swift @@ -35,4 +35,18 @@ final class LHKingFisherService { } + func unwrapTaskArray(dataTasks: [Task], type: T.Type) async -> [T] { + let tasks = dataTasks.map { task in + Task { + return try await task.result.get() + } + } + + var result: [T?] = [] + for task in tasks { + result.append(try? await task.result.get()) + } + return result.compactMap { $0 } + } + } From e5705d203ed8edabc119c660be15d6b9caba88cf Mon Sep 17 00:00:00 2001 From: Kim Minjae Date: Fri, 21 Jul 2023 00:42:19 +0900 Subject: [PATCH 14/17] =?UTF-8?q?[FEAT]=20=EB=A1=9C=EB=94=A9=EB=B7=B0=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=86=A0=EC=BD=9C=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EA=B5=AC=ED=98=84=20(#101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Protocols/ViewControllerServiceable.swift | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/LionHeart-iOS/LionHeart-iOS/Global/Protocols/ViewControllerServiceable.swift b/LionHeart-iOS/LionHeart-iOS/Global/Protocols/ViewControllerServiceable.swift index a47be206..a1519130 100644 --- a/LionHeart-iOS/LionHeart-iOS/Global/Protocols/ViewControllerServiceable.swift +++ b/LionHeart-iOS/LionHeart-iOS/Global/Protocols/ViewControllerServiceable.swift @@ -7,6 +7,21 @@ import UIKit +final class LHLoadingView: UIActivityIndicatorView { + + init() { + super.init(frame: .zero) + self.style = .large + self.color = .designSystem(.lionRed) + self.backgroundColor = .designSystem(.black) + self.frame = .init(x: 0, y: 0, width: Constant.Screen.width, height: Constant.Screen.height) + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + /// 네트워크 요청을 하는 ViewController가 채택하는 프로토콜 protocol ViewControllerServiceable where Self: UIViewController { @@ -14,4 +29,32 @@ protocol ViewControllerServiceable where Self: UIViewController { /// 네트워크 통신을 do-catch문으로 감싸고 catch문에서 호출하는 메서드 /// - Parameter error: 네트워크 통신 중 throw된 에러 func handleError(_ error: NetworkError) + func showLoading() + func hideLoading() +} + +extension ViewControllerServiceable { + + func showLoading() { + if let loadingView = getLoadingView() { + loadingView.startAnimating() + return + } + let loadingView = LHLoadingView() + loadingView.startAnimating() + + view.addSubview(loadingView) + loadingView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + func hideLoading() { + getLoadingView()?.stopAnimating() + getLoadingView()?.removeFromSuperview() + } + + private func getLoadingView() -> LHLoadingView? { + return view.subviews.compactMap { $0 as? LHLoadingView }.first + } } From cc28bc61a9f915fd6b00643dd061e2b64045dfbe Mon Sep 17 00:00:00 2001 From: kimscastle Date: Fri, 21 Jul 2023 00:50:42 +0900 Subject: [PATCH 15/17] =?UTF-8?q?[FIX]=20data=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=BF=8C=EB=A6=AC=EB=8A=94=EB=B6=80=EB=B6=84=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=EB=A1=9C=EB=B9=BC=EA=B8=B0=20(#98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/TodayViewController.swift | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index 121e1fc7..7846a0d9 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -52,7 +52,7 @@ final class TodayViewController: UIViewController { } override func viewWillDisappear(_ animated: Bool) { - mainArticleView.mainArticlImageView.removeGradientInDesignSystem() + mainArticleView.mainArticlImageView.removeGradient() } } @@ -75,7 +75,6 @@ extension TodayViewController: ViewControllerServiceable { case .serverError: LHToast.show(message: "승준이어딧니 내목소리들리니", isTabBar: true) } - loadingIndicatorView.stopAnimating() } } @@ -86,12 +85,8 @@ extension TodayViewController { loadingIndicatorView.startAnimating() do { let responseArticle = try await ArticleService.shared.inquiryTodayArticle() - titleLabel.userNickName = responseArticle.fetalNickname - mainArticleView.data = responseArticle - todayArticleID = responseArticle.aticleID - DispatchQueue.main.asyncAfter(deadline: .now()+0.4) { - self.loadingIndicatorView.stopAnimating() - } + setData(input: responseArticle) + loadingIndicatorView.stopAnimating() } catch { guard let error = error as? NetworkError else { return } handleError(error) @@ -170,6 +165,12 @@ private extension TodayViewController { } } + func setData(input: TodayArticle) { + titleLabel.userNickName = input.fetalNickname + mainArticleView.data = input + todayArticleID = input.aticleID + } + @objc func articleTapped(_ sender: UIButton) { let articleDetailViewController = ArticleDetailViewController() From 3c448314ef15d4b7eccc32222453b67b2922823f Mon Sep 17 00:00:00 2001 From: Kim Minjae Date: Fri, 21 Jul 2023 01:06:17 +0900 Subject: [PATCH 16/17] =?UTF-8?q?[ADD]=20=EB=A1=9C=EB=94=A9=EB=B7=B0=20Art?= =?UTF-8?q?icleDetail=EC=97=90=20=EC=B6=94=EA=B0=80=20(#101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/ArticleDetailViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift index 6d34cacd..d71a9935 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Article/ArticleDetail/ViewControllers/ArticleDetailViewController.swift @@ -36,6 +36,7 @@ final class ArticleDetailViewController: UIViewController { private var articleDatas: [BlockTypeAppData]? { didSet { self.articleTableView.reloadData() + hideLoading() } } @@ -58,7 +59,7 @@ final class ArticleDetailViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - LoadingIndicator.showLoading() + showLoading() getArticleDetail() } From ae9241c491471cf55e8e038b3a59d6b0a6183677 Mon Sep 17 00:00:00 2001 From: kimscastle Date: Fri, 21 Jul 2023 01:12:18 +0900 Subject: [PATCH 17/17] =?UTF-8?q?[FIX]=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=9B=EC=95=84=EC=98=A4=EA=B3=A0=EB=82=98?= =?UTF-8?q?=EC=84=9C=20loadingView=EA=B0=80=20=EB=81=9D=EB=82=98=EA=B2=8C?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84(#98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/TodayViewController.swift | 13 +++++------ .../Scenes/Today/Views/TodayArticleView.swift | 22 ++++++------------- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift index 7846a0d9..c6e23f80 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/ViewControllers/TodayViewController.swift @@ -85,7 +85,11 @@ extension TodayViewController { loadingIndicatorView.startAnimating() do { let responseArticle = try await ArticleService.shared.inquiryTodayArticle() - setData(input: responseArticle) + let image = try await LHKingFisherService.fetchImage(with: responseArticle.mainImageURL) + mainArticleView.mainArticlImageView.image = image + titleLabel.userNickName = responseArticle.fetalNickname + mainArticleView.data = responseArticle + todayArticleID = responseArticle.aticleID loadingIndicatorView.stopAnimating() } catch { guard let error = error as? NetworkError else { return } @@ -165,13 +169,6 @@ private extension TodayViewController { } } - func setData(input: TodayArticle) { - titleLabel.userNickName = input.fetalNickname - mainArticleView.data = input - todayArticleID = input.aticleID - } - - @objc func articleTapped(_ sender: UIButton) { let articleDetailViewController = ArticleDetailViewController() // MARK: - 여기 self.todayArticleID 를 넘겨주세요(optional) diff --git a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift index 85c5ef39..0a0a9333 100644 --- a/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift +++ b/LionHeart-iOS/LionHeart-iOS/Scenes/Today/Views/TodayArticleView.swift @@ -139,20 +139,12 @@ private extension TodayArticleView { func configureView(data: TodayArticle?) { guard let data else { return } - Task { - do { - let image = try await LHKingFisherService.fetchImage(with: data.mainImageURL) - mainArticlImageView.image = image - weekInfomationLabel.text = data.currentWeek.description + "주 " + data.currentDay.description + "일차" - articleTitleLabel.text = data.articleTitle - descriptionLabel.text = data.articleDescription - articleTitleLabel.setTextWithLineHeight(lineHeight: 32) - descriptionLabel.setTextWithLineHeight(lineHeight: 24) - /// 얘도 text가 있을때 적용되는 녀석 - descriptionLabel.lineBreakMode = .byTruncatingTail - } catch { - print(error) - } - } + weekInfomationLabel.text = data.currentWeek.description + "주 " + data.currentDay.description + "일차" + articleTitleLabel.text = data.articleTitle + descriptionLabel.text = data.articleDescription + articleTitleLabel.setTextWithLineHeight(lineHeight: 32) + descriptionLabel.setTextWithLineHeight(lineHeight: 24) + /// 얘도 text가 있을때 적용되는 녀석 + descriptionLabel.lineBreakMode = .byTruncatingTail } }