From 67ffb6567bba1ccf661ce1192d3f1dfbbc8015e6 Mon Sep 17 00:00:00 2001 From: dlwogus0128 <79050615+dlwogus0128@users.noreply.github.com> Date: Sat, 6 May 2023 15:57:01 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[Feat]=20#130=20-=20emptyView=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Literal/ImageLiterals.swift | 3 +- .../Contents.json | 23 +++++++++++++ .../Subtract.png | Bin 0 -> 1215 bytes .../Subtract@2x.png | Bin 0 -> 7584 bytes .../Subtract@3x.png | Bin 0 -> 11883 bytes .../Contents.json | 23 +++++++++++++ .../Subtract.png | Bin 0 -> 1259 bytes .../Subtract@2x.png | Bin 0 -> 8120 bytes .../Subtract@3x.png | Bin 0 -> 12617 bytes .../ActivityRecordInfoTVC.swift | 31 +++++++++++++----- .../VC/InfoVC/ActivityRecordInfoVC.swift | 28 +++++++++++++--- .../Presentation/MyPage/VC/MyPageVC.swift | 2 +- 12 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Contents.json create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Subtract.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Subtract@2x.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Subtract@3x.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container_selected.imageset/Contents.json create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container_selected.imageset/Subtract.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container_selected.imageset/Subtract@2x.png create mode 100644 Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container_selected.imageset/Subtract@3x.png diff --git a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift index c625596e..4ed87ff9 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift @@ -50,6 +50,8 @@ enum ImageLiterals { static var imgLogo: UIImage { .load(named: "img_logo") } static var imgPaper: UIImage { .load(named: "img_paper") } static var imgPerson: UIImage { .load(named: "img_person") } + static var imgRecordContainerSelected: UIImage { .load(named: "img_record_container_selected") } + static var imgRecordContainer: UIImage { .load(named: "img_record_container") } static var imgStampC1: UIImage { .load(named: "img_stamp_c1") } static var imgStampC2: UIImage { .load(named: "img_stamp_c2") } static var imgStampC3: UIImage { .load(named: "img_stamp_c3") } @@ -73,7 +75,6 @@ enum ImageLiterals { static var imgKakaoLogin: UIImage { .load(named: "img_kakao_login")} } - extension UIImage { static func load(named imageName: String) -> UIImage { guard let image = UIImage(named: imageName, in: nil, compatibleWith: nil) else { diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Contents.json new file mode 100644 index 00000000..05e9b4fb --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Subtract.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Subtract@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Subtract@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Subtract.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Subtract.png new file mode 100644 index 0000000000000000000000000000000000000000..5487ae3588df175fae549b484dbfee4af2c8ccca GIT binary patch literal 1215 zcmeAS@N?(olHy`uVBq!ia0y~yU`zwDH*&B6$?sX>ra+3bz$3Dlfq`2Xgc%uT&5-~K zG8PB9J29*~C-V}>VM%xNbp-0_=l+w(3gm`(x;TbZFuuKO=qHmdbL`=N9UaEq2UA5< z8?P<<$a_MtNNCRF8+L&^8fT|=yKuUAP7yoFdgO-n%zV$rr#H_%uI+w4F`^}Hd+pX= z5@*-%j`&i`D3H8;uT5=OK zGcGI(%-gk*Uq}4!`S|+a<>%%w+U+l!cc)K(-n=+4+K>OPirdc5^x@~)@1+ApS{eM(i_F3W-|NXc08Pqn|zj=MucW&M;JF7FhH(M3EvmG$G_IuZ= z&A!*|C7(UrWPf|^?ohr2t=#zb;LgiW7u6e<{au_G*Z;|Hua%V^gW8w3<%eG$*%Q~- zTYQ~w!S!_6!`EMJd+_$`=SoI{jk|ZRT77!e_wv$v@3Ql@U)Z|abXT|Qefz36FN+v% zfBNvUX!X_q{eNw&v>3KMc_{w)X)F6v<|Bq@7!rAm9V8C(2)KRbPdIJzpTQ~PA0x}f zKg=A9f3gd>eCAi^c_!~5an`=UU{*atB2d90pn?{d0uP{q2|xuJPz4X6rX4e22C2DW z1QZtlYIKBZgqsYs4y(y5mw;9;0b1<^RbT;h8^|<}Q-OwT^8t#t0Bsb2+6Xfl?j&@R z8-co*GJ$RenGEvOIjCtMrveSpy$lpzh~!zA$sp@cJPR{f0jSFX=&6M;1;#@w7?I)# rDFMI&87iCh_s02eGb|a5{;+FT&hwkLWcmVNdBfo8>gTe~DWM4f1Ktcf literal 0 HcmV?d00001 diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Subtract@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container.imageset/Subtract@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1a7ae2a777c09e7fcb4717c085074005f467bf GIT binary patch literal 7584 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 literal 0 HcmV?d00001 diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container_selected.imageset/Subtract@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/img_record_container_selected.imageset/Subtract@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f1b9eb0fe053edf9679c59088cdded5af5a8c84c GIT binary patch literal 12617 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 literal 0 HcmV?d00001 diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift index 7edc5a86..24843dda 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift @@ -15,18 +15,21 @@ final class ActivityRecordInfoTVC: UITableViewCell { // MARK: - UI Components - private let activityRecordContainerView = UIView().then { - $0.layer.cornerRadius = 10 - $0.layer.borderWidth = 1 - $0.layer.borderColor = UIColor.m5.cgColor + private let activityRecordContainerView = UIImageView().then { + $0.image = ImageLiterals.imgRecordContainer + } + + private lazy var horizontalDivideLine = UIView().then { + setLineDot(view: $0) } - private let horizontalDivideLine = UIView() private let firstVerticalDivideLine = UIView() private let secondVerticalDivideLine = UIView() private let activityRecordMapImage = UIImageView().then { $0.layer.cornerRadius = 10 + $0.layer.borderWidth = 1.5 + $0.layer.borderColor = UIColor.g4.cgColor $0.clipsToBounds = true } @@ -83,6 +86,7 @@ final class ActivityRecordInfoTVC: UITableViewCell { super.init(style: style, reuseIdentifier: reuseIdentifier) setUI() setLayout() + setLineDot(view: self.horizontalDivideLine) } required init?(coder: NSCoder) { @@ -163,6 +167,17 @@ extension ActivityRecordInfoTVC { label.font = .b8 return label } + + func setLineDot(view: UIView) { + let borderLayer = CAShapeLayer() + borderLayer.strokeColor = UIColor.g4.cgColor + borderLayer.lineDashPattern = [4, 4] + borderLayer.frame = view.bounds + borderLayer.fillColor = nil + borderLayer.path = UIBezierPath(rect: view.bounds).cgPath + + view.layer.addSublayer(borderLayer) + } } extension ActivityRecordInfoTVC { @@ -170,10 +185,10 @@ extension ActivityRecordInfoTVC { // MARK: - Layout Helpers func setUI() { - activityRecordMapImage.backgroundColor = .g3 horizontalDivideLine.backgroundColor = .g4 firstVerticalDivideLine.backgroundColor = .g4 secondVerticalDivideLine.backgroundColor = .g4 + } func setLayout() { @@ -194,7 +209,7 @@ extension ActivityRecordInfoTVC { activityRecordMapImage.snp.makeConstraints { make in make.top.equalToSuperview().offset(13) - make.leading.equalToSuperview().offset(15) + make.leading.equalToSuperview().offset(20) make.width.equalTo(86) make.height.equalTo(85) } @@ -206,7 +221,7 @@ extension ActivityRecordInfoTVC { horizontalDivideLine.snp.makeConstraints { make in make.top.equalTo(activityRecordMapImage.snp.bottom).offset(8) - make.leading.trailing.equalToSuperview().inset(10) + make.leading.trailing.equalToSuperview().inset(20) make.height.equalTo(1) } diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift index eab49a64..1b084cad 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift @@ -21,12 +21,14 @@ final class ActivityRecordInfoVC: UIViewController { // MARK: - UI Components - private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton).setTitle("활동 기록") + private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton).setTitle("러닝 기록") private lazy var activityRecordTableView = UITableView().then { $0.showsVerticalScrollIndicator = false $0.separatorStyle = .none } + + private let emptyView = ListEmptyView(description: "아직 러닝 기록이 없어요!\n코스를 그리고 달려보세요", buttonTitle: "코스 그리기") // MARK: - View Life Cycle @@ -47,11 +49,13 @@ extension ActivityRecordInfoVC { private func setData(activityRecordList: [ActivityRecord]) { self.activityRecordList = activityRecordList activityRecordTableView.reloadData() + self.emptyView.isHidden = !activityRecordList.isEmpty } private func setDelegate() { self.activityRecordTableView.delegate = self self.activityRecordTableView.dataSource = self + self.emptyView.delegate = self } private func register() { @@ -74,16 +78,21 @@ extension ActivityRecordInfoVC { private func setUI() { view.backgroundColor = .w1 - activityRecordTableView.backgroundColor = .w1 + activityRecordTableView.backgroundColor = .m3 } private func setLayout() { view.addSubview(activityRecordTableView) + activityRecordTableView.addSubviews(emptyView) activityRecordTableView.snp.makeConstraints { make in - make.top.equalTo(navibar.snp.bottom).offset(16) - make.leading.trailing.equalTo(view.safeAreaLayoutGuide) - make.bottom.equalToSuperview() + make.top.equalTo(navibar.snp.bottom) + make.leading.bottom.trailing.equalTo(view.safeAreaLayoutGuide) + } + + emptyView.snp.makeConstraints { make in + make.center.equalToSuperview() + make.leading.trailing.equalToSuperview().inset(80) } } } @@ -111,6 +120,14 @@ extension ActivityRecordInfoVC: UITableViewDataSource { } } +// MARK: - ListEmptyViewDelegate + +extension ActivityRecordInfoVC: ListEmptyViewDelegate { + func emptyViewButtonTapped() { + self.tabBarController?.selectedIndex = 0 + } +} + // MARK: - Network extension ActivityRecordInfoVC { @@ -142,3 +159,4 @@ extension ActivityRecordInfoVC { } } } + diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift index 070e91f9..47997bf6 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift @@ -73,7 +73,7 @@ final class MyPageVC: UIViewController { $0.addGestureRecognizer(tap) } - private lazy var activityRecordInfoView = makeInfoView(title: "활동 기록").then { + private lazy var activityRecordInfoView = makeInfoView(title: "러닝 기록").then { let tap = UITapGestureRecognizer(target: self, action: #selector(self.touchUpActivityRecordInfoView)) $0.addGestureRecognizer(tap) } From d0a940c6e56eaec7933d1b91e390f88571b8e5bf Mon Sep 17 00:00:00 2001 From: dlwogus0128 <79050615+dlwogus0128@users.noreply.github.com> Date: Sat, 6 May 2023 16:05:57 +0900 Subject: [PATCH 2/9] =?UTF-8?q?[Feat]=20#130=20-=20=EC=8A=A4=ED=83=AC?= =?UTF-8?q?=ED=94=84=20=ED=9A=8D=EB=93=9D=20=EC=A1=B0=EA=B1=B4=20UI=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/MyPageModel/GoalRewardInfoModel.swift | 16 ++++++++-------- .../MyPage/VC/InfoVC/ActivityRecordInfoVC.swift | 3 +-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Network/Model/MyPageModel/GoalRewardInfoModel.swift b/Runnect-iOS/Runnect-iOS/Network/Model/MyPageModel/GoalRewardInfoModel.swift index 68602b35..6405c6bb 100644 --- a/Runnect-iOS/Runnect-iOS/Network/Model/MyPageModel/GoalRewardInfoModel.swift +++ b/Runnect-iOS/Runnect-iOS/Network/Model/MyPageModel/GoalRewardInfoModel.swift @@ -16,17 +16,17 @@ extension GoalRewardInfoModel { static var stampNameList: [GoalRewardInfoModel] { return [ GoalRewardInfoModel(stampImg: ImageLiterals.imgStampC1, stampStandard: "그린 코스 1개"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampC2, stampStandard: "그린 코스 5개"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampC3, stampStandard: "그린 코스 10개"), + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampC2, stampStandard: "그린 코스 10개"), + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampC3, stampStandard: "그린 코스 30개"), GoalRewardInfoModel(stampImg: ImageLiterals.imgStampS1, stampStandard: "스크랩 1회"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampS2, stampStandard: "스크랩 5회"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampS3, stampStandard: "스크랩 10회"), + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampS2, stampStandard: "스크랩 20회"), + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampS3, stampStandard: "스크랩 40회"), GoalRewardInfoModel(stampImg: ImageLiterals.imgStampU1, stampStandard: "업로드 1회"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampU2, stampStandard: "업로드 5회"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampU3, stampStandard: "업로드 10회"), + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampU2, stampStandard: "업로드 10회"), + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampU3, stampStandard: "업로드 30회"), GoalRewardInfoModel(stampImg: ImageLiterals.imgStampR1, stampStandard: "달리기 1회"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampR2, stampStandard: "달리기 5회"), - GoalRewardInfoModel(stampImg: ImageLiterals.imgStampR2, stampStandard: "달리기 10회") + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampR2, stampStandard: "달리기 15회"), + GoalRewardInfoModel(stampImg: ImageLiterals.imgStampR2, stampStandard: "달리기 30회") ] } diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift index 1b084cad..c61ade8d 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift @@ -120,7 +120,7 @@ extension ActivityRecordInfoVC: UITableViewDataSource { } } -// MARK: - ListEmptyViewDelegate +// MARK: - ListEmptyViewDelegate extension ActivityRecordInfoVC: ListEmptyViewDelegate { func emptyViewButtonTapped() { @@ -159,4 +159,3 @@ extension ActivityRecordInfoVC { } } } - From 8cc9b71ff4e7c789f484a99c163d3e4762f9bd3a Mon Sep 17 00:00:00 2001 From: dlwogus0128 <79050615+dlwogus0128@users.noreply.github.com> Date: Sat, 6 May 2023 16:38:45 +0900 Subject: [PATCH 3/9] =?UTF-8?q?[Feat]=20#130=20-=20=EB=8B=89=EB=84=A4?= =?UTF-8?q?=EC=9E=84=20=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyPage/VC/NicknameEditorVC.swift | 92 ++++++++++--------- 1 file changed, 50 insertions(+), 42 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift index d01a8c34..ed576874 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/NicknameEditorVC.swift @@ -27,29 +27,38 @@ final class NicknameEditorVC: UIViewController { // MARK: - UI Components - private let editorContentView = UIView().then { - $0.layer.cornerRadius = 10 - } - - private let nickNameEditLabel = UILabel().then { - $0.text = "닉네임 수정" - $0.textColor = .g1 - $0.font = .h5 - } - + private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton).setTitle("닉네임 수정") + private let nickNameTextField = UITextField().then { $0.resignFirstResponder() $0.text = nil $0.textColor = .g1 - $0.font = .b6 + $0.font = .h5 + $0.textAlignment = .center $0.attributedPlaceholder = NSAttributedString( string: "닉네임을 입력하세요", - attributes: [NSAttributedString.Key.foregroundColor: UIColor.g2, NSAttributedString.Key.font: UIFont.b6] + attributes: [NSAttributedString.Key.foregroundColor: UIColor.g2, NSAttributedString.Key.font: UIFont.h5] ) $0.keyboardType = .webSearch } - private let horizontalDivideLine = UIView() + private let personImageView = UIImageView().then { + $0.image = ImageLiterals.imgPerson + } + + private let nickNameContainer = UIView().then { + $0.layer.cornerRadius = 5 + $0.layer.borderColor = UIColor.m1.cgColor + $0.layer.borderWidth = 1 + } + + private lazy var finishNickNameLabel = UILabel().then { + $0.text = "완료" + $0.font = .h4 + $0.textColor = .m1 + let tap = UITapGestureRecognizer(target: self, action: #selector(finishNickNameLabelDidTap)) + self.view.addGestureRecognizer(tap) + } // MARK: - View Life Cycle @@ -66,15 +75,7 @@ final class NicknameEditorVC: UIViewController { // MARK: - Method -extension NicknameEditorVC { - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - super.touchesBegan(touches, with: event) - if let touch = touches.first, touch.view == self.view { - dismiss(animated: false) - didNicknameReturn() - } - } - +extension NicknameEditorVC { private func setAddTarget() { nickNameTextField.addTarget(self, action: #selector(textFieldTextDidChange), for: .editingChanged) } @@ -113,6 +114,11 @@ extension NicknameEditorVC { self.nickNameTextField.text = String(newString) } } + + @objc private func finishNickNameLabelDidTap() { + didNicknameReturn() + self.navigationController?.popViewController(animated: false) + } } extension NicknameEditorVC { @@ -120,37 +126,39 @@ extension NicknameEditorVC { // MARK: - Layout Helpers private func setUI() { - self.tabBarController?.tabBar.isHidden = true - view.backgroundColor = .black.withAlphaComponent(0.8) - editorContentView.backgroundColor = .w1 - horizontalDivideLine.backgroundColor = .g3 + view.backgroundColor = .w1 } private func setLayout() { - view.addSubview(editorContentView) + view.addSubviews(navibar, finishNickNameLabel, personImageView, nickNameContainer) - editorContentView.snp.makeConstraints { make in - make.centerY.equalToSuperview() - make.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(16) - make.height.equalTo(111) + navibar.snp.makeConstraints { make in + make.leading.top.trailing.equalTo(view.safeAreaLayoutGuide) + make.height.equalTo(48) } - editorContentView.addSubviews(nickNameEditLabel, nickNameTextField, horizontalDivideLine) + finishNickNameLabel.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(23) + make.top.equalTo(view.safeAreaLayoutGuide).offset(12) + } - nickNameEditLabel.snp.makeConstraints { make in - make.top.leading.equalToSuperview().offset(24) + personImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.width.height.equalTo(96) + make.top.equalTo(navibar.snp.bottom).offset(98) } - nickNameTextField.snp.makeConstraints { make in - make.top.equalTo(nickNameEditLabel.snp.bottom).offset(20) - make.leading.trailing.equalToSuperview().inset(24) + nickNameContainer.snp.makeConstraints { make in + make.leading.trailing.equalToSuperview().inset(30) + make.height.equalTo(44) + make.top.equalTo(personImageView.snp.bottom).offset(51) } - horizontalDivideLine.snp.makeConstraints { make in - make.top.equalTo(nickNameTextField.snp.bottom).offset(10) - make.centerX.equalToSuperview() - make.width.equalTo(nickNameTextField.snp.width) - make.height.equalTo(0.5) + nickNameContainer.addSubview(nickNameTextField) + + nickNameTextField.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.leading.trailing.equalToSuperview() } } } From 09be69a77392772e1c24139c958a92cb1de5d988 Mon Sep 17 00:00:00 2001 From: dlwogus0128 <79050615+dlwogus0128@users.noreply.github.com> Date: Sat, 6 May 2023 16:53:46 +0900 Subject: [PATCH 4/9] =?UTF-8?q?[Feat]=20#130=20-=20=EB=8B=89=EB=84=A4?= =?UTF-8?q?=EC=9E=84=20=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?push=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/UIComponents/CustomNavigationBar.swift | 5 +++++ .../Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift b/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift index 84f9bf13..c869d1e5 100644 --- a/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift +++ b/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift @@ -164,7 +164,12 @@ extension CustomNavigationBar { extension CustomNavigationBar { @objc private func popToPreviousVC() { + guard let vc = vc else { return } self.vc?.navigationController?.popViewController(animated: true) + if vc.presentingViewController != nil { + self.vc?.dismiss(animated: true) + + } } @objc private func searchLocation() { diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift index 47997bf6..8e6effb8 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift @@ -175,8 +175,7 @@ extension MyPageVC { private func pushToNicknameEditorVC() { let nicknameEditorVC = NicknameEditorVC() nicknameEditorVC.delegate = self - nicknameEditorVC.modalPresentationStyle = .overFullScreen - self.present(nicknameEditorVC, animated: false) + self.navigationController?.pushViewController(nicknameEditorVC, animated: true) } private func pushToSettingVC() { From c8f24557a551884d13e4c9060fcc54ddedf2fc0f Mon Sep 17 00:00:00 2001 From: dlwogus0128 <79050615+dlwogus0128@users.noreply.github.com> Date: Sat, 6 May 2023 16:57:14 +0900 Subject: [PATCH 5/9] =?UTF-8?q?[Feat]=20#130=20-=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=B0=9B=EC=95=84=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj | 4 ++-- Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj index ecd3af5e..f1dcb5ea 100644 --- a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj +++ b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj @@ -1593,7 +1593,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "com.runnect.Runnect-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1630,7 +1630,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "com.runnect.Runnect-iOS"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift index 8e6effb8..fcf2464b 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/MyPageVC.swift @@ -97,7 +97,8 @@ final class MyPageVC: UIViewController { private let versionInfoValueLabel = UILabel().then { $0.textColor = .g2 $0.font = .b2 - $0.text = "v. 1.0.1" + let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String + $0.text = "v. \(version ?? "1.0.0")" } // MARK: - View Life Cycle From 07b8a5b0003fe04134a521f273985d80d606f6df Mon Sep 17 00:00:00 2001 From: dlwogus0128 <79050615+dlwogus0128@users.noreply.github.com> Date: Tue, 9 May 2023 08:37:39 +0900 Subject: [PATCH 6/9] =?UTF-8?q?[Feat]=20#130=20-=20=EB=9F=AC=EB=8B=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D=20=ED=8E=B8=EC=A7=91=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=85=80=20=EC=84=A0=ED=83=9D=EA=B9=8C=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ActivityRecordInfoTVC.swift | 9 +- .../VC/InfoVC/ActivityRecordInfoVC.swift | 154 +++++++++++++++++- .../Presentation/MyPage/VC/MyPageVC.swift | 1 + 3 files changed, 154 insertions(+), 10 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift index 24843dda..5adb737f 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoTableView/ActivityRecordInfoTVC.swift @@ -15,7 +15,7 @@ final class ActivityRecordInfoTVC: UITableViewCell { // MARK: - UI Components - private let activityRecordContainerView = UIImageView().then { + var activityRecordContainerView = UIImageView().then { $0.image = ImageLiterals.imgRecordContainer } @@ -92,6 +92,11 @@ final class ActivityRecordInfoTVC: UITableViewCell { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + self.activityRecordContainerView.image = selected ? ImageLiterals.imgRecordContainerSelected : ImageLiterals.imgRecordContainer + } } // MARK: - Methods @@ -188,7 +193,7 @@ extension ActivityRecordInfoTVC { horizontalDivideLine.backgroundColor = .g4 firstVerticalDivideLine.backgroundColor = .g4 secondVerticalDivideLine.backgroundColor = .g4 - + self.backgroundColor = .clear } func setLayout() { diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift index c61ade8d..b5297c5d 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift @@ -19,6 +19,10 @@ final class ActivityRecordInfoVC: UIViewController { private var activityRecordList = [ActivityRecord]() + private var isEditMode: Bool = false + + private var selectedRecords: [IndexPath] = [] + // MARK: - UI Components private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton).setTitle("러닝 기록") @@ -26,20 +30,48 @@ final class ActivityRecordInfoVC: UIViewController { private lazy var activityRecordTableView = UITableView().then { $0.showsVerticalScrollIndicator = false $0.separatorStyle = .none + $0.contentInset = UIEdgeInsets(top: 19, left: 0, bottom: 0, right: 0) + $0.allowsMultipleSelection = true } private let emptyView = ListEmptyView(description: "아직 러닝 기록이 없어요!\n코스를 그리고 달려보세요", buttonTitle: "코스 그리기") - - // MARK: - View Life Cycle + private let editRecordContainerView = UIView() + + private lazy var totalNumOfRecordlabel = UILabel().then { + $0.font = .b6 + $0.textColor = .g2 + $0.text = "총 기록 0개" + } + + private let editButton = UIButton(type: .custom).then { + $0.setTitle("편집", for: .normal) + $0.setTitleColor(.m1, for: .normal) + $0.titleLabel?.font = .b7 + $0.layer.borderColor = UIColor.m1.cgColor + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 11 + } + + private lazy var deleteRecordButton = CustomButton(title: "삭제하기").then { + $0.isHidden = true + var selectedRecords = self.selectedRecords + $0.isEnabled = false + + } + + // MARK: - View Life Cycle + override func viewDidLoad() { super.viewDidLoad() setNavigationBar() setUI() setLayout() + setAddTarget() setDelegate() register() getActivityRecordInfo() + self.hideTabBar(wantsToHide: true) } } @@ -50,6 +82,7 @@ extension ActivityRecordInfoVC { self.activityRecordList = activityRecordList activityRecordTableView.reloadData() self.emptyView.isHidden = !activityRecordList.isEmpty + totalNumOfRecordlabel.text = "총 기록 \(activityRecordList.count)개" } private func setDelegate() { @@ -61,12 +94,34 @@ extension ActivityRecordInfoVC { private func register() { self.activityRecordTableView.register(ActivityRecordInfoTVC.self, forCellReuseIdentifier: ActivityRecordInfoTVC.className) } + + private func setAddTarget() { + self.editButton.addTarget(self, action: #selector(editButtonDidTap), for: .touchUpInside) + } } +// MARK: - @objc Function + +extension ActivityRecordInfoVC { + @objc func editButtonDidTap() { + selectedRecords = [] + if isEditMode { + isEditMode = false + self.totalNumOfRecordlabel.text = "총 기록 \(self.activityRecordList.count)개" + self.editButton.setTitle("편집", for: .normal) + self.deleteRecordButton.isHidden = true + } else { + isEditMode = true + self.totalNumOfRecordlabel.text = "기록 선택" + self.editButton.setTitle("취소", for: .normal) + self.deleteRecordButton.isHidden = false + } + } +} + +// MARK: - Layout Helpers + extension ActivityRecordInfoVC { - - // MARK: - Layout Helpers - private func setNavigationBar() { view.addSubview(navibar) @@ -79,15 +134,43 @@ extension ActivityRecordInfoVC { private func setUI() { view.backgroundColor = .w1 activityRecordTableView.backgroundColor = .m3 + editRecordContainerView.backgroundColor = .w1 } private func setLayout() { - view.addSubview(activityRecordTableView) + view.addSubviews(editRecordContainerView, activityRecordTableView, deleteRecordButton) activityRecordTableView.addSubviews(emptyView) - activityRecordTableView.snp.makeConstraints { make in + editRecordContainerView.snp.makeConstraints { make in make.top.equalTo(navibar.snp.bottom) - make.leading.bottom.trailing.equalTo(view.safeAreaLayoutGuide) + make.leading.trailing.equalToSuperview() + make.height.equalTo(38) + } + + editRecordContainerView.addSubviews(totalNumOfRecordlabel, editButton) + + totalNumOfRecordlabel.snp.makeConstraints { make in + make.leading.equalToSuperview().inset(16) + make.top.equalToSuperview().offset(10) + } + + editButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(16) + make.width.equalTo(47) + make.height.equalTo(22) + make.top.equalToSuperview().offset(5) + } + + activityRecordTableView.snp.makeConstraints { make in + make.top.equalTo(editRecordContainerView.snp.bottom) + make.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.bottom.equalToSuperview() + } + + deleteRecordButton.snp.makeConstraints { make in + make.bottom.equalToSuperview().inset(32) + make.leading.trailing.equalToSuperview().inset(16) + make.height.equalTo(44) } emptyView.snp.makeConstraints { make in @@ -103,6 +186,45 @@ extension ActivityRecordInfoVC: UITableViewDelegate { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 193 } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard tableView.cellForRow(at: indexPath) is ActivityRecordInfoTVC else { return } + if isEditMode { + // 선택된 셀의 정보를 저장 + if !selectedRecords.contains(indexPath) { + selectedRecords.append(indexPath) + } + + if selectedRecords.count == 0 { + self.deleteRecordButton.isEnabled = false + } else { + self.deleteRecordButton.setTitle("삭제하기(\(selectedRecords.count))", for: .normal) + self.deleteRecordButton.isEnabled = true + } + } else { + tableView.deselectRow(at: indexPath, animated: true) + } + } + + func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { + guard tableView.cellForRow(at: indexPath) is ActivityRecordInfoTVC else { return } + if isEditMode { + // 선택 취소된 셀의 정보를 삭제 + if let index = selectedRecords.firstIndex(of: indexPath) { + selectedRecords.remove(at: index) + } + + if selectedRecords.count == 0 { + self.deleteRecordButton.isEnabled = false + } else { + self.deleteRecordButton.setTitle("삭제하기(\(selectedRecords.count))", for: .normal) + self.deleteRecordButton.isEnabled = true + + } + } else { + tableView.deselectRow(at: indexPath, animated: true) + } + } } // MARK: - UITableViewDataSource @@ -116,6 +238,22 @@ extension ActivityRecordInfoVC: UITableViewDataSource { guard let activityRecordCell = tableView.dequeueReusableCell(withIdentifier: ActivityRecordInfoTVC.className, for: indexPath) as? ActivityRecordInfoTVC else { return UITableViewCell()} activityRecordCell.selectionStyle = .none activityRecordCell.setData(model: activityRecordList[indexPath.item]) + if isEditMode { + // 선택된 셀에 대한 표시 업데이트 + if selectedRecords.contains(indexPath) { + activityRecordCell.activityRecordContainerView.image = ImageLiterals.imgRecordContainerSelected + } else { + activityRecordCell.activityRecordContainerView.image = ImageLiterals.imgRecordContainer + } + } else { + activityRecordCell.selectionStyle = .none + // 선택된 셀들을 순회하면서 미선택 이미지로 변경 + for i in 0.. Date: Wed, 10 May 2023 14:22:34 +0900 Subject: [PATCH 7/9] =?UTF-8?q?[Feat]=20#130=20-=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=ED=95=A8=EC=88=98=EB=A1=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VC/InfoVC/ActivityRecordInfoVC.swift | 71 ++++++++----------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift index b5297c5d..7e987431 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift @@ -20,9 +20,7 @@ final class ActivityRecordInfoVC: UIViewController { private var activityRecordList = [ActivityRecord]() private var isEditMode: Bool = false - - private var selectedRecords: [IndexPath] = [] - + // MARK: - UI Components private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton).setTitle("러닝 기록") @@ -55,9 +53,7 @@ final class ActivityRecordInfoVC: UIViewController { private lazy var deleteRecordButton = CustomButton(title: "삭제하기").then { $0.isHidden = true - var selectedRecords = self.selectedRecords $0.isEnabled = false - } // MARK: - View Life Cycle @@ -104,17 +100,25 @@ extension ActivityRecordInfoVC { extension ActivityRecordInfoVC { @objc func editButtonDidTap() { - selectedRecords = [] if isEditMode { - isEditMode = false self.totalNumOfRecordlabel.text = "총 기록 \(self.activityRecordList.count)개" self.editButton.setTitle("편집", for: .normal) self.deleteRecordButton.isHidden = true + if let selectedRows = activityRecordTableView.indexPathsForSelectedRows { + for indexPath in selectedRows { + activityRecordTableView.deselectRow(at: indexPath, animated: true) + } + } + self.deleteRecordButton.isEnabled = false + self.deleteRecordButton.setTitle(title: "삭제하기") + self.activityRecordTableView.reloadData() + isEditMode = false } else { - isEditMode = true self.totalNumOfRecordlabel.text = "기록 선택" self.editButton.setTitle("취소", for: .normal) self.deleteRecordButton.isHidden = false + self.activityRecordTableView.reloadData() + isEditMode = true } } } @@ -189,40 +193,27 @@ extension ActivityRecordInfoVC: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard tableView.cellForRow(at: indexPath) is ActivityRecordInfoTVC else { return } - if isEditMode { - // 선택된 셀의 정보를 저장 - if !selectedRecords.contains(indexPath) { - selectedRecords.append(indexPath) - } - - if selectedRecords.count == 0 { - self.deleteRecordButton.isEnabled = false - } else { - self.deleteRecordButton.setTitle("삭제하기(\(selectedRecords.count))", for: .normal) - self.deleteRecordButton.isEnabled = true - } - } else { - tableView.deselectRow(at: indexPath, animated: true) - } + guard let selectedRecords = tableView.indexPathsForSelectedRows else { return } + editButtonToggle(selectedRecords: selectedRecords, indexPath: indexPath) } func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { guard tableView.cellForRow(at: indexPath) is ActivityRecordInfoTVC else { return } + guard let selectedRecords = tableView.indexPathsForSelectedRows else { + self.deleteRecordButton.isEnabled = false + self.deleteRecordButton.setTitle(title: "삭제하기") + return } + editButtonToggle(selectedRecords: selectedRecords, indexPath: indexPath) + } + + func editButtonToggle(selectedRecords: [IndexPath], indexPath: IndexPath) { if isEditMode { - // 선택 취소된 셀의 정보를 삭제 - if let index = selectedRecords.firstIndex(of: indexPath) { - selectedRecords.remove(at: index) - } - - if selectedRecords.count == 0 { - self.deleteRecordButton.isEnabled = false - } else { - self.deleteRecordButton.setTitle("삭제하기(\(selectedRecords.count))", for: .normal) - self.deleteRecordButton.isEnabled = true - - } + self.deleteRecordButton.isEnabled = true + let countSelectedRows = selectedRecords.count + self.deleteRecordButton.setTitle(title: "삭제하기(\(countSelectedRows))") } else { - tableView.deselectRow(at: indexPath, animated: true) + self.activityRecordTableView.deselectRow(at: indexPath, animated: true) + self.deleteRecordButton.setTitle(title: "삭제하기") } } } @@ -240,18 +231,18 @@ extension ActivityRecordInfoVC: UITableViewDataSource { activityRecordCell.setData(model: activityRecordList[indexPath.item]) if isEditMode { // 선택된 셀에 대한 표시 업데이트 - if selectedRecords.contains(indexPath) { + if let selectedRecords = tableView.indexPathsForSelectedRows, selectedRecords.contains(indexPath) { activityRecordCell.activityRecordContainerView.image = ImageLiterals.imgRecordContainerSelected } else { activityRecordCell.activityRecordContainerView.image = ImageLiterals.imgRecordContainer } + } else { activityRecordCell.selectionStyle = .none // 선택된 셀들을 순회하면서 미선택 이미지로 변경 - for i in 0.. Date: Wed, 10 May 2023 14:36:44 +0900 Subject: [PATCH 8/9] =?UTF-8?q?[Feat]=20#130=20-=20ActivityRecordDetailVC?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Runnect-iOS.xcodeproj/project.pbxproj | 4 +++ .../VC/InfoVC/ActivityRecordDetailVC.swift | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift diff --git a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj index 0bf0458d..2f5ace6c 100644 --- a/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj +++ b/Runnect-iOS/Runnect-iOS.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ A3D1A77929CF03D200DD54EC /* AuthRouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D1A77829CF03D200DD54EC /* AuthRouter.swift */; }; A3D1A77E29CF09B600DD54EC /* SignInResponseDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D1A77D29CF09B600DD54EC /* SignInResponseDto.swift */; }; A3D1A78029CF142E00DD54EC /* UserManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D1A77F29CF142E00DD54EC /* UserManager.swift */; }; + A3DB8C472A0B64830081AF2D /* ActivityRecordDetailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DB8C462A0B64830081AF2D /* ActivityRecordDetailVC.swift */; }; A3E55BA029C815B10000D85D /* SignInSocialLoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3E55B9F29C815B10000D85D /* SignInSocialLoginVC.swift */; }; A3F67AE2296D33AC001598A2 /* MyPageDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F67AE1296D33AC001598A2 /* MyPageDto.swift */; }; A3F67AEA296E4936001598A2 /* ActivityRecordInfoDto.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3F67AE9296E4936001598A2 /* ActivityRecordInfoDto.swift */; }; @@ -177,6 +178,7 @@ A3D1A77829CF03D200DD54EC /* AuthRouter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthRouter.swift; sourceTree = ""; }; A3D1A77D29CF09B600DD54EC /* SignInResponseDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInResponseDto.swift; sourceTree = ""; }; A3D1A77F29CF142E00DD54EC /* UserManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserManager.swift; sourceTree = ""; }; + A3DB8C462A0B64830081AF2D /* ActivityRecordDetailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityRecordDetailVC.swift; sourceTree = ""; }; A3E55B9F29C815B10000D85D /* SignInSocialLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInSocialLoginVC.swift; sourceTree = ""; }; A3E55BA529C8AB0A0000D85D /* Runnect-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Runnect-iOS.entitlements"; sourceTree = ""; }; A3F67AE1296D33AC001598A2 /* MyPageDto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageDto.swift; sourceTree = ""; }; @@ -360,6 +362,7 @@ A3BC2F2A2962C3D500198261 /* GoalRewardInfoVC.swift */, A3BC2F2C2962C3F200198261 /* ActivityRecordInfoVC.swift */, A3BC2F2E2962C40A00198261 /* UploadedCourseInfoVC.swift */, + A3DB8C462A0B64830081AF2D /* ActivityRecordDetailVC.swift */, ); path = InfoVC; sourceTree = ""; @@ -1360,6 +1363,7 @@ CEE59FDA29DD6F7D00C791F1 /* Providers.swift in Sources */, CE5875A029601500005D967E /* Toast.swift in Sources */, CE40BB1E2968054F0030ABCA /* BaseResponse.swift in Sources */, + A3DB8C472A0B64830081AF2D /* ActivityRecordDetailVC.swift in Sources */, CE14677C2965C1B100DCEA1B /* RunningRecordVC.swift in Sources */, CE6B63D829673450003F900F /* ListEmptyView.swift in Sources */, A3C2CAD329E4F77C00EC525B /* TermsOfServiceVC.swift in Sources */, diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift new file mode 100644 index 00000000..a8320094 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift @@ -0,0 +1,34 @@ +// +// ActivityRecordDetailVC.swift +// Runnect-iOS +// +// Created by 몽이 누나 on 2023/05/10. +// + +import UIKit + +import SnapKit +import Then + +final class ActivityRecordDetailVC: UIViewController { + + // MARK: - View Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + setUI() + setLayout() + } +} + +// MARK: - Layout Helpers + +extension ActivityRecordDetailVC { + private func setUI() { + view.backgroundColor = .w1 + } + + private func setLayout() { + + } +} From dbdf14e165f1959d31fa3d33105a2ab066114873 Mon Sep 17 00:00:00 2001 From: dlwogus0128 <79050615+dlwogus0128@users.noreply.github.com> Date: Wed, 10 May 2023 18:42:01 +0900 Subject: [PATCH 9/9] =?UTF-8?q?[Feat]=20#130=20-=20AcivityRecordDetailVC?= =?UTF-8?q?=20UI=20=EA=B5=AC=ED=98=84=20=EC=A4=91..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VC/InfoVC/ActivityRecordDetailVC.swift | 242 ++++++++++++++++++ .../VC/InfoVC/ActivityRecordInfoVC.swift | 23 +- 2 files changed, 257 insertions(+), 8 deletions(-) diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift index a8320094..2412cf8b 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordDetailVC.swift @@ -12,23 +12,265 @@ import Then final class ActivityRecordDetailVC: UIViewController { + // MARK: - Properties + + private let recordProvider = Providers.recordProvider + + private var activityRecordList = [ActivityRecord]() + + private var courseId: Int? + + private var publicCourseId: Int? + + // MARK: - UI Components + + private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton) + + private let moreButton = UIButton(type: .system).then { + $0.setImage(ImageLiterals.icMore, for: .normal) + $0.tintColor = .g1 + } + + private lazy var middleScorollView = UIScrollView().then { + $0.isScrollEnabled = true + $0.showsVerticalScrollIndicator = false + } + + private let mapImageView = UIImageView() + + private let courseTitleLabel = UILabel().then { + $0.text = "제목" + $0.textColor = .g1 + $0.font = .h4 + } + + private let recordDateInfoView = CourseDetailInfoView(title: "날짜", description: "0000.00.00") + + private let recordDepartureInfoView = CourseDetailInfoView(title: "출발지", description: "서울시 영등포구") + + private lazy var recordInfoStackView = UIStackView(arrangedSubviews: [recordDateInfoView, recordDepartureInfoView]).then { + $0.axis = .vertical + $0.spacing = 6 + $0.distribution = .fillEqually + } + + private let firstHorizontalDivideLine = UIView() + + private let secondHorizontalDivideLine = UIView() + + private lazy var recordDistanceLabel = setGreyTitle().then { + $0.text = "거리" + } + + private lazy var recordRunningTimeLabel = setGreyTitle().then { + $0.text = "이동 시간" + } + + private lazy var recordAveragePaceLabel = setGreyTitle().then { + $0.text = "평균 페이스" + } + + private lazy var recordDistanceValueLabel = setBlackTitle().then { + $0.text = "5.1km" + } + + private lazy var recordRunningTimeValueLabel = setBlackTitle().then { + $0.text = "00:28:07" + } + + private lazy var recordAveragePaceValueLabel = setBlackTitle().then { + $0.text = "5’31’’" + } + + private lazy var recordDistanceStackView = setDetailInfoStakcView(title: recordDistanceLabel, value: recordDistanceValueLabel) + + private lazy var recordRunningTimeStackView = setDetailInfoStakcView(title: recordRunningTimeLabel, value: recordRunningTimeValueLabel) + + private lazy var recordAveragePaceStackView = setDetailInfoStakcView(title: recordAveragePaceLabel, value: recordAveragePaceValueLabel) + + private let firstVerticalDivideLine = UIView() + private let secondVerticalDivideLine = UIView() + + private lazy var recordSubInfoStackView = UIStackView(arrangedSubviews: [recordDistanceStackView, firstVerticalDivideLine, recordRunningTimeStackView, secondVerticalDivideLine, recordAveragePaceStackView]).then { + $0.axis = .horizontal + $0.spacing = 3 + $0.distribution = .fill + } + // MARK: - View Life Cycle override func viewDidLoad() { super.viewDidLoad() + hideTabBar(wantsToHide: true) + setNavigationBar() setUI() setLayout() } } +// MARK: - Methods + +extension ActivityRecordDetailVC { + func setCourseId(courseId: Int?, publicCourseId: Int?) { + self.courseId = courseId + self.publicCourseId = publicCourseId + } + + func setDetailInfoStakcView(title: UIView, value: UIView) -> UIStackView { + let stackView = UIStackView(arrangedSubviews: [title, value]) + stackView.axis = .vertical + stackView.alignment = .center + stackView.spacing = 2 + return stackView + } + + func setBlackTitle() -> UILabel { + let label = UILabel() + label.textColor = .g1 + label.font = .h3 + return label + } + + func setGreyTitle() -> UILabel { + let label = UILabel() + label.textColor = .g2 + label.font = .b4 + return label + } +} + // MARK: - Layout Helpers extension ActivityRecordDetailVC { private func setUI() { view.backgroundColor = .w1 + middleScorollView.backgroundColor = .w1 + mapImageView.backgroundColor = .g3 + firstHorizontalDivideLine.backgroundColor = .g5 + secondHorizontalDivideLine.backgroundColor = .g5 + firstVerticalDivideLine.backgroundColor = .g2 + secondVerticalDivideLine.backgroundColor = .g2 + } + + private func setNavigationBar() { + view.addSubview(navibar) + view.addSubview(moreButton) + + navibar.snp.makeConstraints { make in + make.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.height.equalTo(48) + } + + moreButton.snp.makeConstraints { make in + make.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(16) + make.centerY.equalTo(navibar) + } } private func setLayout() { + view.addSubviews(middleScorollView) + + middleScorollView.snp.makeConstraints { make in + make.top.equalTo(navibar.snp.bottom) + make.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.bottom.equalToSuperview() + } + + middleScorollView.addSubviews(mapImageView, courseTitleLabel, firstHorizontalDivideLine, recordInfoStackView, secondHorizontalDivideLine) + + mapImageView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.height.equalTo(middleScorollView.snp.width).multipliedBy(1.13) + } + courseTitleLabel.snp.makeConstraints { make in + make.top.equalTo(mapImageView.snp.bottom).offset(31) + make.leading.equalTo(view.safeAreaLayoutGuide).offset(16) + } + + firstHorizontalDivideLine.snp.makeConstraints { make in + make.leading.trailing.equalTo(view.safeAreaLayoutGuide).inset(16) + make.height.equalTo(2) + make.top.equalTo(courseTitleLabel.snp.bottom).offset(7) + } + + recordInfoStackView.snp.makeConstraints { make in + make.top.equalTo(firstHorizontalDivideLine.snp.bottom).offset(20) + make.leading.trailing.equalToSuperview().inset(16) + } + + firstVerticalDivideLine.snp.makeConstraints { make in + make.width.equalTo(1) + } + + secondVerticalDivideLine.snp.makeConstraints { make in + make.width.equalTo(1) + } + + secondHorizontalDivideLine.snp.makeConstraints { make in + make.leading.trailing.equalTo(view.safeAreaLayoutGuide) + make.height.equalTo(7) + make.top.equalTo(recordInfoStackView.snp.bottom).offset(36) + } + + setRecordSubInfoStackView() + } + + private func setRecordSubInfoStackView() { + middleScorollView.addSubview(recordSubInfoStackView) + + let screenWidth = UIScreen.main.bounds.width + let containerViewWidth = screenWidth - 32 + let stackViewWidth = Int(containerViewWidth - 2) / 3 + + recordDistanceStackView.snp.makeConstraints { make in + make.width.equalTo(stackViewWidth) + } + + recordRunningTimeStackView.snp.makeConstraints { make in + make.width.equalTo(stackViewWidth) + } + + recordAveragePaceStackView.snp.makeConstraints { make in + make.width.equalTo(stackViewWidth) + } + + recordSubInfoStackView.snp.makeConstraints { make in + make.top.equalTo(secondHorizontalDivideLine.snp.bottom).offset(23) + make.centerX.equalToSuperview() + } + } +} + +// MARK: - Network + +extension ActivityRecordDetailVC { + func getActivityRecordDetailWithPath() { + LoadingIndicator.showLoading() + recordProvider.request(.getActivityRecordInfo) { [weak self] response in + LoadingIndicator.hideLoading() + guard let self = self else { return } + switch response { + case .success(let result): + let status = result.statusCode + if 200..<300 ~= status { + do { + let responseDto = try result.map(BaseResponse.self) + guard let data = responseDto.data else { return } + //self.setData(activityRecordList: data.records) + } catch { + print(error.localizedDescription) + } + } + if status >= 400 { + print("400 error") + self.showNetworkFailureToast() + } + case .failure(let error): + print(error.localizedDescription) + self.showNetworkFailureToast() + } + } } } diff --git a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift index 7e987431..0501a3f2 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/MyPage/VC/InfoVC/ActivityRecordInfoVC.swift @@ -194,7 +194,19 @@ extension ActivityRecordInfoVC: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { guard tableView.cellForRow(at: indexPath) is ActivityRecordInfoTVC else { return } guard let selectedRecords = tableView.indexPathsForSelectedRows else { return } - editButtonToggle(selectedRecords: selectedRecords, indexPath: indexPath) + let activityRecordList = activityRecordList[indexPath.item] + //ActivityRecordDetailVC.setCourseId(courseId: <#T##Int?#>, publicCourseId: <#T##Int?#>) + + if isEditMode { + self.deleteRecordButton.isEnabled = true + let countSelectedRows = selectedRecords.count + self.deleteRecordButton.setTitle(title: "삭제하기(\(countSelectedRows))") + } else { + tableView.deselectRow(at: indexPath, animated: true) + self.deleteRecordButton.setTitle(title: "삭제하기") + // 편집 모드가 아닐 때 상세 페이지로 이동 + + } } func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { @@ -203,19 +215,14 @@ extension ActivityRecordInfoVC: UITableViewDelegate { self.deleteRecordButton.isEnabled = false self.deleteRecordButton.setTitle(title: "삭제하기") return } - editButtonToggle(selectedRecords: selectedRecords, indexPath: indexPath) - } - - func editButtonToggle(selectedRecords: [IndexPath], indexPath: IndexPath) { if isEditMode { self.deleteRecordButton.isEnabled = true let countSelectedRows = selectedRecords.count self.deleteRecordButton.setTitle(title: "삭제하기(\(countSelectedRows))") } else { - self.activityRecordTableView.deselectRow(at: indexPath, animated: true) + tableView.deselectRow(at: indexPath, animated: true) self.deleteRecordButton.setTitle(title: "삭제하기") - } - } + } } } // MARK: - UITableViewDataSource