From 2ecd461a253fdc04e006acf09b998ccdaf709436 Mon Sep 17 00:00:00 2001 From: hooni Date: Tue, 9 Jul 2024 14:11:06 +0900 Subject: [PATCH 01/10] =?UTF-8?q?feat/#148-=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=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 --- .../Source/MyPage/MyPageViewController.swift | 55 +++++++++++++----- KkuMulKum/Source/MyPage/MypageView.swift | 56 +++++++++++++++++++ 2 files changed, 98 insertions(+), 13 deletions(-) create mode 100644 KkuMulKum/Source/MyPage/MypageView.swift diff --git a/KkuMulKum/Source/MyPage/MyPageViewController.swift b/KkuMulKum/Source/MyPage/MyPageViewController.swift index 73f1ea54..5beb560a 100644 --- a/KkuMulKum/Source/MyPage/MyPageViewController.swift +++ b/KkuMulKum/Source/MyPage/MyPageViewController.swift @@ -7,23 +7,52 @@ import UIKit -class MyPageViewController: BaseViewController { - +class MyPageViewController: UIViewController { + + private let myPageView = MyPageView() + override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .white + setupCustomNavigationBar() } - - /* - // 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. + private func setupCustomNavigationBar() { + guard let navigationBar = navigationController?.navigationBar else { return } + + // 네비게이션 바의 배경색 설정 + navigationBar.isTranslucent = false + navigationBar.backgroundColor = .white + + // 타이틀 레이블 + let titleLabel = UILabel() + titleLabel.text = "마이페이지" + titleLabel.font = UIFont.pretendard(.body03) + titleLabel.textAlignment = .center + + // 구분선 뷰 + let separatorView = UIView() + separatorView.backgroundColor = UIColor.gray2 + + navigationBar.addSubview(titleLabel) + navigationBar.addSubview(separatorView) + + // 레이블 제약 조건 + titleLabel.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + titleLabel.centerXAnchor.constraint(equalTo: navigationBar.centerXAnchor), + titleLabel.centerYAnchor.constraint(equalTo: navigationBar.centerYAnchor) + ]) + + // 구분선 제약 조건 + separatorView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + separatorView.heightAnchor.constraint(equalToConstant: 1), + separatorView.leadingAnchor.constraint(equalTo: navigationBar.leadingAnchor), + separatorView.trailingAnchor.constraint(equalTo: navigationBar.trailingAnchor), + separatorView.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor) + ]) } - */ - } + + diff --git a/KkuMulKum/Source/MyPage/MypageView.swift b/KkuMulKum/Source/MyPage/MypageView.swift new file mode 100644 index 00000000..ce37fc3f --- /dev/null +++ b/KkuMulKum/Source/MyPage/MypageView.swift @@ -0,0 +1,56 @@ +// +// MypageView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import SnapKit +import Then + +class MyPageView: UIView { + + private let titleLabel = UILabel().then { + $0.text = "마이페이지" + $0.textAlignment = .center + $0.font = UIFont.pretendard(.body03) + $0.textColor = .black + } + + private let separatorView = UIView().then { + $0.backgroundColor = UIColor.gray2 + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupViews() + layoutViews() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setupViews() + layoutViews() + } + + private func setupViews() { + addSubview(titleLabel) + addSubview(separatorView) + } + + //네비게이션바 미사용으로 UI 커스텀구현 + private func layoutViews() { + titleLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(18) + $0.centerX.equalToSuperview() + } + + separatorView.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(16) + $0.height.equalTo(1) + $0.leading.trailing.equalToSuperview().inset(0) + } + } +} From 29a7a52209816edd65414f6d728b7ca1a0eeaa3e Mon Sep 17 00:00:00 2001 From: hooni Date: Tue, 9 Jul 2024 15:24:26 +0900 Subject: [PATCH 02/10] =?UTF-8?q?fix/#148-=ED=8F=B4=EB=8D=94=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=EC=9C=84=EC=B9=98=20=EB=AA=BB=EC=B0=BE=EB=8A=94?= =?UTF-8?q?=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 --- KkuMulKum.xcodeproj/project.pbxproj | 4 ++++ KkuMulKum/Source/MyPage/MypageView.swift | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 8c7ef517..adeaec61 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -44,6 +44,7 @@ 785AE1BE2C2E878600677CA0 /* FirebaseStorageCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BD2C2E878600677CA0 /* FirebaseStorageCombine-Community */; }; 785AE1C02C2E878600677CA0 /* FirebaseVertexAI-Preview in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BF2C2E878600677CA0 /* FirebaseVertexAI-Preview */; }; 785AE1D12C3B07A600677CA0 /* PrivacyInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */; }; + 7898732E2C3D0EAB00435E96 /* MypageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7898732D2C3D0EAA00435E96 /* MypageView.swift */; }; 789AD4B32C3C0093002E2688 /* SocialLoginResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */; }; 789AD4B52C3C0147002E2688 /* ResissueResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */; }; 78B9286C2C29402C006D9942 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B9286B2C29402C006D9942 /* AppDelegate.swift */; }; @@ -111,6 +112,7 @@ /* Begin PBXFileReference section */ 784E4D9A2C3BBD4D00BC943C /* KakaoLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoLoginVC.swift; sourceTree = ""; }; 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PrivacyInfo.plist; sourceTree = ""; }; + 7898732D2C3D0EAA00435E96 /* MypageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MypageView.swift; sourceTree = ""; }; 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginResponseModel.swift; sourceTree = ""; }; 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResissueResponseModel.swift; sourceTree = ""; }; 78B928682C29402C006D9942 /* KkuMulKum.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KkuMulKum.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -286,6 +288,7 @@ DDA2EE7D2C386087007C6059 /* MyPage */ = { isa = PBXGroup; children = ( + 7898732D2C3D0EAA00435E96 /* MypageView.swift */, DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */, ); path = MyPage; @@ -647,6 +650,7 @@ buildActionMask = 2147483647; files = ( DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */, + 7898732E2C3D0EAB00435E96 /* MypageView.swift in Sources */, DED5DBEC2C345210006ECE7E /* BaseViewController.swift in Sources */, DD30721A2C3C011600416D9F /* AddPromiseRequestModel.swift in Sources */, DD30721E2C3C0CC800416D9F /* PromiseInfoResponseModel.swift in Sources */, diff --git a/KkuMulKum/Source/MyPage/MypageView.swift b/KkuMulKum/Source/MyPage/MypageView.swift index ce37fc3f..239f9f49 100644 --- a/KkuMulKum/Source/MyPage/MypageView.swift +++ b/KkuMulKum/Source/MyPage/MypageView.swift @@ -28,7 +28,7 @@ class MyPageView: UIView { setupViews() layoutViews() } - + // required init?(coder: NSCoder) { super.init(coder: coder) setupViews() From 8fd16ffcf61a8a2c7a18732d31899b37831dcb01 Mon Sep 17 00:00:00 2001 From: hooni Date: Tue, 9 Jul 2024 17:09:03 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat/#148-=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=EB=B0=94=20=EC=BB=A4=EC=8A=A4=ED=85=80=20+?= =?UTF-8?q?=20=EB=B0=B0=EA=B2=BD=EC=83=89=EC=83=81=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/MyPage/MyPageViewController.swift | 51 +++++-------------- KkuMulKum/Source/MyPage/MypageView.swift | 42 +++++++-------- 2 files changed, 31 insertions(+), 62 deletions(-) diff --git a/KkuMulKum/Source/MyPage/MyPageViewController.swift b/KkuMulKum/Source/MyPage/MyPageViewController.swift index 5beb560a..f71f4d0c 100644 --- a/KkuMulKum/Source/MyPage/MyPageViewController.swift +++ b/KkuMulKum/Source/MyPage/MyPageViewController.swift @@ -7,52 +7,25 @@ import UIKit -class MyPageViewController: UIViewController { +class MyPageViewController: BaseViewController { private let myPageView = MyPageView() override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = .white - setupCustomNavigationBar() + view.backgroundColor = .green2 } - private func setupCustomNavigationBar() { + override func setupView() { + super.setupView() + configureNavigationBar() + } + + private func configureNavigationBar() { guard let navigationBar = navigationController?.navigationBar else { return } - - // 네비게이션 바의 배경색 설정 - navigationBar.isTranslucent = false - navigationBar.backgroundColor = .white - - // 타이틀 레이블 - let titleLabel = UILabel() - titleLabel.text = "마이페이지" - titleLabel.font = UIFont.pretendard(.body03) - titleLabel.textAlignment = .center - - // 구분선 뷰 - let separatorView = UIView() - separatorView.backgroundColor = UIColor.gray2 - - navigationBar.addSubview(titleLabel) - navigationBar.addSubview(separatorView) - - // 레이블 제약 조건 - titleLabel.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - titleLabel.centerXAnchor.constraint(equalTo: navigationBar.centerXAnchor), - titleLabel.centerYAnchor.constraint(equalTo: navigationBar.centerYAnchor) - ]) - - // 구분선 제약 조건 - separatorView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - separatorView.heightAnchor.constraint(equalToConstant: 1), - separatorView.leadingAnchor.constraint(equalTo: navigationBar.leadingAnchor), - separatorView.trailingAnchor.constraint(equalTo: navigationBar.trailingAnchor), - separatorView.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor) - ]) + navigationBar.addSubview(myPageView) + myPageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } } } - - diff --git a/KkuMulKum/Source/MyPage/MypageView.swift b/KkuMulKum/Source/MyPage/MypageView.swift index 239f9f49..2cfc1e98 100644 --- a/KkuMulKum/Source/MyPage/MypageView.swift +++ b/KkuMulKum/Source/MyPage/MypageView.swift @@ -4,53 +4,49 @@ // // Created by 이지훈 on 7/9/24. // - import UIKit import SnapKit import Then -class MyPageView: UIView { - +class MyPageView: BaseView { + private let titleLabel = UILabel().then { $0.text = "마이페이지" $0.textAlignment = .center $0.font = UIFont.pretendard(.body03) $0.textColor = .black } - + private let separatorView = UIView().then { $0.backgroundColor = UIColor.gray2 } - override init(frame: CGRect) { - super.init(frame: frame) - setupViews() - layoutViews() - } - // - required init?(coder: NSCoder) { - super.init(coder: coder) - setupViews() - layoutViews() + // 배경색을 설정할 추가 뷰 + private let backgroundView = UIView().then { + $0.backgroundColor = .white } - - private func setupViews() { + + override func setupView() { + addSubview(backgroundView) addSubview(titleLabel) addSubview(separatorView) } - - //네비게이션바 미사용으로 UI 커스텀구현 - private func layoutViews() { + + override func setupAutoLayout() { + backgroundView.snp.makeConstraints { make in + make.edges.equalTo(safeAreaLayoutGuide) + } + titleLabel.snp.makeConstraints { - $0.top.equalToSuperview().offset(18) $0.centerX.equalToSuperview() + $0.centerY.equalToSuperview() } - + separatorView.snp.makeConstraints { - $0.top.equalTo(titleLabel.snp.bottom).offset(16) $0.height.equalTo(1) - $0.leading.trailing.equalToSuperview().inset(0) + $0.leading.trailing.equalToSuperview() + $0.bottom.equalToSuperview() } } } From ff73e6a93d590a093da123dbc26dee9ea61fd51b Mon Sep 17 00:00:00 2001 From: hooni Date: Tue, 9 Jul 2024 23:28:54 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat/#148-=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80UI=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 마이페이지 UI 구현 - 앱잼내 UI만 구현이기에 ViewModel은 작성하지않음 --- KkuMulKum.xcodeproj/project.pbxproj | 38 +++++- .../Image/img_edit.imageset/Contents.json | 23 ++++ .../Image/img_edit.imageset/edit 1.png | Bin 0 -> 660 bytes .../Image/img_edit.imageset/edit 2.png | Bin 0 -> 660 bytes .../Image/img_edit.imageset/edit.png | Bin 0 -> 660 bytes .../Image/img_profile.imageset/Contents.json | 6 +- .../img_profile.imageset/my_btn_edit 1.png | Bin 0 -> 6461 bytes .../img_profile.imageset/my_btn_edit 2.png | Bin 0 -> 6461 bytes .../img_profile.imageset/my_btn_edit.png | Bin 0 -> 6461 bytes .../img_profile.imageset/profileBasic.png | Bin 1258 -> 0 bytes .../img_profile.imageset/profileBasic@2x.png | Bin 2711 -> 0 bytes .../img_profile.imageset/profileBasic@3x.png | Bin 4348 -> 0 bytes .../Source/MyPage/MyPageViewController.swift | 31 ----- KkuMulKum/Source/MyPage/MypageView.swift | 52 --------- .../MyPage/View/MyPageAlarmSettingView.swift | 71 ++++++++++++ .../MyPage/View/MyPageContentView.swift | 102 +++++++++++++++++ .../MyPage/View/MyPageEtcSettingView.swift | 108 ++++++++++++++++++ .../MyPage/View/MyPageNavigationView.swift | 40 +++++++ .../ViewController/MyPageViewController.swift | 54 +++++++++ 19 files changed, 434 insertions(+), 91 deletions(-) create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 1.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 2.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 1.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 2.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/profileBasic.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/profileBasic@2x.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/profileBasic@3x.png delete mode 100644 KkuMulKum/Source/MyPage/MyPageViewController.swift delete mode 100644 KkuMulKum/Source/MyPage/MypageView.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageContentView.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift create mode 100644 KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift create mode 100644 KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index adeaec61..f5368230 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 78198A1D2C3D41E5000EB90F /* MyPageEtcSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78198A1C2C3D41E5000EB90F /* MyPageEtcSettingView.swift */; }; + 78198A1F2C3D4327000EB90F /* MyPageAlarmSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78198A1E2C3D4327000EB90F /* MyPageAlarmSettingView.swift */; }; 784E4D942C3B1C7F00BC943C /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D932C3B1C7F00BC943C /* KakaoSDK */; }; 784E4D962C3B1C7F00BC943C /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D952C3B1C7F00BC943C /* KakaoSDKAuth */; }; 784E4D992C3B95A900BC943C /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D982C3B95A900BC943C /* KeychainAccess */; }; @@ -44,7 +46,8 @@ 785AE1BE2C2E878600677CA0 /* FirebaseStorageCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BD2C2E878600677CA0 /* FirebaseStorageCombine-Community */; }; 785AE1C02C2E878600677CA0 /* FirebaseVertexAI-Preview in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BF2C2E878600677CA0 /* FirebaseVertexAI-Preview */; }; 785AE1D12C3B07A600677CA0 /* PrivacyInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */; }; - 7898732E2C3D0EAB00435E96 /* MypageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7898732D2C3D0EAA00435E96 /* MypageView.swift */; }; + 7898732E2C3D0EAB00435E96 /* MyPageNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7898732D2C3D0EAA00435E96 /* MyPageNavigationView.swift */; }; + 7898733A2C3D35A700435E96 /* MyPageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789873392C3D35A700435E96 /* MyPageContentView.swift */; }; 789AD4B32C3C0093002E2688 /* SocialLoginResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */; }; 789AD4B52C3C0147002E2688 /* ResissueResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */; }; 78B9286C2C29402C006D9942 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B9286B2C29402C006D9942 /* AppDelegate.swift */; }; @@ -110,9 +113,12 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 78198A1C2C3D41E5000EB90F /* MyPageEtcSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageEtcSettingView.swift; sourceTree = ""; }; + 78198A1E2C3D4327000EB90F /* MyPageAlarmSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageAlarmSettingView.swift; sourceTree = ""; }; 784E4D9A2C3BBD4D00BC943C /* KakaoLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoLoginVC.swift; sourceTree = ""; }; 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PrivacyInfo.plist; sourceTree = ""; }; - 7898732D2C3D0EAA00435E96 /* MypageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MypageView.swift; sourceTree = ""; }; + 7898732D2C3D0EAA00435E96 /* MyPageNavigationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageNavigationView.swift; sourceTree = ""; }; + 789873392C3D35A700435E96 /* MyPageContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageContentView.swift; sourceTree = ""; }; 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginResponseModel.swift; sourceTree = ""; }; 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResissueResponseModel.swift; sourceTree = ""; }; 78B928682C29402C006D9942 /* KkuMulKum.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KkuMulKum.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -225,6 +231,25 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 789873382C3D359000435E96 /* View */ = { + isa = PBXGroup; + children = ( + 7898732D2C3D0EAA00435E96 /* MyPageNavigationView.swift */, + 789873392C3D35A700435E96 /* MyPageContentView.swift */, + 78198A1E2C3D4327000EB90F /* MyPageAlarmSettingView.swift */, + 78198A1C2C3D41E5000EB90F /* MyPageEtcSettingView.swift */, + ); + path = View; + sourceTree = ""; + }; + 7898733B2C3D363400435E96 /* ViewController */ = { + isa = PBXGroup; + children = ( + DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; 78B9285F2C29402C006D9942 = { isa = PBXGroup; children = ( @@ -288,8 +313,8 @@ DDA2EE7D2C386087007C6059 /* MyPage */ = { isa = PBXGroup; children = ( - 7898732D2C3D0EAA00435E96 /* MypageView.swift */, - DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */, + 7898733B2C3D363400435E96 /* ViewController */, + 789873382C3D359000435E96 /* View */, ); path = MyPage; sourceTree = ""; @@ -650,7 +675,7 @@ buildActionMask = 2147483647; files = ( DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */, - 7898732E2C3D0EAB00435E96 /* MypageView.swift in Sources */, + 7898732E2C3D0EAB00435E96 /* MyPageNavigationView.swift in Sources */, DED5DBEC2C345210006ECE7E /* BaseViewController.swift in Sources */, DD30721A2C3C011600416D9F /* AddPromiseRequestModel.swift in Sources */, DD30721E2C3C0CC800416D9F /* PromiseInfoResponseModel.swift in Sources */, @@ -668,6 +693,7 @@ DE254AB72C3119D000A4015E /* ReuseIdentifiable.swift in Sources */, DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */, DE254AB42C31199B00A4015E /* UITextField+.swift in Sources */, + 78198A1D2C3D41E5000EB90F /* MyPageEtcSettingView.swift in Sources */, DE8248002C36E857000601BC /* ObservablePattern.swift in Sources */, DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */, DED5DBF02C345317006ECE7E /* BaseCollectionViewCell.swift in Sources */, @@ -688,6 +714,7 @@ 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */, DDA2EE792C385FCF007C6059 /* MyPageViewController.swift in Sources */, A3FB185B2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift in Sources */, + 7898733A2C3D35A700435E96 /* MyPageContentView.swift in Sources */, 784E4D9B2C3BBD4D00BC943C /* KakaoLoginVC.swift in Sources */, DD3072222C3C0DA300416D9F /* PromiseParticipantListResponseModel.swift in Sources */, DE32D1D22C3BF703006848DF /* LoginUserResponseModel.swift in Sources */, @@ -699,6 +726,7 @@ DE9E18802C3BA4AA00DB76B4 /* CustomButton.swift in Sources */, DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */, DE8247FD2C36E7C7000601BC /* MoyaLoggingPlugin.swift in Sources */, + 78198A1F2C3D4327000EB90F /* MyPageAlarmSettingView.swift in Sources */, DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */, DE254AB92C311AB300A4015E /* Screen.swift in Sources */, ); diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json new file mode 100644 index 00000000..429a98a8 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "edit.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "edit 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "edit 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 1.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 1.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fcd1770733d077204f8db07adcf8248c3785d3 GIT binary patch literal 660 zcmV;F0&D$=P)057z74^#bS|{d`r4?UEBS(-4ecJp}-0s zCue8v;cL6y{)?XREqchWh`?Yl5VP4#OeT|L43Eb{oK7e4d_D{32bV^4y-X@t7Pgf=Uxzgk3C`%Ov`T!@+t^Flk+wG$0*F3n0qV=`cN%2TCLLOWra7JO(xQ=THUHNHI_rtMA$W_ zHECU#`irnDH*La2cf?k5I;1c(mJTfpjih4;Lv86;!ca>(rZ7~l9(9CS{2;8Zq3a4m zCF!<=Ss1Y_txIWXU6^I#e!q9lF$purw&W~JshsYTFceC6O&FZgT@(hZbXSGJDBWdY z$VpTDyDSX3l1I}-!tSA}Fg2SwuAN6ya?-N*07YMH66R(jdl|mSqzCH*HPW_b3B(eH zjI=7um)o{HF@+%`t)_-8%CUtZlhgV|D50Y89zTk)Y^1~xhE$r!snKIh9|BQRw6d&nOe56CsOX)Yk0_7XfLp&k?0000057z74^#bS|{d`r4?UEBS(-4ecJp}-0s zCue8v;cL6y{)?XREqchWh`?Yl5VP4#OeT|L43Eb{oK7e4d_D{32bV^4y-X@t7Pgf=Uxzgk3C`%Ov`T!@+t^Flk+wG$0*F3n0qV=`cN%2TCLLOWra7JO(xQ=THUHNHI_rtMA$W_ zHECU#`irnDH*La2cf?k5I;1c(mJTfpjih4;Lv86;!ca>(rZ7~l9(9CS{2;8Zq3a4m zCF!<=Ss1Y_txIWXU6^I#e!q9lF$purw&W~JshsYTFceC6O&FZgT@(hZbXSGJDBWdY z$VpTDyDSX3l1I}-!tSA}Fg2SwuAN6ya?-N*07YMH66R(jdl|mSqzCH*HPW_b3B(eH zjI=7um)o{HF@+%`t)_-8%CUtZlhgV|D50Y89zTk)Y^1~xhE$r!snKIh9|BQRw6d&nOe56CsOX)Yk0_7XfLp&k?0000057z74^#bS|{d`r4?UEBS(-4ecJp}-0s zCue8v;cL6y{)?XREqchWh`?Yl5VP4#OeT|L43Eb{oK7e4d_D{32bV^4y-X@t7Pgf=Uxzgk3C`%Ov`T!@+t^Flk+wG$0*F3n0qV=`cN%2TCLLOWra7JO(xQ=THUHNHI_rtMA$W_ zHECU#`irnDH*La2cf?k5I;1c(mJTfpjih4;Lv86;!ca>(rZ7~l9(9CS{2;8Zq3a4m zCF!<=Ss1Y_txIWXU6^I#e!q9lF$purw&W~JshsYTFceC6O&FZgT@(hZbXSGJDBWdY z$VpTDyDSX3l1I}-!tSA}Fg2SwuAN6ya?-N*07YMH66R(jdl|mSqzCH*HPW_b3B(eH zjI=7um)o{HF@+%`t)_-8%CUtZlhgV|D50Y89zTk)Y^1~xhE$r!snKIh9|BQRw6d&nOe56CsOX)Yk0_7XfLp&k?00008`@Uj~P5ll$`K_ME*uF=H2nB8A}XR0?nv-8s3)74#1_4fm9&)bfZnfmtksi&T* z+9E^^D=RBA=7eLPJvYqpfW1AFcr2zd;w>Y4UbRR37;gV%Z@2Hy&dx3iQOOn|-eJVt zkdBaX-Yeart`dkJVvo#m&few)z;h__im`%j%3U$Xg4RSVejMMKBckyAfg&#%BWj4a zX^sQ-tWD5qf$&?>5q*oIuMUdbF}5H5f^SCeNxOGRJ~BzM{Klhaw+=b?w)r-kEWqSTx5Giak9P z`2ZM_drwO`Vs8l<3Ps)n#jTEZqRxnYQAl4Xatp<+o=7^*z9^)N+KZgx4vv;N-r{)s zU1}?GJ2B)_p}0e3QJA1>Q#+9-hQj8B)PZ^FjI~EnQ)(r0Bk(zMIw~9rs~eHjxW8Tt zkux+WmXr>ByfztkyKj}3Y>J>z(w08YD2J2ZWm{Od+!rMHWQiSU>#gNNGDIY zHw8`x(U6+BdQeWzzBkE9Bmuj6Fivg+j$twOy-6M#=2$Xq=&%HcdMCHz-UzvZ{DDa6 zU`i{7+g2qIREyk(=Vye=EsrZnxBYLFrOpW<<$*Qk4r%SDs}Z^Ff1ebNeUoa4L}@==g~*v;Bc2e6 zLZN#va$BAXfwTWjd;lT)K~0NNc%67lWY8&a;tObtOINR6eNB|$t;lT!+oBNSA$RWF zS=3S?=cUN)u*HH9;x|V%46%9FC%0ePybz*?dDBNfBA()v$SH857;lB{jmRl*5&&Kb z-3yW1BpdtSBm}VLyH{O*(h_lH^vTf|X$T<%G^C@6(r_wrTa(V6O$h1caG48EI1AU=4<}?OrS;EU zIyo!a2pLR!^9CsaCnC3Ff(;>r45MkZGB1uPJY2V7`b8mxq{ZosH5X2PMhGEUa2mE3 zDsqPDgydqM%dow$aGhZ~A!Fez+g_xTvo4*G{5Z?D7b0>y`J^d?ka1{QEfvbx;W~F5 zO~=~Wn*8_Qf3m*5jxBcDXFP^;{Co&(*|Md5OiXnAV{&q`eII8$hBFxo!uH)o*0xW{ z_+YiwhL8;)+}pQrx5W%$C&e5(_;%0`iSWeDl z+g;F@A#9u>Zjzo@@LRWTZJ$Y--9;tg#{EXU-|WpLv9NF5x>Xyeb^$JmIBwp&*>-gZ zeR_Jj?x8)Ba0jITayxll*Gz|)A?nz*i8~;2i2a^>?va{;1t428CgX@4$+o7{1c)0> zgM+SJE^v1U9Y@Xj?=2(pvE4kE$m_IT8^!GpH5L2VZk|`(_%ByABnIecQHe?W}y@jOFHeL>{b*!?9!cCVGIQ!`TB4 z;m30GOd>Y|Z%Uw3N$K9Yse!BKcJr*4z97fN|NZx0`RAX1C~(E#x4U-jT00U8l-$}& z?c^a=x5W*E6>4DtSHJJR`$7!gbGdnzZy_ibhp^$^6nJ>x;vML3`~$g!^In-916VN1oZpQ*rDvyqzTt^b@qLN0w*A#c91CvJ~Uhp zA>oGVH6+;xi9yi}rm!k!Hf;iKl#@3_F{omrz)3G?69KFRkU9Z3O5|^fQZQDE%qk)M zKoOMk3daL!UpP?YcIB6Sq7V#^u}qZ=BW@##hfb00vc$ig)#k{yeZ01+@~TQ5wG#5kfF0g`-xmtRvqGIHk}j&LUwJ2F)=YQG-Oxr5@xpe80 zy#4mu^2Z;4bUps?!w<{HAAj7wc+?ezDi;IWTB`bg>w!gXZ{xMsfxCq})%M{eJ~Ep-Mi-cOh@5N;Z9u{eGD z^uXuw976dzqpZ}mZ-zZ7^1Y$}I5KxVh@9ID-vwjaJ9g~o%8o<)@4WL)rV#t3mtJb0Q4E7@ zJAn8ha1_^&4rqH*Q&ZwQ6B84gl5g!%eiO%^5d}kNNE9(#?*>C@5GNdb-2OAh*CBAc z7cL;=E?c*5)$*Mz&(6;7Pd*Tfd_@%W%m4c8FZJO%_R2=7q`Bg@k2K)Ih611}OL_Bt zZX~Tj*u@4_Zx1~1fG8j`BHx{SAQrjz%7M5ca;-olXe5)9lad#NjEH8+6phx;?E;jz zroF&bOxJQyQ^V$=`h@2GI6~keYQQ11Sa4;Gabsh^BHXL&&+Q7dK_wzbRK6kd2~je9 zrd8x{!lEa6;QjEvE{TO%B>3Fhw{I7%D4H+PW!w;XLlmHOLW-+?oa_FftM`Y{mAK(1 z6t%%Fl(A_u0v{9Vws+v7MEZ+ zN+X(`T!qLrI=L$sk8!n_f$MPE_4ncmEp5>JeqDVn{F?tK#0f0HB~@T9MzhKLYBC@i zo!oVGo~zkWu0OZdszpU@aFdg(nSrJa*A;56RxNS8ycQSXbWS6Ahaz_fgyO2o3-9Zy zb^xE-)h;5qfN&}8a?v?psffS-{=0B7#$}=|fyj#vtMR!tmnLgP%{aMM;EGqSTq#WG zc%LHQZxHz0n735q=PvU7$WR)|JN{3QwP09BYtScpfyw?;h;$5QSy!| zCl4vZPIQ5`$3A%p(9KCzC~JGG$vbMobwH7ms?aX-RZ)W0WrK)*G`Bs7T+Or~IytEd zO>NKQucEH|qR7dS{LrxJ90?1wIZa95wY9Y_<5nedz>uAkjq6o+9iTVy1{8kbL^%qh z$0&J6os%h#v-*vcfyStDc6PSQxF_sB z#*ruj0%zZxxCU)ZVW_^zv?m5V;X4f3iEET@%($uh9gF;&C<9>>6L7>8N)v9I3Sruh z*|WOj8_>E1F7Y3&ZEJ09ZIfZgB9BBNbaUbYStey7#%!HH2X&;r7B#eFGKG1$;C0HS^m zc6DSmC*NYQG2hLbH-(V2z`+A>@xDnn&>P>jL^*l41}60+kT4y5H|U9pv@g`ejvYIg zZ6_mvzyk@>L2J+x!8tj=kH`Kw8ASlu^dzl8Pi(Tg5c=gYERrFEP+s)X%fS9P=yw_W zN&|$O9BCt448x?y&yyntX-TM_T)s?KhOqesgYg+TyUf{?8!|c zx645d{Uc4#$w@DPUHF%cW}{&*7?fHJVkix;)RpuS*zoF!Q7;&zfR+RT$ID4CfwhU& zs2B7Vxv~G2C|xb4m-Y2^AtXsaZ6fMjez_mRV%d>lfCeaX(#zV~ngl|s;qGA~Z%F{K z7>4w6=gu7ogvB&38YprbvbRJzw{PDTLXre>;a^S@s)JFfXVqDDT(JWR%}7C@T?8QX zV`*PFO5_Wo7|tsvgSc_yhA5|%_Ju=5uDLMg)~#FZgOGl}$rX3yz8X~klO#>0$PrNn zLi7Nx)Wk8@uV2^Nomagqv@J>P%-{h|nrjqlF#2We|QQ+M*K z1`bYvle8cShjjrJky(prMUDiV_uCsYOec9jf>u$sJ@YKlR3f(tIPVvez)CQLV}hCMFiMB-}RsF2idV#bX$zlW{=X@qNhEe8yZ!@YEvrxdM)1Iw=B(++(9?<#BP4 zb+WaW!)X*aDFTG+2-`g+xAroL+($P@!h}UHq$tpyJWRqZTkYi{&pJ4`qBO-5=;EYk z(541$x`5|aS63y9qV^fbrAwFE&*65GnVFf5Etq!g+SR^~bEDCajEpseook7Vm6eq< z;(^d{#brjFxBw!L*MftvmzS62mtTHq3%UqnfzbEu+t)rr{6olG{L)KakvGlhj8qIa zPav*9k<72Z{@NBcT-znF;BoZfkP-Q!j6v?juBvu(WI<8BN=T6)!@jh%)IQ1{QiG$% zVz=&&jQT+tlW|1elnUJ(Sx_e2NKsTN?p|WCH=E7N0N~uM2-vr+`N?e<_y)zxF9_L`s=SX zE)TY9gnlS%_&)X?LUxAQTT&8qa54@E&Eeom*Z-SYUtd3Y*pTIq3fnKHtRx&mb&?nK zzj1_s5&Qi6@4ug_p1sK301t`dg(Wb7fC49ZfP;r3aA3mr`LvE+n8@ukIH$`*1+?=8 zDUk~oF35M^1+!7_2FCP`8l5*sy{^!GeT~rP&1vkx`$2Fw6p|GrX)y*KDz=Z_81@<$ zn|B`)N6^Vh7LZ(1oMcN2l5uB@&{TT#+$ARowpG^4B~o!=wV)b|Z9z?MI~mxDqQ#i_c*? zg#Gf%FUx}uKDg=e0|ySsH{X2IK62792Zq(=lMgxx*JF&(u_;3#!)g>cNdv_F^Uptv zkHEd(c;k&t0#EYXbI-|(FTN;wFdy{a^oIJt2Ii8o!RVFt~x{)+M;6A!I1P%v} zL0FFP9AP?ui$C$i6C1aG`spV*fBwAW00QrFbEi%YY;8MMxA1tqx@y7(Z0_e-#yJb7~C_9KrxB4Yr7 z&&7925jn7n(d8aL=kOUBg>NpNMd0!CF>%&CFGerV$G1xpIl%b2apV({1B#ps0}hUP z;=Yho;2`PV1#G9>j6?QPMc)1&PD~&v;Hey%Ldw zgwP2Y3tt4D9QMNa_j~WXmrLM9xVQy<@L@7z&ZM<{x7$oD2qoY{nQ{11NoD@Q; zqF3NQ{P2T(@x>QI|E8b7@i+L}GV$6T?eN-ubF9M2*)JzmpjqI+`xw|3%s}YT)Reb@ z2dR*qJ9mmJv5V2QgTkC9A+OW{#CtJrOuqR$XCYgdRyp=uY=VCw>DbpPrtU zB8b;M2cwo?>L+j%#}u@5Qz0xYEVR^@k=cGa){R4j9K-h-0)ZEid_#SC(#eNyZZJsT z@n#7=V3KYvoP((qHA2U9Rfg|1WzU{HGA>DhL#%^Vb+@#3Pnc}B+EgN^6_Av+RqC#t0YVivgZ{!oH^;vxQ(TiA?$v;nRxEt zU}F=LTFm$`LT^ZCHd|9juwe0sK*ce*#Sm4pIW5;&KcWN=?!@BxG zBlbDzxOziKa3Eygzkk1+J$qKNlI)N70@p_P4pHM=(3(4*`JZAdL_)Qy9FS`2TF|}Vf&4lpF z=D>DMnD7z_(Mro42k~1z_0&_RjH9L6nI|O7zq#)wC0tLb2PWs#(K5#oBkor36Ne8U zUNBvCy`fgdwr`r&@haS7BOkestsb8z>T5MODDb?$xwx6DgDqO(Xk|JJ_H$w$Bh zomXH%&r@q_YbS;Xy9?vy`2Ciov%_bIteUpDKdx@;2SuI|TTt_YIS~Fegp>(p7h*c` z0%jdbMvTy#M(AfGK#ag&Gy)&GBpOAY10#5d9nSuO5SO%MKz}y(t}c-zTI9TITppa=P{~jLzqc(1R#~>Ng%f@U=n;0psnauQ+G=jL!?h z`K(0JnNZOx!nKDHf}^K(@Qv3CDI8m1)09p~PlxYMOFEA2T-d!Boxfm&jtNWJl5wlH z58lf1M-;hZ5+VKb_8e-KcN7S{ksyMwPZb@CXT@gSHLW)g8G#=hmPH=~MP4!qmp>q3 ziyk6w$z8Wz7SAw3$9F&Pd%+9}UCe3T2t3z?ks_}cEBc1%&o@nfey?=Gdv#%?IhM`8 z;hgz5K+G*Wy;lV`eD|@|9qxT7Yk1xZMeZS1_z*hI5Pn1a5Pu|A(B?R2?=Nc-^e}Ap z9eI?7RLiP$?}fbXorEG+M&bg{kWK_JW8Curx!W*jIUyNAExdGcBn|20Oxj%}a{*{1UuT3I*_#mb|4XO))56)cu#@}` X5Ag`DD;mGD00000NkvXXu0mjf3yVv& literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 2.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 2.png new file mode 100644 index 0000000000000000000000000000000000000000..8e55943ececb6214655a0717b2fc1ed328f549c8 GIT binary patch literal 6461 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 X5Ag`DD;mGD00000NkvXXu0mjf3yVv& literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..8e55943ececb6214655a0717b2fc1ed328f549c8 GIT binary patch literal 6461 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 X5Ag`DD;mGD00000NkvXXu0mjf3yVv& literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/profileBasic.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/profileBasic.png deleted file mode 100644 index 53565b469a2955f0194bb277385108dbd34c7499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1258 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 Ro7eyV002ovPDHLkV1h?i1(5&% diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/profileBasic@3x.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/profileBasic@3x.png deleted file mode 100644 index 475b2c2156d856a0217fbde70d0ed36b500bc4cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4348 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 UIView { + let rowView = UIView() + let titleLabel = UILabel().then { + $0.text = title + $0.font = UIFont.pretendard(.body01) + $0.textColor = .gray7 + } + rowView.addSubview(titleLabel) + + titleLabel.snp.makeConstraints { + $0.left.equalToSuperview().offset(16) + $0.centerY.equalToSuperview() + } + + if let subtitle = subtitle { + let subtitleLabel = UILabel().then { + $0.text = subtitle + $0.font = UIFont.pretendard(.body01) + $0.textColor = .gray8 + } + rowView.addSubview(subtitleLabel) + + subtitleLabel.snp.makeConstraints { + $0.right.equalToSuperview().offset(-16) + $0.centerY.equalToSuperview() + } + } + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(rowTapped(_:))) + rowView.addGestureRecognizer(tapGesture) + rowView.isUserInteractionEnabled = true + + return rowView + } + + @objc private func rowTapped(_ gesture: UITapGestureRecognizer) { + guard let tappedView = gesture.view else { return } + let index = stackView.arrangedSubviews.firstIndex(of: tappedView) + + switch index { + case 0: + print("버전정보 탭됨") + case 1: + print("이용약관 탭됨") + case 2: + print("로그아웃 탭됨") + case 3: + print("탈퇴하기 탭됨") + default: + break + } + } +} diff --git a/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift new file mode 100644 index 00000000..2552615c --- /dev/null +++ b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift @@ -0,0 +1,40 @@ +// +// MypageView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// +import UIKit +import SnapKit +import Then + +class MyPageNavigationView: BaseView { + + let titleLabel = UILabel().then { + $0.text = "마이페이지" + $0.textAlignment = .center + $0.font = UIFont.pretendard(.body03) + $0.textColor = .black + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + setupAutoLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func setupView() { + backgroundColor = .white + addSubview(titleLabel) + } + + override func setupAutoLayout() { + titleLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + } + } +} diff --git a/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift b/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift new file mode 100644 index 00000000..fce286d2 --- /dev/null +++ b/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift @@ -0,0 +1,54 @@ +// +// MyPageViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/6/24. +// + +import UIKit + +import SnapKit + +class MyPageViewController: BaseViewController { + private let navigationView = MyPageNavigationView() + private let myPageContentView = MyPageContentView() + private let alarmSettingView = AlarmSettingView() + private let etcSettingView = EtcSettingView() + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + setupAutoLayout() + } + + override func setupView() { + super.setupView() + view.backgroundColor = .green1 + view.addSubview(navigationView) + view.addSubview(myPageContentView) + view.addSubview(alarmSettingView) + view.addSubview(etcSettingView) + } + + private func setupAutoLayout() { + navigationView.snp.makeConstraints { + $0.top.left.right.equalTo(view.safeAreaLayoutGuide) + $0.height.equalTo(44) + } + + myPageContentView.snp.makeConstraints { + $0.top.equalTo(navigationView.snp.bottom) + $0.leading.trailing.equalToSuperview() + } + + alarmSettingView.snp.makeConstraints { + $0.top.equalTo(myPageContentView.separatorView.snp.bottom).offset(20) + $0.leading.trailing.equalToSuperview().inset(20) + } + + etcSettingView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(20) + $0.bottom.lessThanOrEqualTo(view.safeAreaLayoutGuide.snp.bottom).offset(-20) + } + } +} From 2ff89a9a9069757e0a06bfe556153bb6c6eb0be4 Mon Sep 17 00:00:00 2001 From: hooni Date: Wed, 10 Jul 2024 00:27:53 +0900 Subject: [PATCH 05/10] =?UTF-8?q?fix/#148=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- File.swift | 8 + KkuMulKum.xcodeproj/project.pbxproj | 194 +++++++++++++++--- .../xcshareddata/swiftpm/Package.resolved | 9 + KkuMulKum/Application/AppDelegate.swift | 3 +- KkuMulKum/Application/SceneDelegate.swift | 28 ++- .../Assets.xcassets/login/Contents.json | 6 + .../login/appleLogin.imageset/Contents.json | 21 ++ .../appleLogin.imageset/login_btn_ios.png | Bin 0 -> 7216 bytes .../login/kakaoLogin.imageset/Contents.json | 23 +++ .../kakaoLogin.imageset/login_btn_ios 1.png | Bin 0 -> 6686 bytes .../kakaoLogin.imageset/login_btn_ios 2.png | Bin 0 -> 6686 bytes .../kakaoLogin.imageset/login_btn_ios.png | Bin 0 -> 6686 bytes KkuMulKum/Resource/Info.plist | 2 + .../Resource/Protocol/ViewModelType.swift | 17 ++ .../Source/Core/MainTabBarController.swift | 22 +- .../GroupList/GroupListViewController.swift | 26 ++- .../Onboarding/Login/AppleLoginVC.swift | 68 ------ .../Onboarding/Login/KakaoLoginVC.swift | 167 --------------- .../Login/VIewModel/LoginViewModel.swift | 91 ++++++++ .../Onboarding/Login/View/LoginView.swift | 77 +++++++ .../ViewController/LoginViewController.swift | 62 ++++++ .../Promise/PromiseInfoViewController.swift | 29 +++ .../Promise/PromiseSegmentedControl.swift | 81 ++++++++ .../Promise/PromiseViewController.swift | 70 +++++++ .../Source/Promise/PromiseViewModel.swift | 15 ++ .../Promise/ReadyStatusViewController.swift | 29 +++ .../Source/Promise/TardyViewController.swift | 29 +++ 27 files changed, 779 insertions(+), 298 deletions(-) create mode 100644 File.swift create mode 100644 KkuMulKum/Resource/Assets.xcassets/login/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/login/appleLogin.imageset/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/login/appleLogin.imageset/login_btn_ios.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/Contents.json create mode 100644 KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/login_btn_ios 1.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/login_btn_ios 2.png create mode 100644 KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/login_btn_ios.png create mode 100644 KkuMulKum/Resource/Protocol/ViewModelType.swift delete mode 100644 KkuMulKum/Source/Onboarding/Login/AppleLoginVC.swift delete mode 100644 KkuMulKum/Source/Onboarding/Login/KakaoLoginVC.swift create mode 100644 KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift create mode 100644 KkuMulKum/Source/Onboarding/Login/View/LoginView.swift create mode 100644 KkuMulKum/Source/Onboarding/Login/ViewController/LoginViewController.swift create mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift create mode 100644 KkuMulKum/Source/Promise/PromiseSegmentedControl.swift create mode 100644 KkuMulKum/Source/Promise/PromiseViewController.swift create mode 100644 KkuMulKum/Source/Promise/PromiseViewModel.swift create mode 100644 KkuMulKum/Source/Promise/ReadyStatusViewController.swift create mode 100644 KkuMulKum/Source/Promise/TardyViewController.swift diff --git a/File.swift b/File.swift new file mode 100644 index 00000000..a624f34a --- /dev/null +++ b/File.swift @@ -0,0 +1,8 @@ +// +// File.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import Foundation diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index f5368230..4a3be4dd 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -7,12 +7,9 @@ objects = { /* Begin PBXBuildFile section */ - 78198A1D2C3D41E5000EB90F /* MyPageEtcSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78198A1C2C3D41E5000EB90F /* MyPageEtcSettingView.swift */; }; - 78198A1F2C3D4327000EB90F /* MyPageAlarmSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78198A1E2C3D4327000EB90F /* MyPageAlarmSettingView.swift */; }; 784E4D942C3B1C7F00BC943C /* KakaoSDK in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D932C3B1C7F00BC943C /* KakaoSDK */; }; 784E4D962C3B1C7F00BC943C /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D952C3B1C7F00BC943C /* KakaoSDKAuth */; }; 784E4D992C3B95A900BC943C /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 784E4D982C3B95A900BC943C /* KeychainAccess */; }; - 784E4D9B2C3BBD4D00BC943C /* KakaoLoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 784E4D9A2C3BBD4D00BC943C /* KakaoLoginVC.swift */; }; 785AE1602C2E857A00677CA0 /* LookinServer in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE15F2C2E857A00677CA0 /* LookinServer */; }; 785AE1662C2E858A00677CA0 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1652C2E858A00677CA0 /* SnapKit */; }; 785AE16B2C2E85C200677CA0 /* Moya in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE16A2C2E85C200677CA0 /* Moya */; }; @@ -46,10 +43,16 @@ 785AE1BE2C2E878600677CA0 /* FirebaseStorageCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BD2C2E878600677CA0 /* FirebaseStorageCombine-Community */; }; 785AE1C02C2E878600677CA0 /* FirebaseVertexAI-Preview in Frameworks */ = {isa = PBXBuildFile; productRef = 785AE1BF2C2E878600677CA0 /* FirebaseVertexAI-Preview */; }; 785AE1D12C3B07A600677CA0 /* PrivacyInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */; }; - 7898732E2C3D0EAB00435E96 /* MyPageNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7898732D2C3D0EAA00435E96 /* MyPageNavigationView.swift */; }; - 7898733A2C3D35A700435E96 /* MyPageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789873392C3D35A700435E96 /* MyPageContentView.swift */; }; + 789873322C3D1A7B00435E96 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7898732F2C3D1A7B00435E96 /* LoginViewController.swift */; }; + 789873332C3D1A7B00435E96 /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789873302C3D1A7B00435E96 /* LoginViewModel.swift */; }; + 789873342C3D1A7B00435E96 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789873312C3D1A7B00435E96 /* LoginView.swift */; }; 789AD4B32C3C0093002E2688 /* SocialLoginResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */; }; 789AD4B52C3C0147002E2688 /* ResissueResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */; }; + 78AED12C2C3D8E56000AD80A /* MyPageContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AED1262C3D8E56000AD80A /* MyPageContentView.swift */; }; + 78AED12D2C3D8E56000AD80A /* MyPageNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AED1272C3D8E56000AD80A /* MyPageNavigationView.swift */; }; + 78AED12E2C3D8E56000AD80A /* MyPageEtcSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AED1282C3D8E56000AD80A /* MyPageEtcSettingView.swift */; }; + 78AED12F2C3D8E56000AD80A /* MyPageAlarmSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AED1292C3D8E56000AD80A /* MyPageAlarmSettingView.swift */; }; + 78AED1302C3D8E56000AD80A /* MyPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78AED12B2C3D8E56000AD80A /* MyPageViewController.swift */; }; 78B9286C2C29402C006D9942 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B9286B2C29402C006D9942 /* AppDelegate.swift */; }; 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B9286D2C29402C006D9942 /* SceneDelegate.swift */; }; 78B928752C29402E006D9942 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 78B928742C29402E006D9942 /* Assets.xcassets */; }; @@ -69,11 +72,20 @@ DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */; }; DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */; }; DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */; }; - DD865B642C3920F000C351A2 /* AppleLoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD865B632C3920F000C351A2 /* AppleLoginVC.swift */; }; DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */; }; DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE742C385FB1007C6059 /* HomeViewController.swift */; }; DDA2EE772C385FC3007C6059 /* GroupListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */; }; DDA2EE792C385FCF007C6059 /* MyPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */; }; + DDAF1C7C2C3D5B86008A37D3 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7B2C3D5B86008A37D3 /* RxCocoa */; }; + DDAF1C7E2C3D5B86008A37D3 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7D2C3D5B86008A37D3 /* RxRelay */; }; + DDAF1C812C3D5BD5008A37D3 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C802C3D5BD5008A37D3 /* Kingfisher */; }; + DDAF1C842C3D5D19008A37D3 /* ViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C832C3D5D19008A37D3 /* ViewModelType.swift */; }; + DDAF1C8E2C3D6E3D008A37D3 /* ReadyStatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C882C3D6E3D008A37D3 /* ReadyStatusViewController.swift */; }; + DDAF1C8F2C3D6E3D008A37D3 /* PromiseSegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C892C3D6E3D008A37D3 /* PromiseSegmentedControl.swift */; }; + DDAF1C902C3D6E3D008A37D3 /* PromiseViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8A2C3D6E3D008A37D3 /* PromiseViewModel.swift */; }; + DDAF1C912C3D6E3D008A37D3 /* TardyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */; }; + DDAF1C922C3D6E3D008A37D3 /* PromiseInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */; }; + DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */; }; DE254AA52C31131600A4015E /* Color.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DE254AA42C31131600A4015E /* Color.xcassets */; }; DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA72C3118EA00A4015E /* UIView+.swift */; }; DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE254AA92C31190E00A4015E /* UIStackView+.swift */; }; @@ -113,14 +125,17 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 78198A1C2C3D41E5000EB90F /* MyPageEtcSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageEtcSettingView.swift; sourceTree = ""; }; - 78198A1E2C3D4327000EB90F /* MyPageAlarmSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageAlarmSettingView.swift; sourceTree = ""; }; - 784E4D9A2C3BBD4D00BC943C /* KakaoLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoLoginVC.swift; sourceTree = ""; }; 785AE1D02C3B07A600677CA0 /* PrivacyInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PrivacyInfo.plist; sourceTree = ""; }; - 7898732D2C3D0EAA00435E96 /* MyPageNavigationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageNavigationView.swift; sourceTree = ""; }; - 789873392C3D35A700435E96 /* MyPageContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageContentView.swift; sourceTree = ""; }; + 7898732F2C3D1A7B00435E96 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + 789873302C3D1A7B00435E96 /* LoginViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewModel.swift; sourceTree = ""; }; + 789873312C3D1A7B00435E96 /* LoginView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; 789AD4B22C3C0093002E2688 /* SocialLoginResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginResponseModel.swift; sourceTree = ""; }; 789AD4B42C3C0147002E2688 /* ResissueResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResissueResponseModel.swift; sourceTree = ""; }; + 78AED1262C3D8E56000AD80A /* MyPageContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageContentView.swift; sourceTree = ""; }; + 78AED1272C3D8E56000AD80A /* MyPageNavigationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageNavigationView.swift; sourceTree = ""; }; + 78AED1282C3D8E56000AD80A /* MyPageEtcSettingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageEtcSettingView.swift; sourceTree = ""; }; + 78AED1292C3D8E56000AD80A /* MyPageAlarmSettingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageAlarmSettingView.swift; sourceTree = ""; }; + 78AED12B2C3D8E56000AD80A /* MyPageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageViewController.swift; sourceTree = ""; }; 78B928682C29402C006D9942 /* KkuMulKum.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = KkuMulKum.app; sourceTree = BUILT_PRODUCTS_DIR; }; 78B9286B2C29402C006D9942 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 78B9286D2C29402C006D9942 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -142,11 +157,17 @@ DD3072232C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPromiseReadyInfoRequestModel.swift; sourceTree = ""; }; DD3072252C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseLateInfoResponseModel.swift; sourceTree = ""; }; DD3072272C3C104D00416D9F /* ArrivalCompletionResponseModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrivalCompletionResponseModel.swift; sourceTree = ""; }; - DD865B632C3920F000C351A2 /* AppleLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleLoginVC.swift; sourceTree = ""; }; DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; DDA2EE742C385FB1007C6059 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupListViewController.swift; sourceTree = ""; }; DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageViewController.swift; sourceTree = ""; }; + DDAF1C832C3D5D19008A37D3 /* ViewModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelType.swift; sourceTree = ""; }; + DDAF1C882C3D6E3D008A37D3 /* ReadyStatusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadyStatusViewController.swift; sourceTree = ""; }; + DDAF1C892C3D6E3D008A37D3 /* PromiseSegmentedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseSegmentedControl.swift; sourceTree = ""; }; + DDAF1C8A2C3D6E3D008A37D3 /* PromiseViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseViewModel.swift; sourceTree = ""; }; + DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TardyViewController.swift; sourceTree = ""; }; + DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseInfoViewController.swift; sourceTree = ""; }; + DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseViewController.swift; sourceTree = ""; }; DE254AA42C31131600A4015E /* Color.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Color.xcassets; sourceTree = ""; }; DE254AA72C3118EA00A4015E /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = ""; }; DE254AA92C31190E00A4015E /* UIStackView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+.swift"; sourceTree = ""; }; @@ -208,10 +229,12 @@ 785AE19A2C2E878600677CA0 /* FirebaseCrashlytics in Frameworks */, 785AE16B2C2E85C200677CA0 /* Moya in Frameworks */, 785AE1922C2E878600677CA0 /* FirebaseAppCheck in Frameworks */, + DDAF1C7C2C3D5B86008A37D3 /* RxCocoa in Frameworks */, 785AE18A2C2E878600677CA0 /* FirebaseAnalytics in Frameworks */, 785AE1982C2E878600677CA0 /* FirebaseAuthCombine-Community in Frameworks */, 785AE1BE2C2E878600677CA0 /* FirebaseStorageCombine-Community in Frameworks */, 785AE1B42C2E878600677CA0 /* FirebaseMessaging in Frameworks */, + DDAF1C7E2C3D5B86008A37D3 /* RxRelay in Frameworks */, 785AE1B82C2E878600677CA0 /* FirebaseRemoteConfig in Frameworks */, 785AE1B62C2E878600677CA0 /* FirebasePerformance in Frameworks */, 784E4D942C3B1C7F00BC943C /* KakaoSDK in Frameworks */, @@ -224,6 +247,7 @@ 785AE1B22C2E878600677CA0 /* FirebaseMLModelDownloader in Frameworks */, 785AE19C2C2E878600677CA0 /* FirebaseDatabase in Frameworks */, 785AE1A02C2E878600677CA0 /* FirebaseDynamicLinks in Frameworks */, + DDAF1C812C3D5BD5008A37D3 /* Kingfisher in Frameworks */, 785AE1AE2C2E878600677CA0 /* FirebaseInAppMessagingSwift-Beta in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -231,22 +255,63 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 789873382C3D359000435E96 /* View */ = { + 789873352C3D1B3000435E96 /* View */ = { isa = PBXGroup; children = ( - 7898732D2C3D0EAA00435E96 /* MyPageNavigationView.swift */, - 789873392C3D35A700435E96 /* MyPageContentView.swift */, - 78198A1E2C3D4327000EB90F /* MyPageAlarmSettingView.swift */, - 78198A1C2C3D41E5000EB90F /* MyPageEtcSettingView.swift */, + 789873312C3D1A7B00435E96 /* LoginView.swift */, ); path = View; sourceTree = ""; }; - 7898733B2C3D363400435E96 /* ViewController */ = { + 789873362C3D1B3900435E96 /* VIewModel */ = { + isa = PBXGroup; + children = ( + 789873302C3D1A7B00435E96 /* LoginViewModel.swift */, + ); + path = VIewModel; + sourceTree = ""; + }; + 789873372C3D1B4800435E96 /* ViewController */ = { + isa = PBXGroup; + children = ( + 7898732F2C3D1A7B00435E96 /* LoginViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 78AED1232C3D8E27000AD80A /* Recovered References */ = { isa = PBXGroup; children = ( DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */, ); + name = "Recovered References"; + sourceTree = ""; + }; + 78AED1242C3D8E56000AD80A /* MyPage */ = { + isa = PBXGroup; + children = ( + 78AED12A2C3D8E56000AD80A /* ViewController */, + 78AED1252C3D8E56000AD80A /* View */, + ); + path = MyPage; + sourceTree = ""; + }; + 78AED1252C3D8E56000AD80A /* View */ = { + isa = PBXGroup; + children = ( + 78AED1262C3D8E56000AD80A /* MyPageContentView.swift */, + 78AED1272C3D8E56000AD80A /* MyPageNavigationView.swift */, + 78AED1282C3D8E56000AD80A /* MyPageEtcSettingView.swift */, + 78AED1292C3D8E56000AD80A /* MyPageAlarmSettingView.swift */, + ); + path = View; + sourceTree = ""; + }; + 78AED12A2C3D8E56000AD80A /* ViewController */ = { + isa = PBXGroup; + children = ( + 78AED12B2C3D8E56000AD80A /* MyPageViewController.swift */, + ); path = ViewController; sourceTree = ""; }; @@ -255,6 +320,7 @@ children = ( 78B9286A2C29402C006D9942 /* KkuMulKum */, 78B928692C29402C006D9942 /* Products */, + 78AED1232C3D8E27000AD80A /* Recovered References */, ); sourceTree = ""; }; @@ -288,8 +354,9 @@ DD865B662C39210E00C351A2 /* Login */ = { isa = PBXGroup; children = ( - DD865B632C3920F000C351A2 /* AppleLoginVC.swift */, - 784E4D9A2C3BBD4D00BC943C /* KakaoLoginVC.swift */, + 789873372C3D1B4800435E96 /* ViewController */, + 789873362C3D1B3900435E96 /* VIewModel */, + 789873352C3D1B3000435E96 /* View */, ); path = Login; sourceTree = ""; @@ -310,21 +377,33 @@ path = GroupList; sourceTree = ""; }; - DDA2EE7D2C386087007C6059 /* MyPage */ = { + DDA2EE7E2C3860B2007C6059 /* Core */ = { isa = PBXGroup; children = ( - 7898733B2C3D363400435E96 /* ViewController */, - 789873382C3D359000435E96 /* View */, + DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */, ); - path = MyPage; + path = Core; sourceTree = ""; }; - DDA2EE7E2C3860B2007C6059 /* Core */ = { + DDAF1C822C3D5CFA008A37D3 /* Protocol */ = { isa = PBXGroup; children = ( - DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */, + DDAF1C832C3D5D19008A37D3 /* ViewModelType.swift */, ); - path = Core; + path = Protocol; + sourceTree = ""; + }; + DDAF1C872C3D6E3D008A37D3 /* Promise */ = { + isa = PBXGroup; + children = ( + DDAF1C882C3D6E3D008A37D3 /* ReadyStatusViewController.swift */, + DDAF1C892C3D6E3D008A37D3 /* PromiseSegmentedControl.swift */, + DDAF1C8A2C3D6E3D008A37D3 /* PromiseViewModel.swift */, + DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */, + DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */, + DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */, + ); + path = Promise; sourceTree = ""; }; DE254AA12C31106700A4015E /* Application */ = { @@ -342,8 +421,9 @@ DDA2EE7E2C3860B2007C6059 /* Core */, DDA2EE7B2C386078007C6059 /* Home */, DDA2EE7C2C38607F007C6059 /* GroupList */, - DDA2EE7D2C386087007C6059 /* MyPage */, + 78AED1242C3D8E56000AD80A /* MyPage */, DD865B652C3920F600C351A2 /* Onboarding */, + DDAF1C872C3D6E3D008A37D3 /* Promise */, ); path = Source; sourceTree = ""; @@ -359,6 +439,7 @@ 78B928792C29402E006D9942 /* Info.plist */, DE9E187E2C3BA49B00DB76B4 /* Component */, DE8247FE2C36E846000601BC /* ObservablePattern */, + DDAF1C822C3D5CFA008A37D3 /* Protocol */, DED5DBEA2C345202006ECE7E /* Base */, DE254AA62C3118B300A4015E /* Extension */, DE254AB52C3119BC00A4015E /* Util */, @@ -599,6 +680,9 @@ 784E4D932C3B1C7F00BC943C /* KakaoSDK */, 784E4D952C3B1C7F00BC943C /* KakaoSDKAuth */, 784E4D982C3B95A900BC943C /* KeychainAccess */, + DDAF1C7B2C3D5B86008A37D3 /* RxCocoa */, + DDAF1C7D2C3D5B86008A37D3 /* RxRelay */, + DDAF1C802C3D5BD5008A37D3 /* Kingfisher */, ); productName = KkuMulKum; productReference = 78B928682C29402C006D9942 /* KkuMulKum.app */; @@ -636,6 +720,8 @@ 785AE1882C2E878600677CA0 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, 784E4D922C3B1C7F00BC943C /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */, 784E4D972C3B95A900BC943C /* XCRemoteSwiftPackageReference "KeychainAccess" */, + DDAF1C7A2C3D5B86008A37D3 /* XCRemoteSwiftPackageReference "RxSwift" */, + DDAF1C7F2C3D5BD5008A37D3 /* XCRemoteSwiftPackageReference "Kingfisher" */, ); productRefGroup = 78B928692C29402C006D9942 /* Products */; projectDirPath = ""; @@ -674,8 +760,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + DDAF1C8E2C3D6E3D008A37D3 /* ReadyStatusViewController.swift in Sources */, DED5DBF22C34534A006ECE7E /* BaseCollectionReusableView.swift in Sources */, - 7898732E2C3D0EAB00435E96 /* MyPageNavigationView.swift in Sources */, + 78AED12D2C3D8E56000AD80A /* MyPageNavigationView.swift in Sources */, DED5DBEC2C345210006ECE7E /* BaseViewController.swift in Sources */, DD30721A2C3C011600416D9F /* AddPromiseRequestModel.swift in Sources */, DD30721E2C3C0CC800416D9F /* PromiseInfoResponseModel.swift in Sources */, @@ -685,21 +772,26 @@ DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */, A3FB184D2C3BF45F001483E5 /* MakeMeetingsRequestModel.swift in Sources */, DEBA03312C3C2972002ED8F2 /* ViewController.swift in Sources */, - DD865B642C3920F000C351A2 /* AppleLoginVC.swift in Sources */, + 789873342C3D1A7B00435E96 /* LoginView.swift in Sources */, A3FB18592C3BF77D001483E5 /* MeetingInfoResponseModel.swift in Sources */, DE9E18842C3BA84500DB76B4 /* CustomTextField.swift in Sources */, A3FB184F2C3BF4BC001483E5 /* MakeMeetingsResponseModel.swift in Sources */, DE254AAC2C31192400A4015E /* UILabel+.swift in Sources */, DE254AB72C3119D000A4015E /* ReuseIdentifiable.swift in Sources */, DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */, + DDAF1C922C3D6E3D008A37D3 /* PromiseInfoViewController.swift in Sources */, DE254AB42C31199B00A4015E /* UITextField+.swift in Sources */, - 78198A1D2C3D41E5000EB90F /* MyPageEtcSettingView.swift in Sources */, + DDAF1C912C3D6E3D008A37D3 /* TardyViewController.swift in Sources */, DE8248002C36E857000601BC /* ObservablePattern.swift in Sources */, + DDAF1C902C3D6E3D008A37D3 /* PromiseViewModel.swift in Sources */, DE254AAA2C31190E00A4015E /* UIStackView+.swift in Sources */, + 78AED12E2C3D8E56000AD80A /* MyPageEtcSettingView.swift in Sources */, DED5DBF02C345317006ECE7E /* BaseCollectionViewCell.swift in Sources */, DE32D1D42C3BFB56006848DF /* UpdateProfileNameModel.swift in Sources */, + DDAF1C932C3D6E3D008A37D3 /* PromiseViewController.swift in Sources */, DE9E18922C3BCC9D00DB76B4 /* SocialLoginRequestModel.swift in Sources */, DE254AA82C3118EA00A4015E /* UIView+.swift in Sources */, + 78AED12F2C3D8E56000AD80A /* MyPageAlarmSettingView.swift in Sources */, DE254AAE2C31193600A4015E /* UIFont+.swift in Sources */, DE9E189A2C3BCCBE00DB76B4 /* UtilsTemp.swift in Sources */, DD3072142C3BF87A00416D9F /* NearestPromiseResponseModel.swift in Sources */, @@ -714,19 +806,22 @@ 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */, DDA2EE792C385FCF007C6059 /* MyPageViewController.swift in Sources */, A3FB185B2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift in Sources */, - 7898733A2C3D35A700435E96 /* MyPageContentView.swift in Sources */, - 784E4D9B2C3BBD4D00BC943C /* KakaoLoginVC.swift in Sources */, DD3072222C3C0DA300416D9F /* PromiseParticipantListResponseModel.swift in Sources */, + 789873322C3D1A7B00435E96 /* LoginViewController.swift in Sources */, + DDAF1C8F2C3D6E3D008A37D3 /* PromiseSegmentedControl.swift in Sources */, DE32D1D22C3BF703006848DF /* LoginUserResponseModel.swift in Sources */, DE9E18892C3BC91000DB76B4 /* ResponseBodyDTO.swift in Sources */, DD3072202C3C0D4500416D9F /* MyReadyStatusResponseModel.swift in Sources */, DD3072282C3C104D00416D9F /* ArrivalCompletionResponseModel.swift in Sources */, DD3072242C3C0EB200416D9F /* MyPromiseReadyInfoRequestModel.swift in Sources */, + 78AED12C2C3D8E56000AD80A /* MyPageContentView.swift in Sources */, + 78AED1302C3D8E56000AD80A /* MyPageViewController.swift in Sources */, + 789873332C3D1A7B00435E96 /* LoginViewModel.swift in Sources */, DED5DBEE2C34529A006ECE7E /* BaseView.swift in Sources */, DE9E18802C3BA4AA00DB76B4 /* CustomButton.swift in Sources */, DE254AB02C31195B00A4015E /* NSAttributedString+.swift in Sources */, DE8247FD2C36E7C7000601BC /* MoyaLoggingPlugin.swift in Sources */, - 78198A1F2C3D4327000EB90F /* MyPageAlarmSettingView.swift in Sources */, + DDAF1C842C3D5D19008A37D3 /* ViewModelType.swift in Sources */, DD3072262C3C0F0B00416D9F /* PromiseLateInfoResponseModel.swift in Sources */, DE254AB92C311AB300A4015E /* Screen.swift in Sources */, ); @@ -1010,6 +1105,22 @@ minimumVersion = 10.28.1; }; }; + DDAF1C7A2C3D5B86008A37D3 /* XCRemoteSwiftPackageReference "RxSwift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ReactiveX/RxSwift"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 6.7.1; + }; + }; + DDAF1C7F2C3D5BD5008A37D3 /* XCRemoteSwiftPackageReference "Kingfisher" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/onevcat/Kingfisher"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 7.12.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -1188,6 +1299,21 @@ package = 785AE1882C2E878600677CA0 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; productName = "FirebaseVertexAI-Preview"; }; + DDAF1C7B2C3D5B86008A37D3 /* RxCocoa */ = { + isa = XCSwiftPackageProductDependency; + package = DDAF1C7A2C3D5B86008A37D3 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxCocoa; + }; + DDAF1C7D2C3D5B86008A37D3 /* RxRelay */ = { + isa = XCSwiftPackageProductDependency; + package = DDAF1C7A2C3D5B86008A37D3 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxRelay; + }; + DDAF1C802C3D5BD5008A37D3 /* Kingfisher */ = { + isa = XCSwiftPackageProductDependency; + package = DDAF1C7F2C3D5BD5008A37D3 /* XCRemoteSwiftPackageReference "Kingfisher" */; + productName = Kingfisher; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 78B928602C29402C006D9942 /* Project object */; diff --git a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 909b8cd7..45b79d88 100644 --- a/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/KkuMulKum.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -108,6 +108,15 @@ "revision" : "e0c7eebc5a4465a3c4680764f26b7a61f567cdaf" } }, + { + "identity" : "kingfisher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/onevcat/Kingfisher", + "state" : { + "revision" : "2ef543ee21d63734e1c004ad6c870255e8716c50", + "version" : "7.12.0" + } + }, { "identity" : "leveldb", "kind" : "remoteSourceControl", diff --git a/KkuMulKum/Application/AppDelegate.swift b/KkuMulKum/Application/AppDelegate.swift index 6998762c..00e72fe0 100644 --- a/KkuMulKum/Application/AppDelegate.swift +++ b/KkuMulKum/Application/AppDelegate.swift @@ -4,13 +4,14 @@ // // Created by 이지훈 on 6/24/24. // + import UIKit + import KakaoSDKCommon import KakaoSDKAuth @main class AppDelegate: UIResponder, UIApplicationDelegate { - func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? diff --git a/KkuMulKum/Application/SceneDelegate.swift b/KkuMulKum/Application/SceneDelegate.swift index 74f6d0a5..11d514e9 100644 --- a/KkuMulKum/Application/SceneDelegate.swift +++ b/KkuMulKum/Application/SceneDelegate.swift @@ -18,27 +18,25 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { ) { guard let windowScene = (scene as? UIWindowScene) else { return } self.window = UIWindow(windowScene: windowScene) - let navigationController = UINavigationController(rootViewController: MainTabBarController()) - self.window?.rootViewController = navigationController + self.window?.rootViewController = MainTabBarController() self.window?.makeKeyAndVisible() } func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { - if let url = URLContexts.first?.url { - if (AuthApi.isKakaoTalkLoginUrl(url)) { - _ = AuthController.handleOpenUrl(url: url) - } - } - } - + if let url = URLContexts.first?.url { + if (AuthApi.isKakaoTalkLoginUrl(url)) { + _ = AuthController.handleOpenUrl(url: url) + } + } + } + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { - if (AuthApi.isKakaoTalkLoginUrl(url)) { - return AuthController.handleOpenUrl(url: url) - } - return false - } + if (AuthApi.isKakaoTalkLoginUrl(url)) { + return AuthController.handleOpenUrl(url: url) + } + return false + } - func sceneDidDisconnect(_ scene: UIScene) {} func sceneDidBecomeActive(_ scene: UIScene) {} func sceneWillResignActive(_ scene: UIScene) {} diff --git a/KkuMulKum/Resource/Assets.xcassets/login/Contents.json b/KkuMulKum/Resource/Assets.xcassets/login/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/login/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KkuMulKum/Resource/Assets.xcassets/login/appleLogin.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/login/appleLogin.imageset/Contents.json new file mode 100644 index 00000000..9b3b8ec9 --- /dev/null +++ b/KkuMulKum/Resource/Assets.xcassets/login/appleLogin.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "login_btn_ios.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/KkuMulKum/Resource/Assets.xcassets/login/appleLogin.imageset/login_btn_ios.png b/KkuMulKum/Resource/Assets.xcassets/login/appleLogin.imageset/login_btn_ios.png new file mode 100644 index 0000000000000000000000000000000000000000..5eeadb9c29a483509e68468493f91f66db9fb30e GIT binary patch literal 7216 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 literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/login_btn_ios 2.png b/KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/login_btn_ios 2.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae354a4a79fe0b66366ea0d9ed4958b6de7ffd6 GIT binary patch literal 6686 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 literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/login_btn_ios.png b/KkuMulKum/Resource/Assets.xcassets/login/kakaoLogin.imageset/login_btn_ios.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae354a4a79fe0b66366ea0d9ed4958b6de7ffd6 GIT binary patch literal 6686 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 literal 0 HcmV?d00001 diff --git a/KkuMulKum/Resource/Info.plist b/KkuMulKum/Resource/Info.plist index 16007656..baa28139 100644 --- a/KkuMulKum/Resource/Info.plist +++ b/KkuMulKum/Resource/Info.plist @@ -2,6 +2,8 @@ + UIUserInterfaceStyle + Light CFBundleURLTypes diff --git a/KkuMulKum/Resource/Protocol/ViewModelType.swift b/KkuMulKum/Resource/Protocol/ViewModelType.swift new file mode 100644 index 00000000..a513de88 --- /dev/null +++ b/KkuMulKum/Resource/Protocol/ViewModelType.swift @@ -0,0 +1,17 @@ +// +// ViewModelType.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import Foundation + +import RxSwift + +protocol ViewModelType { + associatedtype Input + associatedtype Output + + func transform(input: Input, disposeBag: RxSwift.DisposeBag) -> Output +} diff --git a/KkuMulKum/Source/Core/MainTabBarController.swift b/KkuMulKum/Source/Core/MainTabBarController.swift index 5f587199..beffd260 100644 --- a/KkuMulKum/Source/Core/MainTabBarController.swift +++ b/KkuMulKum/Source/Core/MainTabBarController.swift @@ -41,11 +41,27 @@ final class MainTabBarController: UITabBarController { tabBar.unselectedItemTintColor = .gray2 tabBar.tintColor = .maincolor + tabBar.backgroundColor = .white + + let homeNavigationController = UINavigationController(rootViewController: homeViewController).then { + $0.navigationBar.topItem?.backButtonDisplayMode = .minimal + $0.navigationBar.tintColor = .black + } + + let groupListNavigationController = UINavigationController(rootViewController: groupListViewController).then { + $0.navigationBar.topItem?.backButtonDisplayMode = .minimal + $0.navigationBar.tintColor = .black + } + + let myPageViewNavigationController = UINavigationController(rootViewController: myPageViewController).then { + $0.navigationBar.topItem?.backButtonDisplayMode = .minimal + $0.navigationBar.tintColor = .black + } setViewControllers([ - UINavigationController(rootViewController: homeViewController), - UINavigationController(rootViewController: groupListViewController), - UINavigationController(rootViewController: myPageViewController) + homeNavigationController, + groupListNavigationController, + myPageViewNavigationController ], animated: true) } } diff --git a/KkuMulKum/Source/GroupList/GroupListViewController.swift b/KkuMulKum/Source/GroupList/GroupListViewController.swift index 027d6c5a..b6e04122 100644 --- a/KkuMulKum/Source/GroupList/GroupListViewController.swift +++ b/KkuMulKum/Source/GroupList/GroupListViewController.swift @@ -7,23 +7,29 @@ import UIKit +import SnapKit + class GroupListViewController: BaseViewController { + private lazy var button: CustomButton = CustomButton(title: "모임 추가하기", isEnabled: true).then { + $0.addTarget(self, action: #selector(didAddScheduleButtonTapped), for: .touchUpInside) + } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white + + view.addSubview(button) + + button.snp.makeConstraints { + $0.top.equalToSuperview().offset(206) + $0.leading.trailing.equalToSuperview().inset(20) + } } - - /* - // 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. + @objc private func didAddScheduleButtonTapped() { + let scheduleViewController = PromiseViewController() + + self.navigationController?.pushViewController(scheduleViewController, animated: true) } - */ - } diff --git a/KkuMulKum/Source/Onboarding/Login/AppleLoginVC.swift b/KkuMulKum/Source/Onboarding/Login/AppleLoginVC.swift deleted file mode 100644 index f07f1887..00000000 --- a/KkuMulKum/Source/Onboarding/Login/AppleLoginVC.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// LoginViewController.swift -// KkuMulKum -// -// Created by YOUJIM on 7/6/24. -// - -import UIKit - -import AuthenticationServices - - -class AppleLoginViewController: BaseViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - self.navigationController?.navigationBar.isHidden = true - view.backgroundColor = .yellow - setupAppleLoginButton() - } - - func setupAppleLoginButton() { - let button = ASAuthorizationAppleIDButton() - button.addTarget(self, action: #selector(clickAppleLogin), for: .touchUpInside) - button.frame = CGRect(x: 100, y: 100, width: 200, height: 40) - view.addSubview(button) - } - - @objc func clickAppleLogin() { - let request = ASAuthorizationAppleIDProvider().createRequest() - request.requestedScopes = [.fullName, .email] - - let controller = ASAuthorizationController(authorizationRequests: [request]) - controller.delegate = self - controller.presentationContextProvider = self - controller.performRequests() - } -} - - -// MARK: - ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding - -extension AppleLoginViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding { - func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { - if let credential = authorization.credential as? ASAuthorizationAppleIDCredential { - let idToken = credential.identityToken! - let tokenStr = String(data: idToken, encoding: .utf8) - print(tokenStr ?? "No token string") - - guard let code = credential.authorizationCode else { return } - let codeStr = String(data: code, encoding: .utf8) - print(codeStr ?? "No code string") - - let user = credential.user - print(user) - } - } - - func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { - print("Authorization failed with error: \(error)") - } - - func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { - return self.view.window! - } - -} diff --git a/KkuMulKum/Source/Onboarding/Login/KakaoLoginVC.swift b/KkuMulKum/Source/Onboarding/Login/KakaoLoginVC.swift deleted file mode 100644 index 1b74eaf1..00000000 --- a/KkuMulKum/Source/Onboarding/Login/KakaoLoginVC.swift +++ /dev/null @@ -1,167 +0,0 @@ -// -// KakaoLogin.swift -// KkuMulKum -// -// Created by 이지훈 on 7/8/24. -// -import UIKit - -import KakaoSDKCommon -import KakaoSDKUser -import KakaoSDKAuth -import KeychainAccess - -class KakaoLoginVC: UIViewController { - - let keychain = Keychain(service: "KkuMulKum.yizihn") - - override func viewDidLoad() { - super.viewDidLoad() - view.backgroundColor = .systemBackground - setupUI() - printNativeAppKey() - verifyLoginState() - } - - private func setupUI() { - setupLoginButton() - setupLogoutButton() - } - - private func setupLoginButton() { - let loginButton = UIButton(type: .system) - loginButton.setTitle("Login with KakaoTalk", for: .normal) - loginButton.addTarget(self, action: #selector(loginWithKakao), for: .touchUpInside) - loginButton.frame = CGRect(x: 20, y: 100, width: 280, height: 50) - view.addSubview(loginButton) - } - - private func setupLogoutButton() { - let logoutButton = UIButton(type: .system) - logoutButton.setTitle("Logout", for: .normal) - logoutButton.addTarget(self, action: #selector(logout), for: .touchUpInside) - logoutButton.frame = CGRect(x: 20, y: 160, width: 280, height: 50) - view.addSubview(logoutButton) - } - - private func verifyLoginState() { - if let accessToken = loadToken() { - print("Access token found: \(accessToken)") - UserApi.shared.accessTokenInfo { [weak self] (_, error) in - if let error = error { - print("Access token is invalid. Error: \(error)") - self?.clearTokens() - } else { - print("Access token is valid.") - self?.fetchUserInfo() - } - } - } else { - print("No access token available, user needs to login.") - } - } - - private func printNativeAppKey() { - if let appKey = nativeAppKey { - let urlScheme = "kakao\(appKey)" - print("Native App Key: \(appKey)") - print("URL Scheme: \(urlScheme)") - } - } - - var nativeAppKey: String? { - guard let path = Bundle.main.path(forResource: "PrivacyInfo", ofType: "plist"), - let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject], - let key = dict["NATIVE_APP_KEY"] as? String else { - return nil - } - return key - } - - @objc func loginWithKakao() { - print("loginWithKakao called") - if UserApi.isKakaoTalkLoginAvailable() { - UserApi.shared.loginWithKakaoTalk { [weak self] (oauthToken, error) in - print("KakaoTalk login callback received") - self?.handleLoginResult(oauthToken: oauthToken, error: error) - } - } else { - print("KakaoTalk is not installed, trying Kakao Account login...") - UserApi.shared.loginWithKakaoAccount { [weak self] (oauthToken, error) in - print("Kakao Account login callback received") - self?.handleLoginResult(oauthToken: oauthToken, error: error) - } - } - } - - private func handleLoginResult(oauthToken: OAuthToken?, error: Error?) { - print("handleLoginResult called") - if let error = error { - print("Login failed. Error: \(error.localizedDescription)") - if let sdkError = error as? SdkError { - print("SDK Error: \(sdkError)") - } - return - } - - guard let token = oauthToken else { - print("Login failed. No token received.") - return - } - - print("Login succeeded. Access token: \(token.accessToken)") - saveToken(token.accessToken, refreshToken: token.refreshToken) - fetchUserInfo() - } - - private func fetchUserInfo() { - UserApi.shared.me() { (user, error) in - if let error = error { - print("Failed to get user info. Error: \(error)") - return - } - - guard let user = user else { - print("No user information received.") - return - } - - print("User info received. Nickname: \(user.kakaoAccount?.profile?.nickname ?? "N/A")") - } - } - - @objc private func logout() { - UserApi.shared.logout { [weak self] (error) in - if let error = error { - print("Logout failed. Error: \(error)") - } else { - print("Logout succeeded.") - self?.clearTokens() - } - } - } - - private func saveToken(_ accessToken: String, refreshToken: String) { - do { - try keychain.set(accessToken, key: "accessToken") - try keychain.set(refreshToken, key: "refreshToken") - print("Tokens saved successfully. AccessToken: \(accessToken)") - } catch { - print("Error saving tokens: \(error)") - } - } - - private func loadToken() -> String? { - return keychain["accessToken"] - } - - private func clearTokens() { - do { - try keychain.remove("accessToken") - try keychain.remove("refreshToken") - print("Tokens cleared from keychain") - } catch { - print("Error clearing tokens: \(error)") - } - } -} diff --git a/KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift b/KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift new file mode 100644 index 00000000..53127bf6 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Login/VIewModel/LoginViewModel.swift @@ -0,0 +1,91 @@ +// +// LoginVM.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import AuthenticationServices +import KakaoSDKUser +import KakaoSDKAuth + + +enum LoginState { + case notLoggedIn + case loggedIn(userInfo: String) +} + +class LoginViewModel: NSObject { + var loginState: ObservablePattern = ObservablePattern(.notLoggedIn) + var error: ObservablePattern = ObservablePattern("") + + func performAppleLogin(presentationAnchor: ASPresentationAnchor) { + let request = ASAuthorizationAppleIDProvider().createRequest() + request.requestedScopes = [.fullName, .email] + + let controller = ASAuthorizationController(authorizationRequests: [request]) + controller.delegate = self + controller.presentationContextProvider = self + controller.performRequests() + } + + func performKakaoLogin(presentationAnchor: UIWindow) { + if UserApi.isKakaoTalkLoginAvailable() { + UserApi.shared.loginWithKakaoTalk { [weak self] (oauthToken, error) in + self?.handleKakaoLoginResult(oauthToken: oauthToken, error: error) + } + } else { + UserApi.shared.loginWithKakaoAccount { [weak self] (oauthToken, error) in + self?.handleKakaoLoginResult(oauthToken: oauthToken, error: error) + } + } + } + + private func handleKakaoLoginResult(oauthToken: OAuthToken?, error: Error?) { + if let error = error { + self.error.value = error.localizedDescription + return + } + + if let _ = oauthToken { + fetchKakaoUserInfo() + } + } + + private func fetchKakaoUserInfo() { + UserApi.shared.me() { [weak self] (user, error) in + if let error = error { + self?.error.value = error.localizedDescription + return + } + + if let nickname = user?.kakaoAccount?.profile?.nickname { + self?.loginState.value = .loggedIn(userInfo: "Kakao user: \(nickname)") + } + } + } +} + +extension LoginViewModel: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding { + func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { + guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else { + print("Authorization failed: Credential is not of type ASAuthorizationAppleIDCredential") + return + } + let userName = credential.fullName?.givenName ?? "Apple user" + loginState.value = .loggedIn(userInfo: "Apple user: \(userName)") + } + + func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { + self.error.value = error.localizedDescription + } + + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene + let window = windowScene?.windows.first + + return window! + } +} diff --git a/KkuMulKum/Source/Onboarding/Login/View/LoginView.swift b/KkuMulKum/Source/Onboarding/Login/View/LoginView.swift new file mode 100644 index 00000000..40016834 --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Login/View/LoginView.swift @@ -0,0 +1,77 @@ +// +// LoginView.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import SnapKit +import Then + +class LoginView: BaseView { + + let backgroundImageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + $0.image = UIImage(named: "") + } + + let titleLabel = UILabel().then { + $0.text = "꾸물꿈" + $0.font = UIFont.systemFont(ofSize: 24, weight: .bold) + $0.textColor = .white + $0.textAlignment = .center + } + + let appleLoginImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = UIImage(named: "appleLogin") + $0.isUserInteractionEnabled = true + } + + let kakaoLoginImageView = UIImageView().then { + $0.contentMode = .scaleAspectFit + $0.image = UIImage(named: "kakaoLogin") + $0.isUserInteractionEnabled = true + } + + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func setupView() { + addSubview(backgroundImageView) + addSubview(titleLabel) + addSubview(appleLoginImageView) + addSubview(kakaoLoginImageView) + + backgroundImageView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + titleLabel.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide).offset(50) + $0.centerX.equalToSuperview() + } + + appleLoginImageView.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.bottom.equalTo(kakaoLoginImageView.snp.top).offset(-20) + $0.width.equalToSuperview().offset(-40) + $0.height.equalTo(54) + } + + kakaoLoginImageView.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.bottom.equalTo(safeAreaLayoutGuide).offset(-50) + $0.width.equalToSuperview().offset(-40) + $0.height.equalTo(54) + } + } +} diff --git a/KkuMulKum/Source/Onboarding/Login/ViewController/LoginViewController.swift b/KkuMulKum/Source/Onboarding/Login/ViewController/LoginViewController.swift new file mode 100644 index 00000000..1c44b31a --- /dev/null +++ b/KkuMulKum/Source/Onboarding/Login/ViewController/LoginViewController.swift @@ -0,0 +1,62 @@ +// +// LoginVC.swift +// KkuMulKum +// +// Created by 이지훈 on 7/9/24. +// + +import UIKit + +import AuthenticationServices + +class LoginViewController: BaseViewController { + + private let loginView = LoginView() + private let loginViewModel = LoginViewModel() + + override func loadView() { + view = loginView + } + + override func viewDidLoad() { + super.viewDidLoad() + bindViewModel() + } + + override func setupAction() { + super.setupAction() + + let appleTapGesture = UITapGestureRecognizer(target: self, action: #selector(appleLoginTapped)) + loginView.appleLoginImageView.addGestureRecognizer(appleTapGesture) + + let kakaoTapGesture = UITapGestureRecognizer(target: self, action: #selector(kakaoLoginTapped)) + loginView.kakaoLoginImageView.addGestureRecognizer(kakaoTapGesture) + } + + private func bindViewModel() { + loginViewModel.loginState.bind(with: self) { owner, state in + switch state { + case .notLoggedIn: + print("Not logged in") + case .loggedIn(let userInfo): + print("Logged in: \(userInfo)") + } + } + + loginViewModel.error.bind(with: self) { owner, error in + if !error.isEmpty { + // TODO: 추후 에러처리 추가예정 -> Keychain 연결 이후 + print("Error occurred: \(error)") + } + } + } + + + @objc private func appleLoginTapped() { + loginViewModel.performAppleLogin(presentationAnchor: view.window!) + } + + @objc private func kakaoLoginTapped() { + loginViewModel.performKakaoLogin(presentationAnchor: view.window!) + } +} diff --git a/KkuMulKum/Source/Promise/PromiseInfoViewController.swift b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift new file mode 100644 index 00000000..8dd2847c --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift @@ -0,0 +1,29 @@ +// +// PromiseInfoViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class PromiseInfoViewController: BaseViewController { + + 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/KkuMulKum/Source/Promise/PromiseSegmentedControl.swift b/KkuMulKum/Source/Promise/PromiseSegmentedControl.swift new file mode 100644 index 00000000..8c762571 --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseSegmentedControl.swift @@ -0,0 +1,81 @@ +// +// PromiseSegmentedControl.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +import SnapKit + +class PromiseSegmentedControl: UISegmentedControl { + private let backgroundLineView: UIView = UIView().then { + $0.backgroundColor = .gray2 + } + + let selectedUnderLineView: UIView = UIView().then { + $0.backgroundColor = .black + $0.layer.cornerRadius = 1 + } + + override init(items: [Any]?) { + super.init(items: items) + + setupSegment() + setupTextAttribute() + setupBackgroundLineView() + setupBackgroundAndDivider() + + } + + required init?(coder: NSCoder) { + fatalError() + } + + private func setupSegment() { + [ + backgroundLineView, + selectedUnderLineView + ].forEach { addSubview($0) } + + self.selectedSegmentIndex = 0 + } + + private func setupBackgroundAndDivider() { + self.setBackgroundImage(UIImage(), for: .normal, barMetrics: .default) + self.setBackgroundImage(UIImage(), for: .selected, barMetrics: .default) + self.setBackgroundImage(UIImage(), for: .highlighted, barMetrics: .default) + + self.setDividerImage( + UIImage(), + forLeftSegmentState: .selected, + rightSegmentState: .normal, + barMetrics: .default + ) + } + + private func setupTextAttribute() { + setTitleTextAttributes([ + NSAttributedString.Key.foregroundColor: UIColor.gray3, + NSAttributedString.Key.font: UIFont.pretendard(.body05) + ], for: .normal) + setTitleTextAttributes([ + NSAttributedString.Key.foregroundColor: UIColor.black, + NSAttributedString.Key.font: UIFont.pretendard(.body05) + ], for: .selected) + } + + private func setupBackgroundLineView() { + backgroundLineView.snp.makeConstraints { + $0.bottom.leading.trailing.equalToSuperview() + $0.height.equalTo(2) + } + + selectedUnderLineView.snp.makeConstraints { + $0.bottom.leading.equalToSuperview() + $0.width.equalToSuperview().dividedBy(numberOfSegments) + $0.height.equalTo(backgroundLineView) + } + } +} diff --git a/KkuMulKum/Source/Promise/PromiseViewController.swift b/KkuMulKum/Source/Promise/PromiseViewController.swift new file mode 100644 index 00000000..c2b35fce --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseViewController.swift @@ -0,0 +1,70 @@ +// +// PromiseViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class PromiseViewController: BaseViewController { + private let promiseViewModel = PromiseViewModel() + + private lazy var promiseSegmentedControl = PromiseSegmentedControl(items: ["약속 정보", + "준비 현황", + "지각 꾸물이"]) + + private let promisePageViewController = UIPageViewController(transitionStyle: .scroll, + navigationOrientation: .horizontal) + + override func viewDidLoad() { + super.viewDidLoad() + } + + override func setupView() { + view.backgroundColor = .white + self.navigationItem.title = "기말고사 모각작" + + view.addSubview(promiseSegmentedControl) + addChild(promisePageViewController) + + promiseSegmentedControl.snp.makeConstraints { + $0.top.equalToSuperview() + $0.leading.trailing.equalToSuperview().inset(-6) + $0.height.equalTo(52) + } + + promisePageViewController.view.snp.makeConstraints { + $0.top.equalTo(promiseSegmentedControl.snp.bottom) + $0.horizontalEdges.bottom.equalToSuperview() + } + + promisePageViewController.didMove(toParent: self) + } + + override func setupAction() { + promiseSegmentedControl.addTarget(self, action: #selector(didSegmentedControlIndexUpdated), for: .valueChanged) + } + + override func setupDelegate() { + promisePageViewController.delegate = self + promisePageViewController.dataSource = self + } + + @objc private func didSegmentedControlIndexUpdated() { + promiseSegmentedControl.selectedUnderLineView.snp.updateConstraints { + $0.leading.equalToSuperview().offset((promiseSegmentedControl.bounds.width / CGFloat(promiseSegmentedControl.numberOfSegments)) * CGFloat(promiseSegmentedControl.selectedSegmentIndex)) + } + } +} + + +extension BaseViewController: UIPageViewControllerDelegate, UIPageViewControllerDataSource { + func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { + return UIViewController() + } + + func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { + return UIViewController() + } +} diff --git a/KkuMulKum/Source/Promise/PromiseViewModel.swift b/KkuMulKum/Source/Promise/PromiseViewModel.swift new file mode 100644 index 00000000..3d4950e6 --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseViewModel.swift @@ -0,0 +1,15 @@ +// +// PromiseViewModel.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import Foundation + + +class PromiseViewModel { + let promiseViewControllerList = [PromiseInfoViewController(), + ReadyStatusViewController(), + TardyViewController()] +} diff --git a/KkuMulKum/Source/Promise/ReadyStatusViewController.swift b/KkuMulKum/Source/Promise/ReadyStatusViewController.swift new file mode 100644 index 00000000..a576adb3 --- /dev/null +++ b/KkuMulKum/Source/Promise/ReadyStatusViewController.swift @@ -0,0 +1,29 @@ +// +// ReadyStatusViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class ReadyStatusViewController: BaseViewController { + + 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/KkuMulKum/Source/Promise/TardyViewController.swift b/KkuMulKum/Source/Promise/TardyViewController.swift new file mode 100644 index 00000000..8e0ea951 --- /dev/null +++ b/KkuMulKum/Source/Promise/TardyViewController.swift @@ -0,0 +1,29 @@ +// +// TardyViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class TardyViewController: BaseViewController { + + 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 42f2168aa370f250bcb03028d92ba547c14d29be Mon Sep 17 00:00:00 2001 From: hooni Date: Wed, 10 Jul 2024 00:31:01 +0900 Subject: [PATCH 06/10] =?UTF-8?q?fix/#148=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PromiseInfoViewController.swift~HEAD | 29 +++++++++++++++++++ .../PromiseInfoViewController.swift~HEAD_0 | 29 +++++++++++++++++++ .../PromiseInfoViewController.swift~suyeon | 29 +++++++++++++++++++ .../PromiseInfoViewController.swift~suyeon_0 | 29 +++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD create mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 create mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon create mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 diff --git a/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD new file mode 100644 index 00000000..8dd2847c --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD @@ -0,0 +1,29 @@ +// +// PromiseInfoViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class PromiseInfoViewController: BaseViewController { + + 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/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 new file mode 100644 index 00000000..8dd2847c --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 @@ -0,0 +1,29 @@ +// +// PromiseInfoViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class PromiseInfoViewController: BaseViewController { + + 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/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon new file mode 100644 index 00000000..8dd2847c --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon @@ -0,0 +1,29 @@ +// +// PromiseInfoViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class PromiseInfoViewController: BaseViewController { + + 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/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 new file mode 100644 index 00000000..8dd2847c --- /dev/null +++ b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 @@ -0,0 +1,29 @@ +// +// PromiseInfoViewController.swift +// KkuMulKum +// +// Created by YOUJIM on 7/9/24. +// + +import UIKit + +class PromiseInfoViewController: BaseViewController { + + 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 4d1283696e0342d0b6cf552deeb20cb475f34725 Mon Sep 17 00:00:00 2001 From: hooni Date: Wed, 10 Jul 2024 02:58:29 +0900 Subject: [PATCH 07/10] =?UTF-8?q?fix/#148=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- File.swift | 8 --- KkuMulKum.xcodeproj/project.pbxproj | 23 -------- .../MyPage/View/MyPageAlarmSettingView.swift | 59 +++++++++++-------- .../MyPage/View/MyPageContentView.swift | 13 ++-- .../MyPage/View/MyPageEtcSettingView.swift | 1 - .../MyPage/View/MyPageNavigationView.swift | 17 +++++- .../ViewController/MyPageViewController.swift | 16 ++--- 7 files changed, 65 insertions(+), 72 deletions(-) delete mode 100644 File.swift diff --git a/File.swift b/File.swift deleted file mode 100644 index a624f34a..00000000 --- a/File.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// File.swift -// KkuMulKum -// -// Created by 이지훈 on 7/9/24. -// - -import Foundation diff --git a/KkuMulKum.xcodeproj/project.pbxproj b/KkuMulKum.xcodeproj/project.pbxproj index 920862fe..abe264f1 100644 --- a/KkuMulKum.xcodeproj/project.pbxproj +++ b/KkuMulKum.xcodeproj/project.pbxproj @@ -75,7 +75,6 @@ DDA2EE732C385EB9007C6059 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE722C385EB9007C6059 /* MainTabBarController.swift */; }; DDA2EE752C385FB1007C6059 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE742C385FB1007C6059 /* HomeViewController.swift */; }; DDA2EE772C385FC3007C6059 /* GroupListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE762C385FC3007C6059 /* GroupListViewController.swift */; }; - DDA2EE792C385FCF007C6059 /* MyPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDA2EE782C385FCF007C6059 /* MyPageViewController.swift */; }; DDAF1C7C2C3D5B86008A37D3 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7B2C3D5B86008A37D3 /* RxCocoa */; }; DDAF1C7E2C3D5B86008A37D3 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C7D2C3D5B86008A37D3 /* RxRelay */; }; DDAF1C812C3D5BD5008A37D3 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = DDAF1C802C3D5BD5008A37D3 /* Kingfisher */; }; @@ -406,27 +405,6 @@ path = Promise; sourceTree = ""; }; - DDAF1C822C3D5CFA008A37D3 /* Protocol */ = { - isa = PBXGroup; - children = ( - DDAF1C832C3D5D19008A37D3 /* ViewModelType.swift */, - ); - path = Protocol; - sourceTree = ""; - }; - DDAF1C872C3D6E3D008A37D3 /* Promise */ = { - isa = PBXGroup; - children = ( - DDAF1C882C3D6E3D008A37D3 /* ReadyStatusViewController.swift */, - DDAF1C892C3D6E3D008A37D3 /* PromiseSegmentedControl.swift */, - DDAF1C8A2C3D6E3D008A37D3 /* PromiseViewModel.swift */, - DDAF1C8B2C3D6E3D008A37D3 /* TardyViewController.swift */, - DDAF1C8C2C3D6E3D008A37D3 /* PromiseInfoViewController.swift */, - DDAF1C8D2C3D6E3D008A37D3 /* PromiseViewController.swift */, - ); - path = Promise; - sourceTree = ""; - }; DE254AA12C31106700A4015E /* Application */ = { isa = PBXGroup; children = ( @@ -825,7 +803,6 @@ 789AD4B52C3C0147002E2688 /* ResissueResponseModel.swift in Sources */, DED5DBF42C34539A006ECE7E /* BaseTableViewCell.swift in Sources */, 78B9286E2C29402C006D9942 /* SceneDelegate.swift in Sources */, - DDA2EE792C385FCF007C6059 /* MyPageViewController.swift in Sources */, A3FB185B2C3BF7DF001483E5 /* MeetingMembersResponseModel.swift in Sources */, DD3072222C3C0DA300416D9F /* PromiseParticipantListResponseModel.swift in Sources */, 789873322C3D1A7B00435E96 /* LoginViewController.swift in Sources */, diff --git a/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift index b61bddc2..dc51e035 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift @@ -6,66 +6,79 @@ // import UIKit - import SnapKit import Then class AlarmSettingView: BaseView { - let containerView = UIView().then { + private let containerView = UIView().then { $0.backgroundColor = .white $0.layer.borderWidth = 1 $0.layer.borderColor = UIColor.gray2.cgColor $0.layer.cornerRadius = 8 } - let titleLabel = UILabel().then { + private let stackView = UIStackView(axis: .vertical).then { + $0.spacing = 8 + $0.alignment = .fill + $0.distribution = .fill + } + + private let titleStackView = UIStackView(axis: .horizontal).then { + $0.alignment = .center + $0.distribution = .equalSpacing + } + + private let titleLabel = UILabel().then { $0.text = "내 푸시 알림" $0.font = UIFont.pretendard(.body03) $0.textColor = .black } - let subtitleLabel = UILabel().then { - $0.text = "준비, 이동을 시작해야할 시간에\n푸시 알림을 받을 수 있습니다." - $0.font = UIFont.pretendard(.caption02) - $0.textColor = .gray - $0.numberOfLines = 2 + private let toggleSwitch = UISwitch().then { + $0.onTintColor = .green } - let toggleSwitch = UISwitch().then { - $0.onTintColor = .green + private let subtitleLabel = UILabel().then { + $0.setText("준비, 이동을 시작해야할 시간에\n푸시 알림을 받을 수 있습니다.", style: .caption02, color: .gray) + $0.font = UIFont.pretendard(.caption02) + $0.textColor = .gray + $0.numberOfLines = 0 } override func setupView() { super.setupView() - backgroundColor = .white + backgroundColor = .systemMint.withAlphaComponent(0.1) addSubview(containerView) - containerView.addSubview(titleLabel) - containerView.addSubview(subtitleLabel) - containerView.addSubview(toggleSwitch) + containerView.addSubview(stackView) + + titleStackView.addArrangedSubviews(titleLabel, toggleSwitch) + stackView.addArrangedSubviews(titleStackView, subtitleLabel) } override func setupAutoLayout() { super.setupAutoLayout() containerView.snp.makeConstraints { - $0.top.leading.trailing.equalToSuperview().inset(16) - $0.height.equalTo(100) + $0.edges.equalToSuperview() } - titleLabel.snp.makeConstraints { - $0.top.leading.equalToSuperview().offset(16) + stackView.snp.makeConstraints { + $0.edges.equalToSuperview().inset(15) } - subtitleLabel.snp.makeConstraints { - $0.top.equalTo(titleLabel.snp.bottom).offset(8) - $0.leading.trailing.equalToSuperview().inset(16) + titleStackView.snp.makeConstraints { + $0.height.greaterThanOrEqualTo(44) } toggleSwitch.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.trailing.equalToSuperview().offset(-16) + $0.width.equalTo(51) + $0.height.equalTo(31) + } + + subtitleLabel.snp.makeConstraints { + $0.height.greaterThanOrEqualTo(40) // 최소 높이 설정 } } } diff --git a/KkuMulKum/Source/MyPage/View/MyPageContentView.swift b/KkuMulKum/Source/MyPage/View/MyPageContentView.swift index 7d9b5398..037cfa77 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageContentView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageContentView.swift @@ -10,10 +10,9 @@ import UIKit import SnapKit import Then -class MyPageContentView: UIView { +class MyPageContentView: BaseView { - let profileStackView = UIStackView().then { - $0.axis = .vertical + let profileStackView = UIStackView(axis: .vertical).then { $0.spacing = 12 $0.alignment = .center } @@ -55,11 +54,10 @@ class MyPageContentView: UIView { fatalError("init(coder:) has not been implemented") } - private func setupView() { + override func setupView() { backgroundColor = .clear addSubview(profileStackView) - profileStackView.addArrangedSubview(profileImageView) - profileStackView.addArrangedSubview(nameLabel) + profileStackView.addArrangedSubviews(profileImageView, nameLabel) addSubview(levelView) addSubview(separatorView) @@ -67,7 +65,7 @@ class MyPageContentView: UIView { levelView.addSubview(levelLabel) } - private func setupAutoLayout() { + override func setupAutoLayout() { profileStackView.snp.makeConstraints { $0.top.equalToSuperview().offset(20) $0.centerX.equalToSuperview() @@ -98,5 +96,4 @@ class MyPageContentView: UIView { $0.bottom.equalToSuperview().offset(-20) } } - } diff --git a/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift b/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift index cf6548ce..0b931ba8 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift @@ -7,7 +7,6 @@ import UIKit - import SnapKit import Then diff --git a/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift index 2552615c..a72def6a 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift @@ -4,7 +4,9 @@ // // Created by 이지훈 on 7/9/24. // + import UIKit + import SnapKit import Then @@ -17,6 +19,10 @@ class MyPageNavigationView: BaseView { $0.textColor = .black } + let separatorView = UIView().then { + $0.backgroundColor = .gray1 + } + override init(frame: CGRect) { super.init(frame: frame) setupView() @@ -30,11 +36,18 @@ class MyPageNavigationView: BaseView { override func setupView() { backgroundColor = .white addSubview(titleLabel) + addSubview(separatorView) } override func setupAutoLayout() { - titleLabel.snp.makeConstraints { make in - make.center.equalToSuperview() + titleLabel.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.bottom.equalToSuperview().offset(-16) + } + + separatorView.snp.makeConstraints { + $0.height.equalTo(1) + $0.leading.trailing.bottom.equalToSuperview() } } } diff --git a/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift b/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift index fce286d2..db6ad7d4 100644 --- a/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift +++ b/KkuMulKum/Source/MyPage/ViewController/MyPageViewController.swift @@ -7,9 +7,8 @@ import UIKit -import SnapKit - class MyPageViewController: BaseViewController { + private let navigationView = MyPageNavigationView() private let myPageContentView = MyPageContentView() private let alarmSettingView = AlarmSettingView() @@ -32,8 +31,9 @@ class MyPageViewController: BaseViewController { private func setupAutoLayout() { navigationView.snp.makeConstraints { - $0.top.left.right.equalTo(view.safeAreaLayoutGuide) - $0.height.equalTo(44) + $0.top.equalTo(view) + $0.leading.trailing.equalTo(view.safeAreaLayoutGuide) + $0.height.equalTo(96) } myPageContentView.snp.makeConstraints { @@ -42,12 +42,14 @@ class MyPageViewController: BaseViewController { } alarmSettingView.snp.makeConstraints { - $0.top.equalTo(myPageContentView.separatorView.snp.bottom).offset(20) + $0.top.equalTo(myPageContentView.snp.bottom).offset(20) $0.leading.trailing.equalToSuperview().inset(20) + $0.height.greaterThanOrEqualTo(120) } - etcSettingView.snp.makeConstraints { - $0.leading.trailing.equalToSuperview().inset(20) + etcSettingView.snp.makeConstraints { + $0.top.equalTo(alarmSettingView.snp.bottom).offset(20) + $0.leading.trailing.equalToSuperview().inset(4) $0.bottom.lessThanOrEqualTo(view.safeAreaLayoutGuide.snp.bottom).offset(-20) } } From ee0715efde2142f45baa5b0117ae38961e83c83b Mon Sep 17 00:00:00 2001 From: hooni Date: Wed, 10 Jul 2024 21:15:28 +0900 Subject: [PATCH 08/10] =?UTF-8?q?fix/#148=20=ED=8C=8C=EC=9D=BC=EB=B3=B5?= =?UTF-8?q?=EC=82=AC=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Image/img_edit.imageset/edit 1.png | Bin 660 -> 0 bytes .../Image/img_edit.imageset/edit 2.png | Bin 660 -> 0 bytes .../img_profile.imageset/my_btn_edit 1.png | Bin 6461 -> 0 bytes .../img_profile.imageset/my_btn_edit 2.png | Bin 6461 -> 0 bytes .../PromiseInfoViewController.swift~HEAD | 29 ------------------ .../PromiseInfoViewController.swift~HEAD_0 | 29 ------------------ .../PromiseInfoViewController.swift~suyeon | 29 ------------------ .../PromiseInfoViewController.swift~suyeon_0 | 29 ------------------ 8 files changed, 116 deletions(-) delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 1.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 2.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 1.png delete mode 100644 KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 2.png delete mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD delete mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 delete mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon delete mode 100644 KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 1.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/edit 1.png deleted file mode 100644 index e9fcd1770733d077204f8db07adcf8248c3785d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 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 X5Ag`DD;mGD00000NkvXXu0mjf3yVv& diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 2.png b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/my_btn_edit 2.png deleted file mode 100644 index 8e55943ececb6214655a0717b2fc1ed328f549c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6461 zcmV-D8N%j?P)8`@Uj~P5ll$`K_ME*uF=H2nB8A}XR0?nv-8s3)74#1_4fm9&)bfZnfmtksi&T* z+9E^^D=RBA=7eLPJvYqpfW1AFcr2zd;w>Y4UbRR37;gV%Z@2Hy&dx3iQOOn|-eJVt zkdBaX-Yeart`dkJVvo#m&few)z;h__im`%j%3U$Xg4RSVejMMKBckyAfg&#%BWj4a zX^sQ-tWD5qf$&?>5q*oIuMUdbF}5H5f^SCeNxOGRJ~BzM{Klhaw+=b?w)r-kEWqSTx5Giak9P z`2ZM_drwO`Vs8l<3Ps)n#jTEZqRxnYQAl4Xatp<+o=7^*z9^)N+KZgx4vv;N-r{)s zU1}?GJ2B)_p}0e3QJA1>Q#+9-hQj8B)PZ^FjI~EnQ)(r0Bk(zMIw~9rs~eHjxW8Tt zkux+WmXr>ByfztkyKj}3Y>J>z(w08YD2J2ZWm{Od+!rMHWQiSU>#gNNGDIY zHw8`x(U6+BdQeWzzBkE9Bmuj6Fivg+j$twOy-6M#=2$Xq=&%HcdMCHz-UzvZ{DDa6 zU`i{7+g2qIREyk(=Vye=EsrZnxBYLFrOpW<<$*Qk4r%SDs}Z^Ff1ebNeUoa4L}@==g~*v;Bc2e6 zLZN#va$BAXfwTWjd;lT)K~0NNc%67lWY8&a;tObtOINR6eNB|$t;lT!+oBNSA$RWF zS=3S?=cUN)u*HH9;x|V%46%9FC%0ePybz*?dDBNfBA()v$SH857;lB{jmRl*5&&Kb z-3yW1BpdtSBm}VLyH{O*(h_lH^vTf|X$T<%G^C@6(r_wrTa(V6O$h1caG48EI1AU=4<}?OrS;EU zIyo!a2pLR!^9CsaCnC3Ff(;>r45MkZGB1uPJY2V7`b8mxq{ZosH5X2PMhGEUa2mE3 zDsqPDgydqM%dow$aGhZ~A!Fez+g_xTvo4*G{5Z?D7b0>y`J^d?ka1{QEfvbx;W~F5 zO~=~Wn*8_Qf3m*5jxBcDXFP^;{Co&(*|Md5OiXnAV{&q`eII8$hBFxo!uH)o*0xW{ z_+YiwhL8;)+}pQrx5W%$C&e5(_;%0`iSWeDl z+g;F@A#9u>Zjzo@@LRWTZJ$Y--9;tg#{EXU-|WpLv9NF5x>Xyeb^$JmIBwp&*>-gZ zeR_Jj?x8)Ba0jITayxll*Gz|)A?nz*i8~;2i2a^>?va{;1t428CgX@4$+o7{1c)0> zgM+SJE^v1U9Y@Xj?=2(pvE4kE$m_IT8^!GpH5L2VZk|`(_%ByABnIecQHe?W}y@jOFHeL>{b*!?9!cCVGIQ!`TB4 z;m30GOd>Y|Z%Uw3N$K9Yse!BKcJr*4z97fN|NZx0`RAX1C~(E#x4U-jT00U8l-$}& z?c^a=x5W*E6>4DtSHJJR`$7!gbGdnzZy_ibhp^$^6nJ>x;vML3`~$g!^In-916VN1oZpQ*rDvyqzTt^b@qLN0w*A#c91CvJ~Uhp zA>oGVH6+;xi9yi}rm!k!Hf;iKl#@3_F{omrz)3G?69KFRkU9Z3O5|^fQZQDE%qk)M zKoOMk3daL!UpP?YcIB6Sq7V#^u}qZ=BW@##hfb00vc$ig)#k{yeZ01+@~TQ5wG#5kfF0g`-xmtRvqGIHk}j&LUwJ2F)=YQG-Oxr5@xpe80 zy#4mu^2Z;4bUps?!w<{HAAj7wc+?ezDi;IWTB`bg>w!gXZ{xMsfxCq})%M{eJ~Ep-Mi-cOh@5N;Z9u{eGD z^uXuw976dzqpZ}mZ-zZ7^1Y$}I5KxVh@9ID-vwjaJ9g~o%8o<)@4WL)rV#t3mtJb0Q4E7@ zJAn8ha1_^&4rqH*Q&ZwQ6B84gl5g!%eiO%^5d}kNNE9(#?*>C@5GNdb-2OAh*CBAc z7cL;=E?c*5)$*Mz&(6;7Pd*Tfd_@%W%m4c8FZJO%_R2=7q`Bg@k2K)Ih611}OL_Bt zZX~Tj*u@4_Zx1~1fG8j`BHx{SAQrjz%7M5ca;-olXe5)9lad#NjEH8+6phx;?E;jz zroF&bOxJQyQ^V$=`h@2GI6~keYQQ11Sa4;Gabsh^BHXL&&+Q7dK_wzbRK6kd2~je9 zrd8x{!lEa6;QjEvE{TO%B>3Fhw{I7%D4H+PW!w;XLlmHOLW-+?oa_FftM`Y{mAK(1 z6t%%Fl(A_u0v{9Vws+v7MEZ+ zN+X(`T!qLrI=L$sk8!n_f$MPE_4ncmEp5>JeqDVn{F?tK#0f0HB~@T9MzhKLYBC@i zo!oVGo~zkWu0OZdszpU@aFdg(nSrJa*A;56RxNS8ycQSXbWS6Ahaz_fgyO2o3-9Zy zb^xE-)h;5qfN&}8a?v?psffS-{=0B7#$}=|fyj#vtMR!tmnLgP%{aMM;EGqSTq#WG zc%LHQZxHz0n735q=PvU7$WR)|JN{3QwP09BYtScpfyw?;h;$5QSy!| zCl4vZPIQ5`$3A%p(9KCzC~JGG$vbMobwH7ms?aX-RZ)W0WrK)*G`Bs7T+Or~IytEd zO>NKQucEH|qR7dS{LrxJ90?1wIZa95wY9Y_<5nedz>uAkjq6o+9iTVy1{8kbL^%qh z$0&J6os%h#v-*vcfyStDc6PSQxF_sB z#*ruj0%zZxxCU)ZVW_^zv?m5V;X4f3iEET@%($uh9gF;&C<9>>6L7>8N)v9I3Sruh z*|WOj8_>E1F7Y3&ZEJ09ZIfZgB9BBNbaUbYStey7#%!HH2X&;r7B#eFGKG1$;C0HS^m zc6DSmC*NYQG2hLbH-(V2z`+A>@xDnn&>P>jL^*l41}60+kT4y5H|U9pv@g`ejvYIg zZ6_mvzyk@>L2J+x!8tj=kH`Kw8ASlu^dzl8Pi(Tg5c=gYERrFEP+s)X%fS9P=yw_W zN&|$O9BCt448x?y&yyntX-TM_T)s?KhOqesgYg+TyUf{?8!|c zx645d{Uc4#$w@DPUHF%cW}{&*7?fHJVkix;)RpuS*zoF!Q7;&zfR+RT$ID4CfwhU& zs2B7Vxv~G2C|xb4m-Y2^AtXsaZ6fMjez_mRV%d>lfCeaX(#zV~ngl|s;qGA~Z%F{K z7>4w6=gu7ogvB&38YprbvbRJzw{PDTLXre>;a^S@s)JFfXVqDDT(JWR%}7C@T?8QX zV`*PFO5_Wo7|tsvgSc_yhA5|%_Ju=5uDLMg)~#FZgOGl}$rX3yz8X~klO#>0$PrNn zLi7Nx)Wk8@uV2^Nomagqv@J>P%-{h|nrjqlF#2We|QQ+M*K z1`bYvle8cShjjrJky(prMUDiV_uCsYOec9jf>u$sJ@YKlR3f(tIPVvez)CQLV}hCMFiMB-}RsF2idV#bX$zlW{=X@qNhEe8yZ!@YEvrxdM)1Iw=B(++(9?<#BP4 zb+WaW!)X*aDFTG+2-`g+xAroL+($P@!h}UHq$tpyJWRqZTkYi{&pJ4`qBO-5=;EYk z(541$x`5|aS63y9qV^fbrAwFE&*65GnVFf5Etq!g+SR^~bEDCajEpseook7Vm6eq< z;(^d{#brjFxBw!L*MftvmzS62mtTHq3%UqnfzbEu+t)rr{6olG{L)KakvGlhj8qIa zPav*9k<72Z{@NBcT-znF;BoZfkP-Q!j6v?juBvu(WI<8BN=T6)!@jh%)IQ1{QiG$% zVz=&&jQT+tlW|1elnUJ(Sx_e2NKsTN?p|WCH=E7N0N~uM2-vr+`N?e<_y)zxF9_L`s=SX zE)TY9gnlS%_&)X?LUxAQTT&8qa54@E&Eeom*Z-SYUtd3Y*pTIq3fnKHtRx&mb&?nK zzj1_s5&Qi6@4ug_p1sK301t`dg(Wb7fC49ZfP;r3aA3mr`LvE+n8@ukIH$`*1+?=8 zDUk~oF35M^1+!7_2FCP`8l5*sy{^!GeT~rP&1vkx`$2Fw6p|GrX)y*KDz=Z_81@<$ zn|B`)N6^Vh7LZ(1oMcN2l5uB@&{TT#+$ARowpG^4B~o!=wV)b|Z9z?MI~mxDqQ#i_c*? zg#Gf%FUx}uKDg=e0|ySsH{X2IK62792Zq(=lMgxx*JF&(u_;3#!)g>cNdv_F^Uptv zkHEd(c;k&t0#EYXbI-|(FTN;wFdy{a^oIJt2Ii8o!RVFt~x{)+M;6A!I1P%v} zL0FFP9AP?ui$C$i6C1aG`spV*fBwAW00QrFbEi%YY;8MMxA1tqx@y7(Z0_e-#yJb7~C_9KrxB4Yr7 z&&7925jn7n(d8aL=kOUBg>NpNMd0!CF>%&CFGerV$G1xpIl%b2apV({1B#ps0}hUP z;=Yho;2`PV1#G9>j6?QPMc)1&PD~&v;Hey%Ldw zgwP2Y3tt4D9QMNa_j~WXmrLM9xVQy<@L@7z&ZM<{x7$oD2qoY{nQ{11NoD@Q; zqF3NQ{P2T(@x>QI|E8b7@i+L}GV$6T?eN-ubF9M2*)JzmpjqI+`xw|3%s}YT)Reb@ z2dR*qJ9mmJv5V2QgTkC9A+OW{#CtJrOuqR$XCYgdRyp=uY=VCw>DbpPrtU zB8b;M2cwo?>L+j%#}u@5Qz0xYEVR^@k=cGa){R4j9K-h-0)ZEid_#SC(#eNyZZJsT z@n#7=V3KYvoP((qHA2U9Rfg|1WzU{HGA>DhL#%^Vb+@#3Pnc}B+EgN^6_Av+RqC#t0YVivgZ{!oH^;vxQ(TiA?$v;nRxEt zU}F=LTFm$`LT^ZCHd|9juwe0sK*ce*#Sm4pIW5;&KcWN=?!@BxG zBlbDzxOziKa3Eygzkk1+J$qKNlI)N70@p_P4pHM=(3(4*`JZAdL_)Qy9FS`2TF|}Vf&4lpF z=D>DMnD7z_(Mro42k~1z_0&_RjH9L6nI|O7zq#)wC0tLb2PWs#(K5#oBkor36Ne8U zUNBvCy`fgdwr`r&@haS7BOkestsb8z>T5MODDb?$xwx6DgDqO(Xk|JJ_H$w$Bh zomXH%&r@q_YbS;Xy9?vy`2Ciov%_bIteUpDKdx@;2SuI|TTt_YIS~Fegp>(p7h*c` z0%jdbMvTy#M(AfGK#ag&Gy)&GBpOAY10#5d9nSuO5SO%MKz}y(t}c-zTI9TITppa=P{~jLzqc(1R#~>Ng%f@U=n;0psnauQ+G=jL!?h z`K(0JnNZOx!nKDHf}^K(@Qv3CDI8m1)09p~PlxYMOFEA2T-d!Boxfm&jtNWJl5wlH z58lf1M-;hZ5+VKb_8e-KcN7S{ksyMwPZb@CXT@gSHLW)g8G#=hmPH=~MP4!qmp>q3 ziyk6w$z8Wz7SAw3$9F&Pd%+9}UCe3T2t3z?ks_}cEBc1%&o@nfey?=Gdv#%?IhM`8 z;hgz5K+G*Wy;lV`eD|@|9qxT7Yk1xZMeZS1_z*hI5Pn1a5Pu|A(B?R2?=Nc-^e}Ap z9eI?7RLiP$?}fbXorEG+M&bg{kWK_JW8Curx!W*jIUyNAExdGcBn|20Oxj%}a{*{1UuT3I*_#mb|4XO))56)cu#@}` X5Ag`DD;mGD00000NkvXXu0mjf3yVv& diff --git a/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD deleted file mode 100644 index 8dd2847c..00000000 --- a/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD +++ /dev/null @@ -1,29 +0,0 @@ -// -// PromiseInfoViewController.swift -// KkuMulKum -// -// Created by YOUJIM on 7/9/24. -// - -import UIKit - -class PromiseInfoViewController: BaseViewController { - - 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/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 deleted file mode 100644 index 8dd2847c..00000000 --- a/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~HEAD_0 +++ /dev/null @@ -1,29 +0,0 @@ -// -// PromiseInfoViewController.swift -// KkuMulKum -// -// Created by YOUJIM on 7/9/24. -// - -import UIKit - -class PromiseInfoViewController: BaseViewController { - - 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/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon deleted file mode 100644 index 8dd2847c..00000000 --- a/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon +++ /dev/null @@ -1,29 +0,0 @@ -// -// PromiseInfoViewController.swift -// KkuMulKum -// -// Created by YOUJIM on 7/9/24. -// - -import UIKit - -class PromiseInfoViewController: BaseViewController { - - 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/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 b/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 deleted file mode 100644 index 8dd2847c..00000000 --- a/KkuMulKum/Source/Promise/PromiseInfoViewController.swift~suyeon_0 +++ /dev/null @@ -1,29 +0,0 @@ -// -// PromiseInfoViewController.swift -// KkuMulKum -// -// Created by YOUJIM on 7/9/24. -// - -import UIKit - -class PromiseInfoViewController: BaseViewController { - - 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 e5d9e4efbafc117c34decbca96bf164871aa5891 Mon Sep 17 00:00:00 2001 From: hooni Date: Wed, 10 Jul 2024 21:20:32 +0900 Subject: [PATCH 09/10] =?UTF-8?q?fix/#148=20=EC=A7=84=EC=9B=85=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets.xcassets/Image/img_edit.imageset/Contents.json | 2 -- .../Assets.xcassets/Image/img_profile.imageset/Contents.json | 2 -- KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift | 3 --- 3 files changed, 7 deletions(-) diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json index 429a98a8..c9c7d7d5 100644 --- a/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_edit.imageset/Contents.json @@ -6,12 +6,10 @@ "scale" : "1x" }, { - "filename" : "edit 1.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "edit 2.png", "idiom" : "universal", "scale" : "3x" } diff --git a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json index 185d5e43..d77dee5f 100644 --- a/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json +++ b/KkuMulKum/Resource/Assets.xcassets/Image/img_profile.imageset/Contents.json @@ -6,12 +6,10 @@ "scale" : "1x" }, { - "filename" : "my_btn_edit 1.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "my_btn_edit 2.png", "idiom" : "universal", "scale" : "3x" } diff --git a/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift index dc51e035..29eee9a7 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift @@ -41,9 +41,6 @@ class AlarmSettingView: BaseView { private let subtitleLabel = UILabel().then { $0.setText("준비, 이동을 시작해야할 시간에\n푸시 알림을 받을 수 있습니다.", style: .caption02, color: .gray) - $0.font = UIFont.pretendard(.caption02) - $0.textColor = .gray - $0.numberOfLines = 0 } override func setupView() { From 51d01b06d25e97b24997d9f46e2212183428cf82 Mon Sep 17 00:00:00 2001 From: hooni Date: Wed, 10 Jul 2024 21:47:56 +0900 Subject: [PATCH 10/10] =?UTF-8?q?fix/#148=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyPage/View/MyPageAlarmSettingView.swift | 7 +++---- .../Source/MyPage/View/MyPageContentView.swift | 17 +---------------- .../MyPage/View/MyPageEtcSettingView.swift | 1 - .../MyPage/View/MyPageNavigationView.swift | 12 +----------- 4 files changed, 5 insertions(+), 32 deletions(-) diff --git a/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift index 29eee9a7..a44447f8 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageAlarmSettingView.swift @@ -6,11 +6,11 @@ // import UIKit + import SnapKit import Then class AlarmSettingView: BaseView { - private let containerView = UIView().then { $0.backgroundColor = .white $0.layer.borderWidth = 1 @@ -30,9 +30,8 @@ class AlarmSettingView: BaseView { } private let titleLabel = UILabel().then { - $0.text = "내 푸시 알림" - $0.font = UIFont.pretendard(.body03) - $0.textColor = .black + $0.setText("알림 설정", style: .body03, color: .black) + } private let toggleSwitch = UISwitch().then { diff --git a/KkuMulKum/Source/MyPage/View/MyPageContentView.swift b/KkuMulKum/Source/MyPage/View/MyPageContentView.swift index 037cfa77..7fa13bdb 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageContentView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageContentView.swift @@ -11,7 +11,6 @@ import SnapKit import Then class MyPageContentView: BaseView { - let profileStackView = UIStackView(axis: .vertical).then { $0.spacing = 12 $0.alignment = .center @@ -44,24 +43,10 @@ class MyPageContentView: BaseView { $0.backgroundColor = .green2 } - override init(frame: CGRect) { - super.init(frame: frame) - setupView() - setupAutoLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - override func setupView() { backgroundColor = .clear - addSubview(profileStackView) + addSubview(profileStackView,levelView,separatorView) profileStackView.addArrangedSubviews(profileImageView, nameLabel) - - addSubview(levelView) - addSubview(separatorView) - levelView.addSubview(levelLabel) } diff --git a/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift b/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift index 0b931ba8..b444cfbb 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageEtcSettingView.swift @@ -11,7 +11,6 @@ import SnapKit import Then class EtcSettingView: BaseView { - let containerView = UIView().then { $0.backgroundColor = .white $0.layer.borderWidth = 1 diff --git a/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift index a72def6a..a929501d 100644 --- a/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift +++ b/KkuMulKum/Source/MyPage/View/MyPageNavigationView.swift @@ -22,17 +22,7 @@ class MyPageNavigationView: BaseView { let separatorView = UIView().then { $0.backgroundColor = .gray1 } - - override init(frame: CGRect) { - super.init(frame: frame) - setupView() - setupAutoLayout() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - + override func setupView() { backgroundColor = .white addSubview(titleLabel)