From 4226bcd7419167ff9b961cfda170de3dd7c0ac91 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Mon, 10 Jul 2023 20:37:18 +0900 Subject: [PATCH 001/153] [Feat] #31 - flow partially completed --- .../OptionsCollectionView.swift | 21 +++++++++ .../OptionsCollectionViewCell.swift | 43 +++++++++++++------ .../WriteReviewViewController.swift | 22 ++++++++-- 3 files changed, 69 insertions(+), 17 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift index 23bb5a2d..b921572f 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift @@ -43,4 +43,25 @@ final class OptionsCollectionView: UICollectionView { } } + // MARK: - Custom Method + + private func resetCellsAreSelected() { + self.indexPathsForVisibleItems.forEach { indexPath in + guard let cell = cellForItem(at: indexPath) as? OptionsCollectionViewCell + else { return } + cell.configureCell(to: .deselected) + } + } + + func toggleIsEnabled(_ isLikeSelected: Bool) { + self.indexPathsForVisibleItems.forEach { indexPath in + guard let cell = cellForItem(at: indexPath) as? OptionsCollectionViewCell + else { return } +// cell.isSelected = false + cell.configureCell(to: isLikeSelected ? .deselected : .disabled) + } + self.isUserInteractionEnabled = isLikeSelected +// self.resetCellsAreSelected() + } + } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift index 5ee77735..cc2a2623 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift @@ -36,7 +36,11 @@ final class OptionsCollectionViewCell: UICollectionViewCell { } } - private var status: CellStatus = .deselected + private var status: CellStatus = .deselected { + didSet { + setUI() + } + } private var cellText: String = "" override var isSelected: Bool { @@ -44,7 +48,8 @@ final class OptionsCollectionViewCell: UICollectionViewCell { toggleCellSelection() } } - var isEnabled: Bool = false { + + var isEnabled: Bool = true { didSet { toggleCellInteraction() } @@ -52,7 +57,7 @@ final class OptionsCollectionViewCell: UICollectionViewCell { // MARK: - UI Property - let cellLabel = UILabel() + private let cellLabel = UILabel() // MARK: - Life Cycle @@ -73,47 +78,57 @@ final class OptionsCollectionViewCell: UICollectionViewCell { private func setLayout() { addSubview(cellLabel) cellLabel.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(12) - $0.verticalEdges.equalToSuperview().inset(8) + $0.horizontalEdges.equalToSuperview().inset(16) + $0.verticalEdges.equalToSuperview().inset(10) $0.height.equalTo(17) } } private func setUI() { self.do { - $0.makeCornerRound(radius: 16.5) + $0.makeCornerRound(radius: 18.5) + $0.makeBorder(width: 1.5, color: cellBorderColor) } cellLabel.do { $0.text = cellText $0.font = .captionB1 + $0.textColor = cellTextColor $0.textAlignment = .center } - - configureCell(to: status) } // MARK: - Custom Method func configureCell(to status: CellStatus) { self.status = status - self.do { $0.makeBorder(width: 1.5, color: cellBorderColor) } - cellLabel.do { $0.textColor = cellTextColor } + + self.do { + $0.makeBorder(width: 1.5, color: cellBorderColor) + } + + cellLabel.do { + $0.textColor = cellTextColor + } } func configureCellText(to text: String) { - self.cellLabel.text = text + cellText = text + cellLabel.do { + $0.text = text + } } func toggleCellSelection() { self.status = isSelected ? .selected : .deselected - configureCell(to: self.status) +// configureCell(to: self.status) } func toggleCellInteraction() { - self.isUserInteractionEnabled.toggle() self.status = isEnabled ? .deselected : .disabled - configureCell(to: status) + self.isUserInteractionEnabled = isEnabled ? true : false +// self.isUserInteractionEnabled.toggle() +// configureCell(to: status) } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 0e2a9c1a..69ffafb6 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -116,6 +116,7 @@ final class WriteReviewViewController: BaseViewController { optionsCollectionView.do { $0.allowsMultipleSelection = true + $0.isUserInteractionEnabled = false } aboutReviewLabel.do { @@ -151,7 +152,24 @@ final class WriteReviewViewController: BaseViewController { // MARK: - UICollectionViewDelegate extension -extension WriteReviewViewController: UICollectionViewDelegate {} +extension WriteReviewViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + switch collectionView { + case likeCollectionView: + print("likeCollectionView Cell Tapped") + guard let isLikeSelected = collectionView.cellForItem(at: [0, 0])?.isSelected + else { return } + optionsCollectionView.toggleIsEnabled(isLikeSelected) + print(optionsCollectionView.isUserInteractionEnabled) + case optionsCollectionView: + print("optionsCollectionview Cell Tapped") + default: + print("cell selection failed") + } + } + +} // MARK: - UICollectionViewDataSource extension @@ -166,7 +184,6 @@ extension WriteReviewViewController: UICollectionViewDataSource { } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: OptionsCollectionViewCell.identifier, for: indexPath) as? OptionsCollectionViewCell else { return UICollectionViewCell() } @@ -178,7 +195,6 @@ extension WriteReviewViewController: UICollectionViewDataSource { let keywordList = KeywordList.Keyword.allCases.map { $0.rawValue } cell.configureCell(to: .disabled) cell.configureCellText(to: keywordList[indexPath.item]) - cell.isUserInteractionEnabled = false default: return UICollectionViewCell() } return cell From b75c5e9cc5d1bb8a11e5c92450a8f4c4526ac659 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Mon, 10 Jul 2023 21:15:47 +0900 Subject: [PATCH 002/153] =?UTF-8?q?[Fix]=20#17=20-=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95=5F=EC=A7=84=EC=A7=9C=20?= =?UTF-8?q?=EC=B5=9C=EC=A2=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit splash image, title icon 추가 --- .../Global/Extensions/Design/UIImage+.swift | 4 ++++ .../Contents.json | 6 +++--- .../ic_splash_title@1x.png} | Bin .../ic_splash_title@2x.png} | Bin .../ic_splash_title@3x.png} | Bin 5 files changed, 7 insertions(+), 3 deletions(-) rename GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/{ic_title.imageset => ic_splash_title.imageset}/Contents.json (66%) rename GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/{ic_title.imageset/ic_title@1x.png => ic_splash_title.imageset/ic_splash_title@1x.png} (100%) rename GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/{ic_title.imageset/ic_title@2x.png => ic_splash_title.imageset/ic_splash_title@2x.png} (100%) rename GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/{ic_title.imageset/ic_title@3x.png => ic_splash_title.imageset/ic_splash_title@3x.png} (100%) diff --git a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift index 8410b65c..e82ccbb0 100644 --- a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift @@ -74,6 +74,10 @@ extension UIImage { static let kakaoLoginButton = UIImage(named: "kakao_login_button_56px")!.withRenderingMode(.alwaysOriginal) static let naverLoginButton = UIImage(named: "naver_login_button_56px")!.withRenderingMode(.alwaysOriginal) + // Splash + static let splashImageIcon = UIImage(named: "ic_splash_image")!.withRenderingMode(.alwaysOriginal) + static let splashTitleIcon = UIImage(named: "ic_splash_title")!.withRenderingMode(.alwaysOriginal) + // TabBar static let disabledHomeIcon = UIImage(named: "ic_home_disable")!.withRenderingMode(.alwaysOriginal) static let disabledMypageIcon = UIImage(named: "ic_mypage_disable")!.withRenderingMode(.alwaysOriginal) diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/Contents.json similarity index 66% rename from GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/Contents.json rename to GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/Contents.json index 93c2f913..20140f46 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "ic_title@1x.png", + "filename" : "ic_splash_title@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "ic_title@2x.png", + "filename" : "ic_splash_title@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "ic_title@3x.png", + "filename" : "ic_splash_title@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@1x.png similarity index 100% rename from GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@1x.png rename to GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@1x.png diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@2x.png similarity index 100% rename from GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@2x.png rename to GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@2x.png diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@3x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@3x.png similarity index 100% rename from GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@3x.png rename to GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@3x.png From 6614293c4a2ae68d36684faed0a8bde1cdc206f7 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Mon, 10 Jul 2023 23:14:13 +0900 Subject: [PATCH 003/153] [Feat] #31 - write review flow in progress --- .../OptionsCollectionView.swift | 21 +++++------- .../OptionsCollectionViewCell.swift | 34 ++++++++----------- .../OptionsCollectionViewHeader.swift | 20 ++++------- .../WriteReviewViewController.swift | 27 +++++++++------ 4 files changed, 46 insertions(+), 56 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift index b921572f..34c42080 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift @@ -46,22 +46,19 @@ final class OptionsCollectionView: UICollectionView { // MARK: - Custom Method private func resetCellsAreSelected() { - self.indexPathsForVisibleItems.forEach { indexPath in - guard let cell = cellForItem(at: indexPath) as? OptionsCollectionViewCell - else { return } - cell.configureCell(to: .deselected) - } + self.indexPathsForSelectedItems?.forEach({ indexPath in + self.deselectItem(at: indexPath, animated: false) + }) } - func toggleIsEnabled(_ isLikeSelected: Bool) { - self.indexPathsForVisibleItems.forEach { indexPath in - guard let cell = cellForItem(at: indexPath) as? OptionsCollectionViewCell + func toggleIsEnabled(to isLikeSelected: Bool) { + self.isUserInteractionEnabled = isLikeSelected + self.resetCellsAreSelected() + self.visibleCells.forEach { cell in + guard let optionCell = cell as? OptionsCollectionViewCell else { return } -// cell.isSelected = false - cell.configureCell(to: isLikeSelected ? .deselected : .disabled) + optionCell.configureCell(to: isLikeSelected ? .deselected : .disabled) } - self.isUserInteractionEnabled = isLikeSelected -// self.resetCellsAreSelected() } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift index cc2a2623..13031e7c 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift @@ -36,24 +36,17 @@ final class OptionsCollectionViewCell: UICollectionViewCell { } } - private var status: CellStatus = .deselected { - didSet { - setUI() - } - } + private var status: CellStatus = .deselected + private var cellText: String = "" override var isSelected: Bool { - didSet { - toggleCellSelection() + willSet { + configureCell(to: newValue ? .selected : .deselected ) } } - var isEnabled: Bool = true { - didSet { - toggleCellInteraction() - } - } + var isEnabled: Bool = true // MARK: - UI Property @@ -113,22 +106,23 @@ final class OptionsCollectionViewCell: UICollectionViewCell { } func configureCellText(to text: String) { - cellText = text + self.cellText = text + cellLabel.do { $0.text = text } } - func toggleCellSelection() { - self.status = isSelected ? .selected : .deselected +// func toggleCellSelection() { +// self.status = isSelected ? .selected : .deselected // configureCell(to: self.status) - } +// } - func toggleCellInteraction() { - self.status = isEnabled ? .deselected : .disabled - self.isUserInteractionEnabled = isEnabled ? true : false +// func toggleCellInteraction() { +// self.status = isEnabled ? .deselected : .disabled +// self.isUserInteractionEnabled = isEnabled ? true : false // self.isUserInteractionEnabled.toggle() // configureCell(to: status) - } +// } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift index 263051f2..35178c31 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift @@ -12,14 +12,6 @@ import Then final class OptionsCollectionViewHeader: UICollectionReusableView { - // MARK: - Property - - var isEnabled: Bool = false { - didSet { - toggleTitleInterface() - } - } - // MARK: - UI Property private let titleLabel = UILabel() @@ -57,13 +49,15 @@ final class OptionsCollectionViewHeader: UICollectionReusableView { // MARK: - Custom Method - func configureTitle(to title: String) { - titleLabel.text = title + func configureHeaderTitle(to title: String) { + titleLabel.do { + $0.text = title + } } - - func toggleTitleInterface() { + + func configureHeaderColor(to color: UIColor) { titleLabel.do { - $0.textColor = isEnabled ? .black : .gbbGray300 + $0.textColor = color } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 69ffafb6..e8e889ad 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -157,15 +157,16 @@ extension WriteReviewViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { switch collectionView { case likeCollectionView: - print("likeCollectionView Cell Tapped") guard let isLikeSelected = collectionView.cellForItem(at: [0, 0])?.isSelected else { return } - optionsCollectionView.toggleIsEnabled(isLikeSelected) - print(optionsCollectionView.isUserInteractionEnabled) +// optionsCollectionView.isUserInteractionEnabled = isLikeSelected + optionsCollectionView.toggleIsEnabled(to: isLikeSelected) +// optionsCollectionView.supplementaryView(forElementKind: <#T##String#>, at: <#T##IndexPath#>) + print("test") case optionsCollectionView: - print("optionsCollectionview Cell Tapped") + print("test1") default: - print("cell selection failed") + return } } @@ -190,26 +191,30 @@ extension WriteReviewViewController: UICollectionViewDataSource { switch collectionView { case likeCollectionView: cell.configureCell(to: .deselected) - cell.configureCellText(to: indexPath.item == 0 ? "좋아요" : "별로에요") + cell.configureCellText(to: indexPath.item == 0 ? "좋아요" : "별로예요") case optionsCollectionView: let keywordList = KeywordList.Keyword.allCases.map { $0.rawValue } cell.configureCell(to: .disabled) cell.configureCellText(to: keywordList[indexPath.item]) - default: return UICollectionViewCell() + default: + return UICollectionViewCell() } return cell } func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: OptionsCollectionViewHeader.identifier, for: indexPath) as? OptionsCollectionViewHeader + guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, + withReuseIdentifier: OptionsCollectionViewHeader.identifier, + for: indexPath) as? OptionsCollectionViewHeader else { return UICollectionReusableView() } switch collectionView { case likeCollectionView: - header.configureTitle(to: "건빵집은 어떠셨나요?") - header.isEnabled.toggle() + header.configureHeaderTitle(to: "건빵집은 어떠셨나요?") + header.configureHeaderColor(to: .black) case optionsCollectionView: - header.configureTitle(to: "어떤것을 추천하나요?") + header.configureHeaderTitle(to: "어떤것을 추천하나요?") + header.configureHeaderColor(to: .gbbGray300!) default: return UICollectionReusableView() } From 16798159cf014cdfb12fe025d2b4249a3ae7ff4e Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Mon, 10 Jul 2023 23:47:33 +0900 Subject: [PATCH 004/153] =?UTF-8?q?[Fix]=20#17=20-=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95=5F=EC=A7=84=EC=A7=9C?= =?UTF-8?q?=EC=A7=84=EC=A7=9C=20=EC=B5=9C=EC=A2=85=5F=EC=9D=B4=EA=B2=8C=20?= =?UTF-8?q?=EC=B5=9C=EC=A2=85=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit splash image와 title을 launchscreen으로 묶고 icons 폴더로 옮겼습니다 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 +-- .../Global/Extensions/Design/UIImage+.swift | 5 +--- .../ic_launchscreen.imageset}/Contents.json | 6 ++--- .../ic_launchscreen@1x.png | Bin 0 -> 4835 bytes .../ic_launchscreen@2x.png | Bin 0 -> 9624 bytes .../ic_launchscreen@3x.png | Bin 0 -> 14682 bytes .../Assets.xcassets/splash/Contents.json | 6 ----- .../ic_splash_image@1x.png | Bin 3587 -> 0 bytes .../ic_splash_image@2x.png | Bin 7222 -> 0 bytes .../ic_splash_image@3x.png | Bin 10758 -> 0 bytes .../ic_splash_title.imageset/Contents.json | 23 ------------------ .../ic_splash_title@1x.png | Bin 1396 -> 0 bytes .../ic_splash_title@2x.png | Bin 2407 -> 0 bytes .../ic_splash_title@3x.png | Bin 3788 -> 0 bytes .../Base.lproj/LaunchScreen.storyboard | 20 ++++++++++----- 15 files changed, 20 insertions(+), 44 deletions(-) rename GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/{splash/ic_splash_image.imageset => icons/ic_launchscreen.imageset}/Contents.json (66%) create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@1x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@2x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@3x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@3x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/Contents.json delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_title.imageset/ic_splash_title@3x.png diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 29906ab5..2db26971 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -753,7 +753,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "GEON-PPANG-iOS/Resource/Info.plist"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( @@ -782,7 +782,7 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "GEON-PPANG-iOS/Resource/Info.plist"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen.storyboard; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift index e82ccbb0..772b94d9 100644 --- a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift @@ -44,6 +44,7 @@ extension UIImage { static let deleteIcon = UIImage(named: "ic_delete")!.withRenderingMode(.alwaysOriginal) static let dotdotdotIcon = UIImage(named: "ic_dotdotdot")!.withRenderingMode(.alwaysOriginal) static let hideIcon = UIImage(named: "ic_hide")!.withRenderingMode(.alwaysOriginal) + static let launchscreenIcon = UIImage(named: "ic_launchscreen")!.withRenderingMode(.alwaysOriginal) static let linkIcon = UIImage(named: "ic_link")!.withRenderingMode(.alwaysOriginal) static let listIcon = UIImage(named: "ic_link")!.withRenderingMode(.alwaysOriginal) // 건빵집 리스트 옆에 얘 써야 됨, 탭바의 storelist 아님! static let logoIcon16px = UIImage(named: "ic_logo_16px")!.withRenderingMode(.alwaysOriginal) @@ -74,10 +75,6 @@ extension UIImage { static let kakaoLoginButton = UIImage(named: "kakao_login_button_56px")!.withRenderingMode(.alwaysOriginal) static let naverLoginButton = UIImage(named: "naver_login_button_56px")!.withRenderingMode(.alwaysOriginal) - // Splash - static let splashImageIcon = UIImage(named: "ic_splash_image")!.withRenderingMode(.alwaysOriginal) - static let splashTitleIcon = UIImage(named: "ic_splash_title")!.withRenderingMode(.alwaysOriginal) - // TabBar static let disabledHomeIcon = UIImage(named: "ic_home_disable")!.withRenderingMode(.alwaysOriginal) static let disabledMypageIcon = UIImage(named: "ic_mypage_disable")!.withRenderingMode(.alwaysOriginal) diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/Contents.json similarity index 66% rename from GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/Contents.json rename to GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/Contents.json index 64226422..4ed22a14 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "ic_splash_image@1x.png", + "filename" : "ic_launchscreen@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "ic_splash_image@2x.png", + "filename" : "ic_launchscreen@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "ic_splash_image@3x.png", + "filename" : "ic_launchscreen@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f66f6c3807c6b5d1e25083bad8eacf8408c6b9c0 GIT binary patch literal 4835 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 JPDHLkV1jd@N|gWr literal 0 HcmV?d00001 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..24220bd0ace9c32983067e56f8132c018374434f GIT binary patch literal 9624 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 literal 0 HcmV?d00001 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@1x.png deleted file mode 100644 index ce2b83215a8756700246089e885dc84ae8c4bf36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3587 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 JPDHLkV1gjV&Y}PS diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@2x.png deleted file mode 100644 index af27a0821f30abd1ba9c3c23c02bb4a74c0e7542..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7222 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@3x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@3x.png deleted file mode 100644 index b6b38b6c987911e356e630b6357286593dcf492e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10758 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 diff --git a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard index 865e9329..63550b45 100644 --- a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard +++ b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,10 @@ - - + + + - + + + @@ -11,15 +14,20 @@ - + - + - + + + + + + From 2699bfb34c3cf3987464dd32fd1db024f1b9d542 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Tue, 11 Jul 2023 00:23:03 +0900 Subject: [PATCH 005/153] =?UTF-8?q?[Feat]=20#32=20-=20Launch=20Screen=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 --- GEON-PPANG-iOS/Application/AppDelegate.swift | 2 ++ .../Base.lproj/LaunchScreen.storyboard | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Application/AppDelegate.swift b/GEON-PPANG-iOS/Application/AppDelegate.swift index ee1b7f9b..75b75c94 100644 --- a/GEON-PPANG-iOS/Application/AppDelegate.swift +++ b/GEON-PPANG-iOS/Application/AppDelegate.swift @@ -16,6 +16,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() + sleep(1) + return true } diff --git a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard index 63550b45..d90db0a0 100644 --- a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard +++ b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard @@ -16,16 +16,30 @@ + + + + + + + + + + + + + - + + From 0c91a860cf02f5c9ef40ac7e464b39a2491c652b Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 00:53:31 +0900 Subject: [PATCH 006/153] [Feat] #31 - writeReview flow completed --- .../OptionsCollectionViewFlowLayout.swift | 2 +- .../OptionsCollectionViewHeader.swift | 2 +- .../View/ReviewDetailTextView.swift | 52 +++++++----- .../WriteReviewViewController.swift | 81 +++++++++++-------- 4 files changed, 80 insertions(+), 57 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift index 4f3d7aaa..b92f4deb 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift @@ -13,7 +13,7 @@ class OptionsCollectionViewFlowLayout: UICollectionViewFlowLayout { super.init() self.estimatedItemSize = UICollectionViewFlowLayout.automaticSize self.minimumLineSpacing = 12.0 - self.sectionInset = UIEdgeInsets(top: 18.0, left: 0.0, bottom: 0.0, right: 0.0) + self.sectionInset = .zero } required init?(coder: NSCoder) { diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift index 35178c31..25fe968d 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift @@ -54,7 +54,7 @@ final class OptionsCollectionViewHeader: UICollectionReusableView { $0.text = title } } - + func configureHeaderColor(to color: UIColor) { titleLabel.do { $0.textColor = color diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift index 498f9b8d..0a850ec2 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift @@ -11,16 +11,33 @@ final class ReviewDetailTextView: UIView { // MARK: - Property - var isLike: Bool = true { - didSet { - togglePlaceholderWithIsLike() + enum TextViewStatus { + case deactivated + case activated + case error + } + + private var borderColor: UIColor { + switch status { + case .deactivated: return .gbbGray300! + case .activated: return .gbbGray500! + case .error: return .gbbError! } } - var isEnabled: Bool = false { - didSet { - toggleInteraction() - toggleUI() + private var textColor: UIColor { + switch status { + case .deactivated: return .gbbGray300! + case .activated: return .gbbGray700! + case .error: return .gbbError! + } + } + + private var status: TextViewStatus = .deactivated + + var isLike: Bool = true { + willSet { + configurePlaceholder(with: newValue) } } @@ -93,25 +110,16 @@ final class ReviewDetailTextView: UIView { // MARK: - Custom Method - private func toggleInteraction() { - detailTextView.isUserInteractionEnabled.toggle() - } - - private func toggleUI() { - detailTextView.do { - $0.textColor = isEnabled ? .gbbGray500 : .gbbGray300 - } - - textLimitLabel.do { - $0.textColor = isEnabled ? .gbbGray500 : .gbbGray300 - } + func configureTextView(to status: TextViewStatus) { + self.status = status - textMinimumLimitLabel.do { - $0.textColor = isEnabled ? .gbbGray500 : .gbbGray300 + detailTextView.do { + $0.textColor = textColor + $0.makeBorder(width: 1, color: borderColor) } } - private func togglePlaceholderWithIsLike() { + func configurePlaceholder(with isLike: Bool) { detailTextView.do { $0.text = isLike ? I18N.likePlaceholder : I18N.dislikePlaceholder } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index e8e889ad..9e117e7b 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -26,7 +26,9 @@ final class WriteReviewViewController: BaseViewController { private let lineView = LineView() private let likeCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() private let optionsCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() + private let likeCollectionViewHeaderLabel = UILabel() private lazy var likeCollectionView = OptionsCollectionView(frame: .zero, collectionViewLayout: likeCollectionViewFlowLayout) + private let optionsCollectionViewHeaderLabel = UILabel() private lazy var optionsCollectionView = OptionsCollectionView(frame: .zero, collectionViewLayout: optionsCollectionViewFlowLayout) private let reviewDetailTextView = ReviewDetailTextView() private let aboutReviewLabel = UILabel() @@ -76,16 +78,30 @@ final class WriteReviewViewController: BaseViewController { $0.height.equalTo(1) } + contentView.addSubview(likeCollectionViewHeaderLabel) + likeCollectionViewHeaderLabel.snp.makeConstraints { + $0.top.equalTo(lineView.snp.bottom).offset(24) + $0.horizontalEdges.equalToSuperview().inset(24) + $0.height.equalTo(22) + } + contentView.addSubview(likeCollectionView) likeCollectionView.snp.makeConstraints { - $0.top.equalTo(lineView.snp.bottom).offset(24) + $0.top.equalTo(likeCollectionViewHeaderLabel.snp.bottom).offset(18) $0.horizontalEdges.equalToSuperview().inset(24) $0.height.equalTo(73) } + contentView.addSubview(optionsCollectionViewHeaderLabel) + optionsCollectionViewHeaderLabel.snp.makeConstraints { + $0.top.equalTo(likeCollectionView.snp.bottom).offset(28) + $0.horizontalEdges.equalToSuperview().inset(24) + $0.height.equalTo(22) + } + contentView.addSubview(optionsCollectionView) optionsCollectionView.snp.makeConstraints { - $0.top.equalTo(likeCollectionView.snp.bottom).offset(28) + $0.top.equalTo(optionsCollectionViewHeaderLabel.snp.bottom).offset(18) $0.horizontalEdges.equalToSuperview().inset(24) $0.height.equalTo(50) } @@ -114,6 +130,18 @@ final class WriteReviewViewController: BaseViewController { $0.estimatedItemSize = UICollectionViewFlowLayout.automaticSize } + likeCollectionViewHeaderLabel.do { + $0.text = "건빵집은 어떠셨나요?" + $0.font = .bodyB1 + $0.textColor = .black + } + + optionsCollectionViewHeaderLabel.do { + $0.text = "어떤것을 추천하나요?" + $0.font = .bodyB1 + $0.textColor = .gbbGray300 + } + optionsCollectionView.do { $0.allowsMultipleSelection = true $0.isUserInteractionEnabled = false @@ -148,6 +176,12 @@ final class WriteReviewViewController: BaseViewController { } } + private func configureCollectionViewHeader(to color: UIColor) { + optionsCollectionViewHeaderLabel.do { + $0.textColor = color + } + } + } // MARK: - UICollectionViewDelegate extension @@ -159,12 +193,18 @@ extension WriteReviewViewController: UICollectionViewDelegate { case likeCollectionView: guard let isLikeSelected = collectionView.cellForItem(at: [0, 0])?.isSelected else { return } -// optionsCollectionView.isUserInteractionEnabled = isLikeSelected + optionsCollectionView.toggleIsEnabled(to: isLikeSelected) -// optionsCollectionView.supplementaryView(forElementKind: <#T##String#>, at: <#T##IndexPath#>) - print("test") + configureCollectionViewHeader(to: isLikeSelected ? .black : .gbbGray300!) + + reviewDetailTextView.isLike = isLikeSelected + reviewDetailTextView.configureTextView(to: isLikeSelected ? .deactivated : .activated) + case optionsCollectionView: - print("test1") + let hasSelection = collectionView.indexPathsForSelectedItems != nil + + reviewDetailTextView.configureTextView(to: hasSelection ? .activated : .deactivated) + default: return } @@ -202,38 +242,12 @@ extension WriteReviewViewController: UICollectionViewDataSource { return cell } - func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, - withReuseIdentifier: OptionsCollectionViewHeader.identifier, - for: indexPath) as? OptionsCollectionViewHeader - else { return UICollectionReusableView() } - - switch collectionView { - case likeCollectionView: - header.configureHeaderTitle(to: "건빵집은 어떠셨나요?") - header.configureHeaderColor(to: .black) - case optionsCollectionView: - header.configureHeaderTitle(to: "어떤것을 추천하나요?") - header.configureHeaderColor(to: .gbbGray300!) - default: - return UICollectionReusableView() - } - return header - } - -} - -// MARK: - UICollectionViewDelegateFlowLayout - -extension WriteReviewViewController: UICollectionViewDelegateFlowLayout { - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { - return .init(width: collectionView.frame.width, height: 22) - } } // MARK: - UITextViewDelegate extension WriteReviewViewController: UITextViewDelegate { + func textViewDidBeginEditing(_ textView: UITextView) { let textView = self.reviewDetailTextView.detailTextView if textView.text == I18N.likePlaceholder || textView.text == I18N.dislikePlaceholder { @@ -249,4 +263,5 @@ extension WriteReviewViewController: UITextViewDelegate { textView.textColor = .gbbGray300 } } + } From 945b151fe6819bf5843f4c0922f6f8c6c4b270b5 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Tue, 11 Jul 2023 01:06:36 +0900 Subject: [PATCH 007/153] =?UTF-8?q?[Fix]=20#32=20-=20Launch=20Screen=20sle?= =?UTF-8?q?ep=20=EC=8B=9C=EA=B0=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1 -> 1.5 --- GEON-PPANG-iOS/Application/AppDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Application/AppDelegate.swift b/GEON-PPANG-iOS/Application/AppDelegate.swift index 75b75c94..f57a2e57 100644 --- a/GEON-PPANG-iOS/Application/AppDelegate.swift +++ b/GEON-PPANG-iOS/Application/AppDelegate.swift @@ -16,7 +16,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() - sleep(1) + sleep(UInt32(1.5)) return true } From f8c70a048f5ec11b32b51d3a7e1a51ffb6ee8719 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 01:07:53 +0900 Subject: [PATCH 008/153] [Feat] #31 - added navigation bar --- .../WriteReviewViewController.swift | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 9e117e7b..60c01d7b 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -22,6 +22,7 @@ final class WriteReviewViewController: BaseViewController { // TODO: bakeryImage 추가 private let scrollView = UIScrollView() private let contentView = UIView() + private let navigationBar = CustomNavigationBar() private let bakeryOverviewView = BakeryOverviewView(bakeryImage: .actions, regions: ["tset", "efqerqf"]) private let lineView = LineView() private let likeCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() @@ -53,10 +54,16 @@ final class WriteReviewViewController: BaseViewController { // MARK: - Setting override func setLayout() { + view.addSubview(navigationBar) + navigationBar.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview() + $0.top.equalToSuperview() + } + view.addSubview(scrollView) scrollView.snp.makeConstraints { - $0.verticalEdges.equalToSuperview() - $0.horizontalEdges.equalToSuperview() + $0.top.equalTo(navigationBar.snp.bottom) + $0.horizontalEdges.bottom.equalToSuperview() } scrollView.addSubview(contentView) @@ -157,6 +164,8 @@ final class WriteReviewViewController: BaseViewController { } override func setDelegate() { + scrollView.delegate = self + likeCollectionView.delegate = self likeCollectionView.dataSource = self @@ -254,13 +263,18 @@ extension WriteReviewViewController: UITextViewDelegate { textView.text = nil textView.textColor = .black } + +// var textViewPoint = textView.frame.origin +// textViewPoint.y = textViewPoint.y - 5 +// scrollView.setContentOffset(textViewPoint, animated: true) + } func textViewDidEndEditing(_ textView: UITextView) { let textView = self.reviewDetailTextView.detailTextView if textView.text.isEmpty { textView.text = reviewDetailTextView.isLike ? I18N.likePlaceholder : I18N.dislikePlaceholder - textView.textColor = .gbbGray300 + textView.textColor = .black } } From 6bed13d39a1884113f00bae258c7ba1d5aea076c Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 04:26:41 +0900 Subject: [PATCH 009/153] [Move] #31 - moved common folders --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 44 +++++++++++++------ .../CustomNavigationBar.swift | 9 ++++ .../Common/{ => View}/LineView.swift | 0 3 files changed, 39 insertions(+), 14 deletions(-) rename GEON-PPANG-iOS/Presentation/Common/{ => NavigationBar}/CustomNavigationBar.swift (92%) rename GEON-PPANG-iOS/Presentation/Common/{ => View}/LineView.swift (100%) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 6db8800d..3db32a35 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -53,13 +53,13 @@ 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; 3E7869BA2A5BCD5F0087F75B /* RegionStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E7869B92A5BCD5F0087F75B /* RegionStackView.swift */; }; + 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */; }; 3E79B1AC2A5677C800D36A26 /* RegionChip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1AB2A5677C800D36A26 /* RegionChip.swift */; }; 3E79B1AE2A56F14A00D36A26 /* BakeryOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1AD2A56F14A00D36A26 /* BakeryOverviewView.swift */; }; 3E79B1B02A571B4B00D36A26 /* LineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1AF2A571B4B00D36A26 /* LineView.swift */; }; 3E79B1B22A571E1F00D36A26 /* OptionsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1B12A571E1F00D36A26 /* OptionsCollectionView.swift */; }; 3E79B1B52A571E7100D36A26 /* OptionsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1B42A571E7100D36A26 /* OptionsCollectionViewCell.swift */; }; - 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */; }; @@ -106,7 +106,6 @@ 09CA3EFB2A569E4A0063897A /* URLConstant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLConstant.swift; sourceTree = ""; }; 09CA3F052A569EB30063897A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; - 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewDTO.swift; sourceTree = ""; }; 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendationModel.swift; sourceTree = ""; }; 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikeModel.swift; sourceTree = ""; }; @@ -114,6 +113,7 @@ 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewHeader.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; 3E7869B92A5BCD5F0087F75B /* RegionStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegionStackView.swift; sourceTree = ""; }; + 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewViewController.swift; sourceTree = ""; }; 3E79B1AB2A5677C800D36A26 /* RegionChip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegionChip.swift; sourceTree = ""; }; 3E79B1AD2A56F14A00D36A26 /* BakeryOverviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryOverviewView.swift; sourceTree = ""; }; @@ -441,14 +441,6 @@ path = ViewControllers; sourceTree = ""; }; - 3E79B19B2A54523400D36A26 /* Button */ = { - isa = PBXGroup; - children = ( - 3E79B19C2A54523D00D36A26 /* BackButton.swift */, - ); - path = Button; - sourceTree = ""; - }; 3E16E4F22A57CE2B00B813D0 /* Model */ = { isa = PBXGroup; children = ( @@ -492,6 +484,30 @@ path = Model; sourceTree = ""; }; + 3E2EEF722A5C928F0093BCA9 /* View */ = { + isa = PBXGroup; + children = ( + 3E79B1AF2A571B4B00D36A26 /* LineView.swift */, + ); + path = View; + sourceTree = ""; + }; + 3E2EEF732A5C92980093BCA9 /* NavigationBar */ = { + isa = PBXGroup; + children = ( + 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */, + ); + path = NavigationBar; + sourceTree = ""; + }; + 3E79B19B2A54523400D36A26 /* Button */ = { + isa = PBXGroup; + children = ( + 3E79B19C2A54523D00D36A26 /* BackButton.swift */, + ); + path = Button; + sourceTree = ""; + }; 3E79B1A42A566F0700D36A26 /* WriteReview */ = { isa = PBXGroup; children = ( @@ -525,12 +541,12 @@ 3EA2E1E02A53E864003516A3 /* Common */ = { isa = PBXGroup; children = ( - 3E79B1AA2A5677AA00D36A26 /* Region */, + 3EA2E1E12A53E880003516A3 /* Base */, + 3E2EEF722A5C928F0093BCA9 /* View */, 093213FD2A5A74D100875EF6 /* TextField */, 3E79B19B2A54523400D36A26 /* Button */, - 3EA2E1E12A53E880003516A3 /* Base */, - 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */, - 3E79B1AF2A571B4B00D36A26 /* LineView.swift */, + 3E2EEF732A5C92980093BCA9 /* NavigationBar */, + 3E79B1AA2A5677AA00D36A26 /* Region */, ); path = Common; sourceTree = ""; diff --git a/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift b/GEON-PPANG-iOS/Presentation/Common/NavigationBar/CustomNavigationBar.swift similarity index 92% rename from GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift rename to GEON-PPANG-iOS/Presentation/Common/NavigationBar/CustomNavigationBar.swift index 79add66d..f47027a9 100644 --- a/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift +++ b/GEON-PPANG-iOS/Presentation/Common/NavigationBar/CustomNavigationBar.swift @@ -110,4 +110,13 @@ final class CustomNavigationBar: UIView { } } + func configureBottomLine() { + let bottomLine = LineView() + addSubview(bottomLine) + bottomLine.snp.makeConstraints { + $0.bottom.horizontalEdges.equalToSuperview() + $0.height.equalTo(1) + } + } + } diff --git a/GEON-PPANG-iOS/Presentation/Common/LineView.swift b/GEON-PPANG-iOS/Presentation/Common/View/LineView.swift similarity index 100% rename from GEON-PPANG-iOS/Presentation/Common/LineView.swift rename to GEON-PPANG-iOS/Presentation/Common/View/LineView.swift From bf2a601d2f497a13f8e8a01ee71518b5129f5952 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 05:37:29 +0900 Subject: [PATCH 010/153] [Feat] #31 - keyboard show hide move functions added --- .../Extensions/UI/UIViewController+.swift | 26 ++++++++++++++++++- .../Presentation/Common/View/BottomView.swift | 8 ++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift index 40ff2d6d..e72b6fcc 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift @@ -38,7 +38,31 @@ extension UIViewController { view.addGestureRecognizer(tap) } - @objc func dismissKeyboard() { + func setKeyboardNotificationCenter() { + NotificationCenter.default.addObserver(self, selector: #selector(moveUpAboutKeyboard), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(moveDownAboutKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil) + } + + // MARK: - objc functions + + @objc + func dismissKeyboard() { view.endEditing(true) } + + @objc + func moveUpAboutKeyboard(_ notification: NSNotification) { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { + UIView.animate(withDuration: 0.2, animations: { + self.view.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height + 24) + }) + } + } + + @objc + func moveDownAboutKeyboard(_ notification: NSNotification) { + UIView.animate(withDuration: 0.2, animations: { + self.view.transform = .identity + }) + } } diff --git a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift new file mode 100644 index 00000000..43b64b88 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift @@ -0,0 +1,8 @@ +// +// BottomView.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/11. +// + +import Foundation From 9436288baa35cb15544a81e377fe9c1da0376227 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 05:37:48 +0900 Subject: [PATCH 011/153] [Feat] #31 - bottomView added --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 ++ .../Presentation/Common/View/BottomView.swift | 48 ++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 3db32a35..20f51a85 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -52,6 +52,7 @@ 3E16E4FE2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */; }; 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; + 3E2EEF752A5C93010093BCA9 /* BottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E2EEF742A5C93010093BCA9 /* BottomView.swift */; }; 3E7869BA2A5BCD5F0087F75B /* RegionStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E7869B92A5BCD5F0087F75B /* RegionStackView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */; }; @@ -112,6 +113,7 @@ 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewFlowLayout.swift; sourceTree = ""; }; 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewHeader.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; + 3E2EEF742A5C93010093BCA9 /* BottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomView.swift; sourceTree = ""; }; 3E7869B92A5BCD5F0087F75B /* RegionStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegionStackView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewViewController.swift; sourceTree = ""; }; @@ -488,6 +490,7 @@ isa = PBXGroup; children = ( 3E79B1AF2A571B4B00D36A26 /* LineView.swift */, + 3E2EEF742A5C93010093BCA9 /* BottomView.swift */, ); path = View; sourceTree = ""; @@ -723,6 +726,7 @@ 090556492A51E7EC00752067 /* UIScreen+.swift in Sources */, 09B71C022A59D99200076AC2 /* SearchTextField.swift in Sources */, 09B13F482A5931DC00C0C723 /* TabBarController.swift in Sources */, + 3E2EEF752A5C93010093BCA9 /* BottomView.swift in Sources */, 0961C3642A501EBF0031A822 /* Strings.swift in Sources */, 093214082A5AE40900875EF6 /* SearchViewController.swift in Sources */, 09B13F542A593CD300C0C723 /* MyPageViewController.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift index 43b64b88..024f3cc0 100644 --- a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift @@ -5,4 +5,50 @@ // Created by 이성민 on 2023/07/11. // -import Foundation +import UIKit + +import SnapKit +import Then + +final class BottomView: UIView { + + // MARK: - Life Cycle + +// override init(frame: CGRect) { +// super.init(frame: frame) +// +// setShadow() +// } +// +// @available(*, unavailable) +// required init?(coder: NSCoder) { +// fatalError("init(coder:) has not been implemented") +// } +// +// // MARK: - Setting +// + private func setShadow() { + self.layer.applyShadow(color: .init(red: 0, green: 0, blue: 0, alpha: 0.1), + alpha: 1, + x: 0, + y: 1, + blur: 10) + } + override func layoutSubviews() { + super.layoutSubviews() + + setShadow() + } + + // MARK: - Custom Method + + func applyAdditionalSubview(_ view: UIView, withTrailingOffset offset: CGFloat = 24) { + addSubview(view) + view.snp.makeConstraints { + $0.leading.equalToSuperview().inset(24) + $0.trailing.equalToSuperview().inset(offset) + $0.top.equalToSuperview().inset(offset) + } + } + +} From fdf8eacd1a6862a58267d2d6335a0f7ef518210c Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 05:38:23 +0900 Subject: [PATCH 012/153] [Feat] #31 - complete except shadow --- .../View/ReviewDetailTextView.swift | 4 +- .../WriteReviewViewController.swift | 64 ++++++++++++++++--- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift index 0a850ec2..14508c7d 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift @@ -98,13 +98,13 @@ final class ReviewDetailTextView: UIView { textLimitLabel.do { $0.text = "0/500" $0.font = .captionM1 - $0.textColor = .gbbGray300 + $0.textColor = .gbbGray500 } textMinimumLimitLabel.do { $0.text = "(최소 10자)" $0.font = .captionM1 - $0.textColor = .gbbGray300 + $0.textColor = .gbbGray500 } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 60c01d7b..6ae74cc4 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -18,7 +18,6 @@ final class WriteReviewViewController: BaseViewController { // MARK: - UI Property - // TODO: navigationBar 추가 // TODO: bakeryImage 추가 private let scrollView = UIScrollView() private let contentView = UIView() @@ -32,7 +31,9 @@ final class WriteReviewViewController: BaseViewController { private let optionsCollectionViewHeaderLabel = UILabel() private lazy var optionsCollectionView = OptionsCollectionView(frame: .zero, collectionViewLayout: optionsCollectionViewFlowLayout) private let reviewDetailTextView = ReviewDetailTextView() + private let dotView = UILabel() private let aboutReviewLabel = UILabel() + private let bottomView = BottomView() // MARK: - life cycle @@ -42,6 +43,7 @@ final class WriteReviewViewController: BaseViewController { // TODO: baseVC 에 숨기기 self.navigationController?.navigationBar.isHidden = true setKeyboardHideGesture() + setKeyboardNotificationCenter() } override func viewWillLayoutSubviews() { @@ -60,10 +62,17 @@ final class WriteReviewViewController: BaseViewController { $0.top.equalToSuperview() } + view.addSubview(bottomView) + bottomView.snp.makeConstraints { + $0.horizontalEdges.bottom.equalToSuperview() + $0.height.equalTo(126) + } + view.addSubview(scrollView) scrollView.snp.makeConstraints { $0.top.equalTo(navigationBar.snp.bottom) - $0.horizontalEdges.bottom.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview().inset(126) } scrollView.addSubview(contentView) @@ -120,15 +129,27 @@ final class WriteReviewViewController: BaseViewController { $0.height.equalTo(221) } + contentView.addSubview(dotView) + dotView.snp.makeConstraints { + $0.leading.equalToSuperview().inset(24) + $0.top.equalTo(reviewDetailTextView.snp.bottom).offset(16) + } + contentView.addSubview(aboutReviewLabel) aboutReviewLabel.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(24) + $0.leading.equalTo(dotView.snp.trailing) + $0.trailing.equalToSuperview().inset(24) $0.top.equalTo(reviewDetailTextView.snp.bottom).offset(16) $0.bottom.equalToSuperview() } } override func setUI() { + navigationBar.do { + $0.configureLeftTitle(to: "건대 초코빵") + $0.configureBottomLine() + } + likeCollectionViewFlowLayout.do { $0.estimatedItemSize = UICollectionViewFlowLayout.automaticSize } @@ -154,10 +175,20 @@ final class WriteReviewViewController: BaseViewController { $0.isUserInteractionEnabled = false } + reviewDetailTextView.do { + $0.isUserInteractionEnabled = false + } + + dotView.do { + $0.text = "•" + $0.font = .captionM2 + $0.textColor = .gbbGray300 + } + aboutReviewLabel.do { $0.text = I18N.aboutReview $0.font = .captionM2 - $0.textColor = .gbbGray400 + $0.textColor = .gbbGray300 $0.textAlignment = .left $0.numberOfLines = 4 } @@ -191,6 +222,15 @@ final class WriteReviewViewController: BaseViewController { } } +// private func addShadowLayer() { +// let layer = CALayer() +// layer.shadowPath = UIBezierPath(rect: bottomView.bounds).cgPath +// layer.shadowOffset = .zero +// layer.shadowRadius = 10 +// layer.shadowColor = .init(red: 0, green: 0, blue: 0, alpha: 0.1) +// bottomView.layer.addSublayer(layer) +// } + } // MARK: - UICollectionViewDelegate extension @@ -207,11 +247,12 @@ extension WriteReviewViewController: UICollectionViewDelegate { configureCollectionViewHeader(to: isLikeSelected ? .black : .gbbGray300!) reviewDetailTextView.isLike = isLikeSelected + reviewDetailTextView.isUserInteractionEnabled = !isLikeSelected reviewDetailTextView.configureTextView(to: isLikeSelected ? .deactivated : .activated) case optionsCollectionView: let hasSelection = collectionView.indexPathsForSelectedItems != nil - + reviewDetailTextView.isUserInteractionEnabled = hasSelection reviewDetailTextView.configureTextView(to: hasSelection ? .activated : .deactivated) default: @@ -219,6 +260,14 @@ extension WriteReviewViewController: UICollectionViewDelegate { } } + func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { + guard collectionView == optionsCollectionView else { return } + if collectionView.indexPathsForSelectedItems == [] { + reviewDetailTextView.isUserInteractionEnabled = false + reviewDetailTextView.configureTextView(to: .deactivated) + } + } + } // MARK: - UICollectionViewDataSource extension @@ -263,11 +312,6 @@ extension WriteReviewViewController: UITextViewDelegate { textView.text = nil textView.textColor = .black } - -// var textViewPoint = textView.frame.origin -// textViewPoint.y = textViewPoint.y - 5 -// scrollView.setContentOffset(textViewPoint, animated: true) - } func textViewDidEndEditing(_ textView: UITextView) { From d8cc517db170521f3827522298e48e551c099dda Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 10:21:17 +0900 Subject: [PATCH 013/153] [Feat] #31 - applied line height to aboutReviewLabel --- .../Global/Extensions/UI/UILabel+.swift | 7 +++++ .../WriteReviewViewController.swift | 29 ++++++++++++++----- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/UILabel+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/UILabel+.swift index 4ee204f7..1a8f6edb 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/UILabel+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/UILabel+.swift @@ -47,6 +47,13 @@ extension UILabel { } self.attributedText = attributedString } + + func setLineHeight(by multiple: CGFloat, with text: String) { + var paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineHeightMultiple = multiple + attributedText = NSMutableAttributedString(string: text, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]) + } + } extension UILabel { diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 6ae74cc4..2ff732c7 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -32,6 +32,7 @@ final class WriteReviewViewController: BaseViewController { private lazy var optionsCollectionView = OptionsCollectionView(frame: .zero, collectionViewLayout: optionsCollectionViewFlowLayout) private let reviewDetailTextView = ReviewDetailTextView() private let dotView = UILabel() + private let aboutReviewContainerView = UIView() private let aboutReviewLabel = UILabel() private let bottomView = BottomView() @@ -129,18 +130,24 @@ final class WriteReviewViewController: BaseViewController { $0.height.equalTo(221) } - contentView.addSubview(dotView) + contentView.addSubview(aboutReviewContainerView) + aboutReviewContainerView.snp.makeConstraints { + $0.top.equalTo(reviewDetailTextView.snp.bottom).offset(10) + $0.horizontalEdges.bottom.equalToSuperview() + } + + aboutReviewContainerView.addSubview(dotView) dotView.snp.makeConstraints { $0.leading.equalToSuperview().inset(24) - $0.top.equalTo(reviewDetailTextView.snp.bottom).offset(16) + $0.top.equalTo(aboutReviewContainerView).offset(16) } - contentView.addSubview(aboutReviewLabel) + aboutReviewContainerView.addSubview(aboutReviewLabel) aboutReviewLabel.snp.makeConstraints { $0.leading.equalTo(dotView.snp.trailing) $0.trailing.equalToSuperview().inset(24) - $0.top.equalTo(reviewDetailTextView.snp.bottom).offset(16) - $0.bottom.equalToSuperview() + $0.top.equalTo(dotView) + $0.bottom.equalToSuperview().inset(34) } } @@ -179,18 +186,26 @@ final class WriteReviewViewController: BaseViewController { $0.isUserInteractionEnabled = false } + aboutReviewContainerView.do { + $0.backgroundColor = .gbbGray100 + } + dotView.do { - $0.text = "•" $0.font = .captionM2 $0.textColor = .gbbGray300 + $0.setLineHeight(by: 1.37, with: "•") } aboutReviewLabel.do { - $0.text = I18N.aboutReview $0.font = .captionM2 $0.textColor = .gbbGray300 $0.textAlignment = .left $0.numberOfLines = 4 + $0.setLineHeight(by: 1.37, with: I18N.aboutReview) + } + + bottomView.do { + $0.backgroundColor = .gbbGray300 } } From a38eeced561761046cfea3c2ace876dd3d7fb0df Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 11:15:19 +0900 Subject: [PATCH 014/153] [Feat] #31 - added navigationBarHidden func --- GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift index e72b6fcc..73688300 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift @@ -43,6 +43,10 @@ extension UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(moveDownAboutKeyboard), name: UIResponder.keyboardWillHideNotification, object: nil) } + func setNavigationBarHidden() { + self.navigationController?.navigationBar.isHidden = true + } + // MARK: - objc functions @objc From 5dea551c6c9fbdaf8459468698ec17647903bd5d Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:23:58 +0900 Subject: [PATCH 015/153] =?UTF-8?q?[Feat]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=8D=94=EB=AF=B8=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/BakeryListResponseDTO.swift | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift new file mode 100644 index 00000000..43c3a9cf --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -0,0 +1,30 @@ +// +// BakeryListResponseDTO.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/11. +// + +// MARK: - BakeryListResponseDTO +struct BakeryListResponseDTO: Hashable { + let bakeryID: Int + let bakeryName, bakeryPicture: String + let isHACCP, isVegan, isNonGMO: Bool + let breadType: BreadType + let firstNearStation, secondNearStation: String + let isBooked: Bool + let bookmarkCount: Int +} + +// MARK: - BreadType + +struct BreadType: Hashable { + let breadTypeID: Int + let breadTypeName: String + let isGlutenFree, isVegan, isNutFree, isSugarFree: Bool +} + +extension BakeryListResponseDTO { + static let item: [BakeryListResponseDTO] = [BakeryListResponseDTO(bakeryID: 1, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: false, breadType: breadItem, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7)] + static let breadItem: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: false, isNutFree: false, isSugarFree: false) +} From c8e2e65f1eaa5c6fd84e98f64824a9c0e92a0a12 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:24:18 +0900 Subject: [PATCH 016/153] =?UTF-8?q?[Feat]=20#36=20-=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/BakeryFilterItems.swift | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift new file mode 100644 index 00000000..cb28b2f2 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift @@ -0,0 +1,63 @@ +// +// BakeryFilterItems.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/11. +// + +import UIKit + +enum Status { + case on, off +} + +enum Filter { + case HARD + case DESSERT + case BRUNCH + + var title: String { + switch self { + case .HARD: + return "하드빵류" + case .DESSERT: + return "디저트류" + case .BRUNCH: + return "브런치류" + } + } +} + +struct BakeryFilterItems: Hashable { + var filter: Filter + var status: Status + var leftIcon: UIImage + static var item: [BakeryFilterItems] = [BakeryFilterItems(filter: .HARD, status: .off, leftIcon: .disabledHardIcon), + BakeryFilterItems(filter: .DESSERT, status: .off, leftIcon: .disabledCakeIcon), + BakeryFilterItems(filter: .BRUNCH, status: .off, leftIcon: .disabledSandwichIcon) + ] + + public func isSelected() -> Self { + switch self.status { + case .off: + switch self.filter { + case .HARD: + return BakeryFilterItems(filter: filter, status: status, leftIcon: .disabledHardIcon) + case .DESSERT: + return BakeryFilterItems(filter: .DESSERT, status: .off, leftIcon: .disabledCakeIcon) + case .BRUNCH: + return BakeryFilterItems(filter: .BRUNCH, status: .off, leftIcon: .disabledSandwichIcon) + } + + case .on: + switch self.filter { + case .HARD: + return BakeryFilterItems(filter: filter, status: status, leftIcon: .enabledHardIcon) + case .DESSERT: + return BakeryFilterItems(filter: .DESSERT, status: .off, leftIcon: .enabledCakeIcon) + case .BRUNCH: + return BakeryFilterItems(filter: .BRUNCH, status: .off, leftIcon: .enabledSandwichIcon) + } + } + } +} From c1b01eff4454d717b14f0c7b3bb8ddf88b9f4884 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:24:33 +0900 Subject: [PATCH 017/153] =?UTF-8?q?[Fix]=20#36=20-=20icon=20name=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift index 8410b65c..190777d0 100644 --- a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift @@ -45,7 +45,7 @@ extension UIImage { static let dotdotdotIcon = UIImage(named: "ic_dotdotdot")!.withRenderingMode(.alwaysOriginal) static let hideIcon = UIImage(named: "ic_hide")!.withRenderingMode(.alwaysOriginal) static let linkIcon = UIImage(named: "ic_link")!.withRenderingMode(.alwaysOriginal) - static let listIcon = UIImage(named: "ic_link")!.withRenderingMode(.alwaysOriginal) // 건빵집 리스트 옆에 얘 써야 됨, 탭바의 storelist 아님! + static let listIcon = UIImage(named: "ic_list")!.withRenderingMode(.alwaysOriginal) // 건빵집 리스트 옆에 얘 써야 됨, 탭바의 storelist 아님! static let logoIcon16px = UIImage(named: "ic_logo_16px")!.withRenderingMode(.alwaysOriginal) static let noticeIcon18px = UIImage(named: "ic_notice_18px")!.withRenderingMode(.alwaysOriginal) static let reviewIcon = UIImage(named: "ic_review")!.withRenderingMode(.alwaysOriginal) From 75a3651d07646f5bf6bd1a0423eb920728acfdfc Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:25:01 +0900 Subject: [PATCH 018/153] =?UTF-8?q?[Feat]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=83=81=EB=8B=A8=EB=B7=B0=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 --- .../ViewControllers/BakeryListTopView.swift | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift new file mode 100644 index 00000000..84072468 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift @@ -0,0 +1,77 @@ +// +// BakeryListTopView.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/11. +// + +import UIKit + +import SnapKit +import Then + +final class BakeryListTopView: UIView { + + // MARK: - Property + + // MARK: - UI Property + + private let hStackView = UIStackView() + private let bakeryTitle = UILabel() + private let bakeryIcon = UIImageView() + private let searchButton = UIButton() + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUI() { + hStackView.do { + $0.axis = .horizontal + $0.spacing = 8 + } + + bakeryTitle.do { + $0.basic(text: "건빵집 리스트", + font: .pretendardBold(26), + color: .gbbGray700!) + } + + bakeryIcon.do { + $0.image = .listIcon + $0.contentMode = .scaleAspectFit + } + + searchButton.do { + $0.setImage(.searchIcon600, for: .normal) + } + } + + private func setLayout() { + addSubviews(hStackView, searchButton) + hStackView.addArrangedSubviews(bakeryTitle, bakeryIcon) + + hStackView.snp.makeConstraints { + $0.leading.equalToSuperview().offset(24) + $0.bottom.equalToSuperview().offset(-15) + $0.top.equalToSuperview().offset(44) + } + + bakeryIcon.snp.makeConstraints { + $0.size.equalTo(24) + } + + searchButton.snp.makeConstraints { + $0.top.equalTo(hStackView.snp.top) + $0.trailing.equalToSuperview().offset(-23) + $0.bottom.equalToSuperview().offset(-15) + } + } +} From 361831caf0cbc01498caf7ce99de072c3ac954db Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:25:43 +0900 Subject: [PATCH 019/153] =?UTF-8?q?[Feat]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=95=84=ED=84=B0=EC=85=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 --- .../BakeryFilterCollectionViewCell.swift | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift new file mode 100644 index 00000000..1b58cd4d --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift @@ -0,0 +1,78 @@ +// +// BakeryFilterCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/11. +// + +import UIKit + +import SnapKit +import Then + +final class BakeryFilterCollectionViewCell: UICollectionViewCell { + + // MARK: - Property + + var isTapped: Bool = true + + // MARK: - UI Property + + private let hStackView = UIStackView() + private let iconView = UIImageView() + var filterTitle = UILabel() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setUI() { + contentView.do { + $0.makeCornerRound(radius: 18) + $0.makeBorder(width: 1, color: .gbbGray200!) + $0.backgroundColor = .gbbGray100 + } + hStackView.do { + $0.axis = .horizontal + $0.spacing = 4 + $0.distribution = .fillProportionally + } + filterTitle.do { + $0.font = .pretendardMedium(13) + $0.sizeToFit() + } + } + + private func setLayout() { + contentView.addSubview(hStackView) + hStackView.addArrangedSubviews(iconView, filterTitle) + + hStackView.snp.makeConstraints { + $0.edges.equalToSuperview().inset(UIEdgeInsets(top: 8, left: 12, bottom: 8, right: 12)) + } + + iconView.snp.makeConstraints { + $0.size.equalTo(20) + } + } + + func bind(item: BakeryFilterItems, index: Int) { + iconView.image = item.leftIcon + filterTitle.text = item.filter.title + filterTitle.textColor = (item.status == .off) ? .black : .gbbBackground2 + } + func getSize() { + return filterTitle.sizeToFit() + } +} From 873d8f57026d395346786d25dca0c30ab61eedb7 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:26:32 +0900 Subject: [PATCH 020/153] =?UTF-8?q?[Feat]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=95=84=ED=84=B0=EB=B7=B0=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 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 28 +++ .../ViewControllers/BakeryFilterView.swift | 160 ++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 29906ab5..575fb682 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -30,6 +30,11 @@ 093214022A5AE27800875EF6 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 093214012A5AE27700875EF6 /* Utils.swift */; }; 093214082A5AE40900875EF6 /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 093214072A5AE40900875EF6 /* SearchViewController.swift */; }; 0961C3642A501EBF0031A822 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0961C3632A501EBF0031A822 /* Strings.swift */; }; + 097682DF2A5C91280008F4FB /* BakeryListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682DE2A5C91280008F4FB /* BakeryListResponseDTO.swift */; }; + 097682E32A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */; }; + 097682E52A5C99340008F4FB /* BakeryFilterItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */; }; + 097682E72A5CF0080008F4FB /* BakeryFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */; }; + 097682E92A5D0B6B0008F4FB /* BakeryListTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */; }; 098F32EA2A4200FE0092D09A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 098F32E92A4200FE0092D09A /* Assets.xcassets */; }; 098F32ED2A4200FE0092D09A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 098F32EB2A4200FE0092D09A /* LaunchScreen.storyboard */; }; 099FC1C62A51F19300116D00 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 099FC1C52A51F19300116D00 /* GoogleService-Info.plist */; }; @@ -73,6 +78,11 @@ 093214012A5AE27700875EF6 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; 093214072A5AE40900875EF6 /* SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = ""; }; 0961C3632A501EBF0031A822 /* Strings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; + 097682DE2A5C91280008F4FB /* BakeryListResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListResponseDTO.swift; sourceTree = ""; }; + 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterCollectionViewCell.swift; sourceTree = ""; }; + 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterItems.swift; sourceTree = ""; }; + 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterView.swift; sourceTree = ""; }; + 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListTopView.swift; sourceTree = ""; }; 098F32DD2A4200FD0092D09A /* GEON-PPANG-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GEON-PPANG-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 098F32E02A4200FD0092D09A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 098F32E22A4200FD0092D09A /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -312,6 +322,14 @@ path = Storyboard; sourceTree = ""; }; + 097682DD2A5C91050008F4FB /* Model */ = { + isa = PBXGroup; + children = ( + 097682DE2A5C91280008F4FB /* BakeryListResponseDTO.swift */, + ); + path = Model; + sourceTree = ""; + }; 098F32D42A4200FD0092D09A = { isa = PBXGroup; children = ( @@ -376,7 +394,12 @@ 09B13F4E2A593CAE00C0C723 /* ViewControllers */ = { isa = PBXGroup; children = ( + 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */, + 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */, 09B13F4F2A593CB800C0C723 /* BakeryListViewController.swift */, + 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */, + 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */, + 097682DD2A5C91050008F4FB /* Model */, ); path = ViewControllers; sourceTree = ""; @@ -573,10 +596,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 097682E72A5CF0080008F4FB /* BakeryFilterView.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, + 097682E92A5D0B6B0008F4FB /* BakeryListTopView.swift in Sources */, 09B13F5A2A5946B700C0C723 /* TabBar+.swift in Sources */, + 097682DF2A5C91280008F4FB /* BakeryListResponseDTO.swift in Sources */, 09B71C002A59D50900076AC2 /* HomeTopView.swift in Sources */, 090556492A51E7EC00752067 /* UIScreen+.swift in Sources */, 09B71C022A59D99200076AC2 /* SearchTextField.swift in Sources */, @@ -584,6 +610,7 @@ 0961C3642A501EBF0031A822 /* Strings.swift in Sources */, 093214082A5AE40900875EF6 /* SearchViewController.swift in Sources */, 09B13F542A593CD300C0C723 /* MyPageViewController.swift in Sources */, + 097682E32A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift in Sources */, 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */, 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */, 090556222A51DB3300752067 /* UIFont+.swift in Sources */, @@ -608,6 +635,7 @@ 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */, 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, + 097682E52A5C99340008F4FB /* BakeryFilterItems.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift new file mode 100644 index 00000000..2d2a3c91 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift @@ -0,0 +1,160 @@ +// +// BakeryFilterView.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/11. +// + +import UIKit + +import SnapKit +import Then + +final class BakeryFilterView: UIView { + + // MARK: - Property + + enum Section: Hashable { + case main + } + + typealias DataSource = UICollectionViewDiffableDataSource + private var dataSource: DataSource? + private var filterlist: [BakeryFilterItems] = BakeryFilterItems.item + + // MARK: - UI Property + + private lazy var filterCollectionview = UICollectionView(frame: .zero, collectionViewLayout: layout()) + private lazy var filterButton = UIButton(configuration: .plain()) + + private let topView = UIView() + private let lineView = UIView() + private let bottomView = UIView() + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + + setRegister() + setupDataSource() + setReloadData() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUI() { + + filterCollectionview.do { + $0.delegate = self + $0.showsHorizontalScrollIndicator = false + } + + filterButton.do { + $0.configuration?.background.strokeWidth = 1 + $0.configuration?.background.strokeColor = .gbbGray200 + $0.configuration?.baseForegroundColor = .black + $0.configuration?.image = .swapIcon + $0.configuration?.attributedTitle = AttributedString("기본순", attributes: AttributeContainer([.font: UIFont.pretendardBold(13)])) + $0.configuration?.cornerStyle = .capsule + $0.configuration?.imagePadding = 5 + $0.configuration?.contentInsets = .zero + $0.addAction(UIAction { _ in + print("tapped") + }, for: .touchUpInside) + } + + lineView.do { + $0.backgroundColor = .gbbGray200 + } + [topView, bottomView].forEach { + $0.backgroundColor = .gbbGray200 + } + } + + private func setLayout() { + addSubviews(topView, filterButton, lineView, filterCollectionview, bottomView) + + topView.snp.makeConstraints { + $0.top.directionalHorizontalEdges.equalToSuperview() + $0.height.equalTo(1) + } + + filterButton.snp.makeConstraints { + $0.leading.equalToSuperview().offset(24) + $0.centerY.equalToSuperview() + $0.size.equalTo(CGSize(width: 87, height: 36)) + } + + lineView.snp.makeConstraints { + $0.width.equalTo(1) + $0.leading.equalTo(filterButton.snp.trailing).offset(12) + $0.directionalVerticalEdges.equalToSuperview().inset(15) + } + + filterCollectionview.snp.makeConstraints { + $0.leading.equalTo(lineView.snp.trailing) + $0.centerY.trailing.equalToSuperview() + $0.height.equalTo(42) + } + + bottomView.snp.makeConstraints { + $0.directionalHorizontalEdges.bottom.equalToSuperview() + $0.height.equalTo(1) + } + } + + func layout() -> UICollectionViewFlowLayout { + let layout = UICollectionViewFlowLayout() + layout.minimumLineSpacing = 10 + layout.scrollDirection = .horizontal + layout.sectionInset = .init(top: 0, left: 13, bottom: 0, right: 13) + return layout + } + + private func setRegister() { + filterCollectionview.register(cell: BakeryFilterCollectionViewCell.self) + } + + private func setupDataSource() { + dataSource = DataSource(collectionView: filterCollectionview, cellProvider: { collectionView, indexPath, item in + let cell: BakeryFilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.bind(item: item, index: indexPath.item) + return cell + }) + } + + private func setReloadData() { + var snapshot = NSDiffableDataSourceSnapshot() + defer { dataSource?.apply(snapshot, animatingDifferences: false)} + snapshot.appendSections([.main]) + snapshot.appendItems(filterlist) + } +} + +extension BakeryFilterView: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + if self.filterlist[indexPath.item].status == .off { + self.filterlist[indexPath.item].status = .on + } else { + self.filterlist[indexPath.item].status = .off + } + self.filterlist[indexPath.item] = self.filterlist[indexPath.item].isSelected() + } +} + +extension BakeryFilterView: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let cellWidth: CGFloat + let cell: BakeryFilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.filterTitle.text = filterlist[indexPath.row].filter.title + cell.getSize() + cellWidth = cell.filterTitle.frame.width + 48 + + return CGSize(width: cellWidth, height: 36) + } +} From 45144fad32ddb15d4123f6a9b0df322db04aca4c Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:26:57 +0900 Subject: [PATCH 021/153] =?UTF-8?q?[Feat]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListViewController.swift | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index ef60a958..1982a8b7 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -7,10 +7,40 @@ import UIKit -final class BakeryListViewController: UIViewController { +import SnapKit +import Then - override func viewDidLoad() { - super.viewDidLoad() +final class BakeryListViewController: BaseViewController { + + // MARK: - Property + + private lazy var safeArea = self.view.safeAreaLayoutGuide + + // MARK: - UI Property + + private let bakeryTopView = BakeryListTopView() + private let bakeryFilterView = BakeryFilterView() + // MARK: - Life Cycle + + override func setUI() { + bakeryFilterView.do { + $0.backgroundColor = .clear + } + } + + override func setLayout() { + view.addSubviews(bakeryTopView, bakeryFilterView) + + bakeryTopView.snp.makeConstraints { + $0.top.equalTo(safeArea) + $0.directionalHorizontalEdges.equalTo(safeArea) + $0.height.equalTo(convertByHeightRatio(91)) + } + bakeryFilterView.snp.makeConstraints { + $0.top.equalTo(bakeryTopView.snp.bottom) + $0.directionalHorizontalEdges.equalTo(safeArea) + $0.height.equalTo(convertByHeightRatio(72)) + } } } From 0696592c0514a92fc33290d132b59880e2662108 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 13:28:23 +0900 Subject: [PATCH 022/153] =?UTF-8?q?[Add]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=A6=AC=ED=84=B0=EB=9F=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 5 +++++ .../BakeryList/ViewControllers/BakeryListTopView.swift | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 55c55068..d59af0b6 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -13,4 +13,9 @@ struct I18N { struct Home { static let searchPlaceholder = "궁금한 건빵집을 입력해주세요!" } + + /// BakeryList + struct BakeryList { + static let bakeryTitle = "건빵집 리스트" + } } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift index 84072468..edc1ab3c 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift @@ -39,7 +39,7 @@ final class BakeryListTopView: UIView { } bakeryTitle.do { - $0.basic(text: "건빵집 리스트", + $0.basic(text: I18N.BakeryList.bakeryTitle, font: .pretendardBold(26), color: .gbbGray700!) } From 382a55dacf472d572abaf90db302a39b82259b73 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 14:03:49 +0900 Subject: [PATCH 023/153] =?UTF-8?q?[Feat]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=85=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 ++ .../BakeryListCollectionViewCell.swift | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 575fb682..c42cce33 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 097682E52A5C99340008F4FB /* BakeryFilterItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */; }; 097682E72A5CF0080008F4FB /* BakeryFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */; }; 097682E92A5D0B6B0008F4FB /* BakeryListTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */; }; + 097682EB2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */; }; 098F32EA2A4200FE0092D09A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 098F32E92A4200FE0092D09A /* Assets.xcassets */; }; 098F32ED2A4200FE0092D09A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 098F32EB2A4200FE0092D09A /* LaunchScreen.storyboard */; }; 099FC1C62A51F19300116D00 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 099FC1C52A51F19300116D00 /* GoogleService-Info.plist */; }; @@ -83,6 +84,7 @@ 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterItems.swift; sourceTree = ""; }; 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterView.swift; sourceTree = ""; }; 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListTopView.swift; sourceTree = ""; }; + 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListCollectionViewCell.swift; sourceTree = ""; }; 098F32DD2A4200FD0092D09A /* GEON-PPANG-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GEON-PPANG-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 098F32E02A4200FD0092D09A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 098F32E22A4200FD0092D09A /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -397,6 +399,7 @@ 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */, 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */, 09B13F4F2A593CB800C0C723 /* BakeryListViewController.swift */, + 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */, 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */, 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */, 097682DD2A5C91050008F4FB /* Model */, @@ -626,6 +629,7 @@ 09B13F582A59433500C0C723 /* TabBarItem.swift in Sources */, 09B13F502A593CB800C0C723 /* BakeryListViewController.swift in Sources */, 093214022A5AE27800875EF6 /* Utils.swift in Sources */, + 097682EB2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift in Sources */, 090556452A51E79B00752067 /* UITextField+.swift in Sources */, 09CA3F062A569EB30063897A /* API.swift in Sources */, DF959A6E2A568C9400E75774 /* UIColor+.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift new file mode 100644 index 00000000..9416c47b --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -0,0 +1,38 @@ +// +// BakeryListCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/11. +// + +import UIKit + +enum BakeryViewType { + case defaultType + case reviewType +} +final class BakeryListCollectionViewCell: UICollectionViewCell { + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + contentView.backgroundColor = .white + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setUI() { + + } + + private func setLayout() { + + } +} From d8e0182c5dce648e80401fbf4822650e74a33bc2 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 14:04:36 +0900 Subject: [PATCH 024/153] =?UTF-8?q?[Fix]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=85=80=20=EB=B6=84=EA=B8=B0=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/BakeryFilterCollectionViewCell.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift index 1b58cd4d..f7eccbdc 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift @@ -71,7 +71,10 @@ final class BakeryFilterCollectionViewCell: UICollectionViewCell { iconView.image = item.leftIcon filterTitle.text = item.filter.title filterTitle.textColor = (item.status == .off) ? .black : .gbbBackground2 + filterTitle.backgroundColor = (item.status == .off) ? .gbbGray100 : .gbbMain3 + filterTitle.makeBorder(width: 1, color: (item.status == .off) ? .gbbGray200! : .gbbMain2!) } + func getSize() { return filterTitle.sizeToFit() } From 8b374398a24c5dca01973777ef0d4f4007d16168 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 14:05:27 +0900 Subject: [PATCH 025/153] =?UTF-8?q?[Add]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=BB=AC=EB=A0=89=EC=85=98?= =?UTF-8?q?=EB=B7=B0=20=EB=B7=B0=EC=BB=A8=EC=97=90=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListViewController.swift | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index 1982a8b7..673c06e6 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -14,15 +14,30 @@ final class BakeryListViewController: BaseViewController { // MARK: - Property + enum Section { + case main + } + typealias DataSource = UICollectionViewDiffableDataSource + private var dataSource: DataSource? + private var filterlist: [BakeryListResponseDTO] = BakeryListResponseDTO.item private lazy var safeArea = self.view.safeAreaLayoutGuide // MARK: - UI Property private let bakeryTopView = BakeryListTopView() private let bakeryFilterView = BakeryFilterView() + private lazy var bakeryListCollectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) // MARK: - Life Cycle + override func viewDidLoad() { + super.viewDidLoad() + + setRegister() + setupDataSource() + setReloadData() + + } override func setUI() { bakeryFilterView.do { $0.backgroundColor = .clear @@ -30,17 +45,51 @@ final class BakeryListViewController: BaseViewController { } override func setLayout() { - view.addSubviews(bakeryTopView, bakeryFilterView) + view.addSubviews(bakeryTopView, bakeryFilterView, bakeryListCollectionView) bakeryTopView.snp.makeConstraints { $0.top.equalTo(safeArea) $0.directionalHorizontalEdges.equalTo(safeArea) $0.height.equalTo(convertByHeightRatio(91)) } + bakeryFilterView.snp.makeConstraints { $0.top.equalTo(bakeryTopView.snp.bottom) $0.directionalHorizontalEdges.equalTo(safeArea) $0.height.equalTo(convertByHeightRatio(72)) } + + bakeryListCollectionView.snp.makeConstraints { + $0.top.equalTo(bakeryFilterView.snp.bottom) + $0.directionalHorizontalEdges.equalTo(safeArea) + $0.bottom.equalToSuperview() + } + } + + private func setRegister() { + bakeryListCollectionView.register(cell: BakeryListCollectionViewCell.self) + } + + private func layout() -> UICollectionViewLayout { + var config = UICollectionLayoutListConfiguration(appearance: .plain) + config.backgroundColor = .clear + config.showsSeparators = true + + let layout = UICollectionViewCompositionalLayout.list(using: config) + return layout + } + + private func setupDataSource() { + dataSource = DataSource(collectionView: bakeryListCollectionView, cellProvider: { collectionView, indexPath, item in + let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + return cell + }) + } + + private func setReloadData() { + var snapshot = NSDiffableDataSourceSnapshot() + defer { dataSource?.apply(snapshot, animatingDifferences: false)} + snapshot.appendSections([.main]) + snapshot.appendItems(filterlist) } } From 15196b983c56b1a4522076200b52b95afbfe7f15 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 14:38:45 +0900 Subject: [PATCH 026/153] =?UTF-8?q?[Fix]=20#36=20-=20=EB=B9=B5=EC=A7=91=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=EC=85=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/BakeryFilterCollectionViewCell.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift index f7eccbdc..7912e742 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift @@ -71,8 +71,8 @@ final class BakeryFilterCollectionViewCell: UICollectionViewCell { iconView.image = item.leftIcon filterTitle.text = item.filter.title filterTitle.textColor = (item.status == .off) ? .black : .gbbBackground2 - filterTitle.backgroundColor = (item.status == .off) ? .gbbGray100 : .gbbMain3 - filterTitle.makeBorder(width: 1, color: (item.status == .off) ? .gbbGray200! : .gbbMain2!) + contentView.backgroundColor = (item.status == .off) ? .gbbGray100 : .gbbMain3 + contentView.makeBorder(width: 1, color: (item.status == .off) ? .gbbGray200! : .gbbMain2!) } func getSize() { From 800806350e9b5bdc86cc4d7970df1278b37f4f64 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 14:40:32 +0900 Subject: [PATCH 027/153] =?UTF-8?q?[Add]=20#36=20-=20=EC=85=80=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=ED=9B=84=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=86=8C=EC=8A=A4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryList/ViewControllers/BakeryFilterView.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift index 2d2a3c91..82da45e8 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift @@ -144,6 +144,11 @@ extension BakeryFilterView: UICollectionViewDelegate { self.filterlist[indexPath.item].status = .off } self.filterlist[indexPath.item] = self.filterlist[indexPath.item].isSelected() + + var snapshot = NSDiffableDataSourceSnapshot() + snapshot.appendSections([.main]) + snapshot.appendItems(filterlist) + dataSource?.apply(snapshot, animatingDifferences: true) } } From 34598ed111efa211f42c54d2559490e884becd9e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 14:41:25 +0900 Subject: [PATCH 028/153] =?UTF-8?q?[Add]=20#36=20-=20FilterItem=20UUID=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/BakeryFilterItems.swift | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift index cb28b2f2..f1e115f7 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift @@ -29,6 +29,7 @@ enum Filter { } struct BakeryFilterItems: Hashable { + var identifier = UUID() var filter: Filter var status: Status var leftIcon: UIImage @@ -54,10 +55,17 @@ struct BakeryFilterItems: Hashable { case .HARD: return BakeryFilterItems(filter: filter, status: status, leftIcon: .enabledHardIcon) case .DESSERT: - return BakeryFilterItems(filter: .DESSERT, status: .off, leftIcon: .enabledCakeIcon) + return BakeryFilterItems(filter: filter, status: status, leftIcon: .enabledCakeIcon) case .BRUNCH: - return BakeryFilterItems(filter: .BRUNCH, status: .off, leftIcon: .enabledSandwichIcon) + return BakeryFilterItems(filter: filter, status: status, leftIcon: .enabledSandwichIcon) } } } + + func hash(into hasher: inout Hasher) { + hasher.combine(identifier) + } + static func == (lhs: BakeryFilterItems, rhs: BakeryFilterItems) -> Bool { + return lhs.identifier == rhs.identifier + } } From 263ade875423802b0cae7206aff54fafaaa3d444 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 14:46:33 +0900 Subject: [PATCH 029/153] [Feat] #31 - writeReviewViewController layout done --- .../Presentation/Common/View/BottomView.swift | 38 ++++++------- .../WriteReview/View/BakeryOverviewView.swift | 2 - .../WriteReviewViewController.swift | 54 +++++++++---------- 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift index 024f3cc0..6012568f 100644 --- a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift @@ -14,19 +14,26 @@ final class BottomView: UIView { // MARK: - Life Cycle -// override init(frame: CGRect) { -// super.init(frame: frame) -// -// setShadow() -// } -// -// @available(*, unavailable) -// required init?(coder: NSCoder) { -// fatalError("init(coder:) has not been implemented") -// } -// -// // MARK: - Setting -// + override init(frame: CGRect) { + super.init(frame: frame) + + setLayout() + setShadow() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + self.snp.makeConstraints { + $0.height.equalTo(118) + } + } + private func setShadow() { self.layer.applyShadow(color: .init(red: 0, green: 0, blue: 0, alpha: 0.1), alpha: 1, @@ -34,11 +41,6 @@ final class BottomView: UIView { y: 1, blur: 10) } - override func layoutSubviews() { - super.layoutSubviews() - - setShadow() - } // MARK: - Custom Method diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift index edbc089a..1d4e964c 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift @@ -14,9 +14,7 @@ final class BakeryOverviewView: UIView { // MARK: - Property -// private let bakeryImage: UIImage // TODO: ingredient Tag 추가 -// private let regions: [String] // MARK: - UI Property diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 2ff732c7..1f94c937 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -41,8 +41,7 @@ final class WriteReviewViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - // TODO: baseVC 에 숨기기 - self.navigationController?.navigationBar.isHidden = true + setNavigationBarHidden() setKeyboardHideGesture() setKeyboardNotificationCenter() } @@ -57,23 +56,19 @@ final class WriteReviewViewController: BaseViewController { // MARK: - Setting override func setLayout() { + view.addSubview(scrollView) + scrollView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + view.addSubview(navigationBar) navigationBar.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview() - $0.top.equalToSuperview() + $0.horizontalEdges.top.equalToSuperview() } view.addSubview(bottomView) bottomView.snp.makeConstraints { $0.horizontalEdges.bottom.equalToSuperview() - $0.height.equalTo(126) - } - - view.addSubview(scrollView) - scrollView.snp.makeConstraints { - $0.top.equalTo(navigationBar.snp.bottom) - $0.horizontalEdges.equalToSuperview() - $0.bottom.equalToSuperview().inset(126) } scrollView.addSubview(contentView) @@ -83,8 +78,8 @@ final class WriteReviewViewController: BaseViewController { contentView.addSubview(bakeryOverviewView) bakeryOverviewView.snp.makeConstraints { + $0.top.equalToSuperview().inset(68) $0.horizontalEdges.equalToSuperview() - $0.top.equalToSuperview() $0.height.equalTo(125) } @@ -133,30 +128,42 @@ final class WriteReviewViewController: BaseViewController { contentView.addSubview(aboutReviewContainerView) aboutReviewContainerView.snp.makeConstraints { $0.top.equalTo(reviewDetailTextView.snp.bottom).offset(10) - $0.horizontalEdges.bottom.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(207) + $0.bottom.equalToSuperview() } aboutReviewContainerView.addSubview(dotView) dotView.snp.makeConstraints { $0.leading.equalToSuperview().inset(24) - $0.top.equalTo(aboutReviewContainerView).offset(16) + $0.top.equalToSuperview().offset(16) } aboutReviewContainerView.addSubview(aboutReviewLabel) aboutReviewLabel.snp.makeConstraints { $0.leading.equalTo(dotView.snp.trailing) $0.trailing.equalToSuperview().inset(24) - $0.top.equalTo(dotView) - $0.bottom.equalToSuperview().inset(34) + $0.top.equalToSuperview().offset(16) } } override func setUI() { navigationBar.do { + $0.backgroundColor = .white $0.configureLeftTitle(to: "건대 초코빵") $0.configureBottomLine() } + scrollView.do { + $0.showsVerticalScrollIndicator = false + $0.verticalScrollIndicatorInsets = .zero + $0.backgroundColor = .gbbGray100 + } + + contentView.do { + $0.backgroundColor = .white + } + likeCollectionViewFlowLayout.do { $0.estimatedItemSize = UICollectionViewFlowLayout.automaticSize } @@ -193,6 +200,7 @@ final class WriteReviewViewController: BaseViewController { dotView.do { $0.font = .captionM2 $0.textColor = .gbbGray300 + $0.textAlignment = .center $0.setLineHeight(by: 1.37, with: "•") } @@ -205,7 +213,8 @@ final class WriteReviewViewController: BaseViewController { } bottomView.do { - $0.backgroundColor = .gbbGray300 + $0.backgroundColor = .white + $0.layer.masksToBounds = false } } @@ -237,15 +246,6 @@ final class WriteReviewViewController: BaseViewController { } } -// private func addShadowLayer() { -// let layer = CALayer() -// layer.shadowPath = UIBezierPath(rect: bottomView.bounds).cgPath -// layer.shadowOffset = .zero -// layer.shadowRadius = 10 -// layer.shadowColor = .init(red: 0, green: 0, blue: 0, alpha: 0.1) -// bottomView.layer.addSublayer(layer) -// } - } // MARK: - UICollectionViewDelegate extension From 29b544764f0770cb85677dedaf8f5b287462cf6f Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 17:14:25 +0900 Subject: [PATCH 030/153] [Feat] #31 - review flow completed --- .../View/ReviewDetailTextView.swift | 3 +- .../WriteReviewViewController.swift | 31 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift index 14508c7d..2fa9f3e1 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift @@ -92,7 +92,8 @@ final class ReviewDetailTextView: UIView { $0.textColor = .gbbGray300 $0.makeCornerRound(radius: 12) $0.makeBorder(width: 1, color: .gbbGray300!) - $0.contentInset = .init(top: 20, left: 28, bottom: 16, right: 28) + $0.textContainerInset = .init(top: 20, left: 28, bottom: 16, right: 28) + $0.clipsToBounds = true } textLimitLabel.do { diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 1f94c937..d4390b45 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -246,6 +246,21 @@ final class WriteReviewViewController: BaseViewController { } } + private func checkTextViewLength(_ textView: UITextView) { + if textView.text.count <= 10 { + reviewDetailTextView.configureTextView(to: .error) + } else { + reviewDetailTextView.configureTextView(to: .activated) + } + } + + private func textLimit(_ existingText: String?, to newText: String, with limit: Int) -> Bool { + guard let text = existingText + else { return false } + let isOverLimit = text.count + newText.count <= limit + return isOverLimit + } + } // MARK: - UICollectionViewDelegate extension @@ -321,8 +336,17 @@ extension WriteReviewViewController: UICollectionViewDataSource { extension WriteReviewViewController: UITextViewDelegate { + func textViewDidChange(_ textView: UITextView) { + let textCount = textView.text.count + if textCount <= 10 && 0 < textCount { + reviewDetailTextView.configureTextView(to: .error) + } else { + reviewDetailTextView.configureTextView(to: .activated) + } + reviewDetailTextView.updateTextLimitLabel(to: textCount) + } + func textViewDidBeginEditing(_ textView: UITextView) { - let textView = self.reviewDetailTextView.detailTextView if textView.text == I18N.likePlaceholder || textView.text == I18N.dislikePlaceholder { textView.text = nil textView.textColor = .black @@ -330,11 +354,14 @@ extension WriteReviewViewController: UITextViewDelegate { } func textViewDidEndEditing(_ textView: UITextView) { - let textView = self.reviewDetailTextView.detailTextView if textView.text.isEmpty { textView.text = reviewDetailTextView.isLike ? I18N.likePlaceholder : I18N.dislikePlaceholder textView.textColor = .black } } + func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { + return self.textLimit(textView.text, to: text, with: 500) + } + } From 030dc1a07d5832c44395000120b500dda0cd72ca Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Tue, 11 Jul 2023 17:54:49 +0900 Subject: [PATCH 031/153] =?UTF-8?q?[Feat]=20#32=20-=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8/=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 16 ++ .../Global/Extensions/UI/UIView+.swift | 2 +- .../Common/DrawDashLineView.swift | 33 ++++ .../Onboarding/OnboardingViewController.swift | 152 ++++++++++++++++++ 4 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift create mode 100644 GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 2db26971..bf6bdebc 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -54,6 +54,8 @@ DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; DF959A6C2A568C4600E75774 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DF959A6B2A568C4600E75774 /* Colors.xcassets */; }; DF959A6E2A568C9400E75774 /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF959A6D2A568C9400E75774 /* UIColor+.swift */; }; + DFAF7C972A5C6CD300A93E19 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAF7C962A5C6CD300A93E19 /* OnboardingViewController.swift */; }; + DFAF7C992A5C921B00A93E19 /* DrawDashLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAF7C982A5C921A00A93E19 /* DrawDashLineView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -101,6 +103,8 @@ DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; DF959A6B2A568C4600E75774 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; DF959A6D2A568C9400E75774 /* UIColor+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; }; + DFAF7C962A5C6CD300A93E19 /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; + DFAF7C982A5C921A00A93E19 /* DrawDashLineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawDashLineView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -264,6 +268,7 @@ 0961C36A2A501EF60031A822 /* Presentation */ = { isa = PBXGroup; children = ( + DFAF7C952A5C6CA500A93E19 /* Onboarding */, 093214032A5AE3C000875EF6 /* Search */, 09B13F492A593C5900C0C723 /* Home */, 09B13F4D2A593C7600C0C723 /* BakeryList */, @@ -412,6 +417,7 @@ 3E79B19B2A54523400D36A26 /* Button */, 3EA2E1E12A53E880003516A3 /* Base */, 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */, + DFAF7C982A5C921A00A93E19 /* DrawDashLineView.swift */, ); path = Common; sourceTree = ""; @@ -441,6 +447,14 @@ path = Colors; sourceTree = ""; }; + DFAF7C952A5C6CA500A93E19 /* Onboarding */ = { + isa = PBXGroup; + children = ( + DFAF7C962A5C6CD300A93E19 /* OnboardingViewController.swift */, + ); + path = Onboarding; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -575,6 +589,7 @@ files = ( 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, + DFAF7C992A5C921B00A93E19 /* DrawDashLineView.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, 09B13F5A2A5946B700C0C723 /* TabBar+.swift in Sources */, 09B71C002A59D50900076AC2 /* HomeTopView.swift in Sources */, @@ -604,6 +619,7 @@ DF959A6E2A568C9400E75774 /* UIColor+.swift in Sources */, 090556472A51E7D900752067 /* UITextView+.swift in Sources */, 0905562B2A51DBCE00752067 /* UIStackView+.swift in Sources */, + DFAF7C972A5C6CD300A93E19 /* OnboardingViewController.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */, 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */, diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift index fda02f22..1a797539 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift @@ -18,7 +18,7 @@ extension UIView { layer.masksToBounds = false } - func makeBorder(width: CGFloat, color: UIColor ) { + func makeBorder(width: CGFloat, color: UIColor) { layer.borderWidth = width layer.borderColor = color.cgColor } diff --git a/GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift b/GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift new file mode 100644 index 00000000..c488ed44 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift @@ -0,0 +1,33 @@ +// +// DrawDashLineView.swift +// GEON-PPANG-iOS +// +// Created by kyun on 2023/07/11. +// + +import UIKit + +class DrawDashLineView: UIView { // 코너가 들어간 점선 그리기 + + private let borderLayer = CAShapeLayer() + + override init(frame: CGRect) { + super.init(frame: frame) + + borderLayer.strokeColor = UIColor.gbbMain3?.cgColor + borderLayer.lineDashPattern = [2, 2] + borderLayer.backgroundColor = UIColor.clear.cgColor + borderLayer.fillColor = UIColor.clear.cgColor + + layer.addSublayer(borderLayer) + } + + override func draw(_ rect: CGRect) { + + borderLayer.path = UIBezierPath(roundedRect: rect, cornerRadius: 15).cgPath + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift new file mode 100644 index 00000000..5d849640 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift @@ -0,0 +1,152 @@ +// +// OnboardingViewController.swift +// GEON-PPANG-iOS +// +// Created by kyun on 2023/07/11. +// + +import UIKit + +import SnapKit +import Then + +class OnboardingViewController: BaseViewController { + + private let logoImage = UIImageView() + private lazy var signinButton = UIView() // 공통 버튼 구현 전까지 + private let signinLabel = UILabel() // 임시로 레이아웃 잡는 용도 + private lazy var signupButton = UIView() // 위와 + private let signupLabel = UILabel() // 동일 + private let latelySigninView = DrawDashLineView() + private let latelySigninLabel = UILabel() + private let kakaoButton = UIImageView() + private let appleButton = UIImageView() + private let naverButton = UIImageView() + private let googleButton = UIImageView() + + override func viewDidLoad() { + + super.viewDidLoad() + } + + override func setUI() { + + logoImage.do { + $0.image = .launchscreenIcon + $0.contentMode = .scaleAspectFit + } + + signinButton.do { + $0.backgroundColor = .gbbMain2 + $0.makeCornerRound(radius: 12) + } + + signupButton.do { + $0.makeCornerRound(radius: 12) + $0.makeBorder(width: 1, color: .gbbGray300!) + } + + signinLabel.do { + $0.text = "로그인" + $0.font = .headLine + $0.textColor = .gbbGray100 + $0.textAlignment = .center + } + + signupLabel.do { + $0.text = "회원가입" + $0.font = .bodyB1 + $0.textColor = .gbbGray400 + $0.textAlignment = .center + } + + latelySigninLabel.do { + $0.text = "최근에 카카오톡으로 로그인 했습니다." + $0.font = .captionB1 + $0.textColor = .gbbGray500 + $0.textAlignment = .center + $0.partColorChange(targetString: "카카오톡", textColor: .gbbMain1!) // 특정 문자열의 textColor를 변경 + } + + kakaoButton.do { + $0.image = .kakaoLoginButton + } + + appleButton.do { + $0.image = .appleLoginButton + } + + naverButton.do { + $0.image = .naverLoginButton + } + + googleButton.do { + $0.image = .googleLoginButton + } + } + + override func setLayout() { + + view.addSubviews(logoImage, signinButton, signupButton, signinLabel, signupLabel, latelySigninView, latelySigninLabel, kakaoButton, appleButton, naverButton, googleButton) + + logoImage.snp.makeConstraints { + $0.top.equalToSuperview().inset(convertByHeightRatio(190)) + $0.centerX.equalToSuperview() + $0.height.equalTo(convertByHeightRatio(179)) + } + + signinButton.snp.makeConstraints { + $0.top.equalTo(logoImage.snp.bottom).offset(convertByHeightRatio(71)) + $0.directionalHorizontalEdges.equalToSuperview().inset(24) + $0.height.equalTo(convertByHeightRatio(56)) + } + + signupButton.snp.makeConstraints { + $0.top.equalTo(signinButton.snp.bottom).offset(convertByHeightRatio(20)) + $0.directionalHorizontalEdges.equalToSuperview().inset(24) + $0.height.equalTo(convertByHeightRatio(56)) + } + + signinLabel.snp.makeConstraints { + $0.center.equalTo(signinButton.snp.center) + } + + signupLabel.snp.makeConstraints { + $0.center.equalTo(signupButton.snp.center) + } + + latelySigninView.snp.makeConstraints { + $0.top.equalTo(signupButton.snp.bottom).offset(convertByHeightRatio(65)) + $0.directionalHorizontalEdges.equalToSuperview().inset(77) + $0.height.equalTo(convertByHeightRatio(30)) + } + + latelySigninLabel.snp.makeConstraints { + $0.center.equalTo(latelySigninView.snp.center) + } + + kakaoButton.snp.makeConstraints { + $0.top.equalTo(latelySigninView.snp.bottom).offset(convertByHeightRatio(23)) + $0.leading.equalToSuperview().inset(convertByWidthRatio(45)) + $0.size.equalTo(convertByWidthRatio(56)) + } + + appleButton.snp.makeConstraints { + $0.top.equalTo(kakaoButton.snp.top) + $0.leading.equalTo(kakaoButton.snp.trailing).offset(convertByWidthRatio(20)) + $0.size.equalTo(convertByWidthRatio(56)) + } + + naverButton.snp.makeConstraints { + $0.top.equalTo(appleButton.snp.top) + $0.leading.equalTo(appleButton.snp.trailing).offset(convertByWidthRatio(20)) + $0.size.equalTo(convertByWidthRatio(56)) + } + + googleButton.snp.makeConstraints { + $0.top.equalTo(naverButton.snp.top) + $0.leading.equalTo(naverButton.snp.trailing).offset(convertByWidthRatio(20)) + $0.size.equalTo(convertByWidthRatio(56)) + } + } +} From eab2f21fd8366ae0dcd8fb8f16bcaa9777ab0a34 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 17:59:14 +0900 Subject: [PATCH 032/153] [Feat] #31 - review flow detail checked --- .../Presentation/Common/View/BottomView.swift | 1 + .../WriteReview/View/BakeryOverviewView.swift | 5 +-- .../WriteReviewViewController.swift | 36 +++++++++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift index 6012568f..a20d419b 100644 --- a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift @@ -50,6 +50,7 @@ final class BottomView: UIView { $0.leading.equalToSuperview().inset(24) $0.trailing.equalToSuperview().inset(offset) $0.top.equalToSuperview().inset(offset) + $0.height.equalTo(56) } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift index 1d4e964c..b35d3537 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/BakeryOverviewView.swift @@ -25,7 +25,7 @@ final class BakeryOverviewView: UIView { // MARK: - Life Cycle // TODO: ingredient Tag 추가 - init(bakeryImage: UIImage, regions: [String]) { + init(bakeryImage: UIImage?, regions: [String]) { self.bakeryImageView.image = bakeryImage self.regionStackView.configureStackView(with: regions) @@ -68,13 +68,14 @@ final class BakeryOverviewView: UIView { private func setUI() { bakeryImageView.do { // TODO: image 추가 시 적용 + $0.backgroundColor = .gbbPoint1 $0.makeCornerRound(radius: 5) $0.contentMode = .scaleAspectFill } // TODO: ingredient Tag 추가 sampleView.do { - $0.backgroundColor = .black + $0.backgroundColor = .gbbPoint1 } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index d4390b45..f5bfaa60 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -22,7 +22,7 @@ final class WriteReviewViewController: BaseViewController { private let scrollView = UIScrollView() private let contentView = UIView() private let navigationBar = CustomNavigationBar() - private let bakeryOverviewView = BakeryOverviewView(bakeryImage: .actions, regions: ["tset", "efqerqf"]) + private let bakeryOverviewView = BakeryOverviewView(bakeryImage: nil, regions: ["tset", "efqerqf"]) private let lineView = LineView() private let likeCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() private let optionsCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() @@ -35,6 +35,7 @@ final class WriteReviewViewController: BaseViewController { private let aboutReviewContainerView = UIView() private let aboutReviewLabel = UILabel() private let bottomView = BottomView() + private let bottomDummyView = UIView() // MARK: - life cycle @@ -43,7 +44,7 @@ final class WriteReviewViewController: BaseViewController { setNavigationBarHidden() setKeyboardHideGesture() - setKeyboardNotificationCenter() + setKeyboardNotificationCenterOnScrollView() } override func viewWillLayoutSubviews() { @@ -215,6 +216,12 @@ final class WriteReviewViewController: BaseViewController { bottomView.do { $0.backgroundColor = .white $0.layer.masksToBounds = false + $0.applyAdditionalSubview(bottomDummyView) + } + + bottomDummyView.do { + $0.backgroundColor = .gbbPoint1 + $0.makeCornerRound(radius: 12) } } @@ -230,6 +237,11 @@ final class WriteReviewViewController: BaseViewController { reviewDetailTextView.detailTextView.delegate = self } + private func setKeyboardNotificationCenterOnScrollView() { + NotificationCenter.default.addObserver(self, selector: #selector(moveUpAboutKeyboardOnScrollView), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(moveDownAboutKeyboardOnScrollView), name: UIResponder.keyboardWillHideNotification, object: nil) + } + // MARK: - Custom Method private func updateCollectionViewConstraint(of collectionView: UICollectionView) { @@ -261,6 +273,26 @@ final class WriteReviewViewController: BaseViewController { return isOverLimit } + // MARK: - objc + + @objc + func moveUpAboutKeyboardOnScrollView(_ notification: NSNotification) { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { + UIView.animate(withDuration: 0.2, animations: { + self.scrollView.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height + 24) + self.bottomView.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height + 24) + }) + } + } + + @objc + func moveDownAboutKeyboardOnScrollView(_ notification: NSNotification) { + UIView.animate(withDuration: 0.2, animations: { + self.scrollView.transform = .identity + self.bottomView.transform = .identity + }) + } + } // MARK: - UICollectionViewDelegate extension From 2c09b1720550353d1e12261b840f692fa6fa80b2 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 18:28:48 +0900 Subject: [PATCH 033/153] [Feat] #31 - edited details --- GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift | 6 +++--- .../ViewController/WriteReviewViewController.swift | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift index a20d419b..98090dc1 100644 --- a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift @@ -30,7 +30,7 @@ final class BottomView: UIView { private func setLayout() { self.snp.makeConstraints { - $0.height.equalTo(118) + $0.height.equalTo(114) } } @@ -44,11 +44,11 @@ final class BottomView: UIView { // MARK: - Custom Method - func applyAdditionalSubview(_ view: UIView, withTrailingOffset offset: CGFloat = 24) { + func applyAdditionalSubview(_ view: UIView, withTrailingOffset offset: CGFloat = 21) { addSubview(view) view.snp.makeConstraints { $0.leading.equalToSuperview().inset(24) - $0.trailing.equalToSuperview().inset(offset) + $0.trailing.equalToSuperview().inset(24) $0.top.equalToSuperview().inset(offset) $0.height.equalTo(56) } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index f5bfaa60..a0cfc418 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -216,7 +216,7 @@ final class WriteReviewViewController: BaseViewController { bottomView.do { $0.backgroundColor = .white $0.layer.masksToBounds = false - $0.applyAdditionalSubview(bottomDummyView) + $0.applyAdditionalSubview(bottomDummyView, withTrailingOffset: 16) } bottomDummyView.do { @@ -290,6 +290,7 @@ final class WriteReviewViewController: BaseViewController { UIView.animate(withDuration: 0.2, animations: { self.scrollView.transform = .identity self.bottomView.transform = .identity + self.bottomDummyView.transform = .identity }) } @@ -393,7 +394,7 @@ extension WriteReviewViewController: UITextViewDelegate { } func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { - return self.textLimit(textView.text, to: text, with: 500) + return self.textLimit(textView.text, to: text, with: 70) } } From 2cabf107ce5611e701d0b4f5f7f1ebc4f9ed2320 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Tue, 11 Jul 2023 21:40:48 +0900 Subject: [PATCH 034/153] [Feat] #31 - edited bottomview detail --- GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift | 7 +++++-- .../ViewController/WriteReviewViewController.swift | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift index 98090dc1..a8a1394f 100644 --- a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift @@ -27,10 +27,13 @@ final class BottomView: UIView { } // MARK: - Setting - + // 16 + // 56 + // 16 -> 32 + // 24 private func setLayout() { self.snp.makeConstraints { - $0.height.equalTo(114) + $0.height.equalTo(128) } } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index a0cfc418..e24240d3 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -280,7 +280,7 @@ final class WriteReviewViewController: BaseViewController { if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { UIView.animate(withDuration: 0.2, animations: { self.scrollView.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height + 24) - self.bottomView.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height + 24) + self.bottomView.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height + 40) }) } } From c35145eba57d5cf0c4a15c47381e1f1a40a33629 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Tue, 11 Jul 2023 23:23:17 +0900 Subject: [PATCH 035/153] =?UTF-8?q?[Fix]=20#34=20-=20=EB=82=A0=EB=A6=B0=20?= =?UTF-8?q?=EC=BB=A4=EB=B0=8B=20=EC=9E=AC=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 16 ++ GEON-PPANG-iOS/Application/AppDelegate.swift | 2 + .../Application/SceneDelegate.swift | 2 +- .../Global/Extensions/Design/UIImage+.swift | 4 +- .../Global/Extensions/UI/UIView+.swift | 2 +- .../Common/DrawDashLineView.swift | 33 ++++ .../Onboarding/OnboardingViewController.swift | 152 ++++++++++++++++++ .../ic_launchscreen.imageset}/Contents.json | 6 +- .../ic_launchscreen@1x.png | Bin 0 -> 4835 bytes .../ic_launchscreen@2x.png | Bin 0 -> 9624 bytes .../ic_launchscreen@3x.png | Bin 0 -> 14682 bytes .../Assets.xcassets/splash/Contents.json | 6 - .../ic_splash_image@1x.png | Bin 3587 -> 0 bytes .../ic_splash_image@2x.png | Bin 7222 -> 0 bytes .../ic_splash_image@3x.png | Bin 10758 -> 0 bytes .../splash/ic_title.imageset/Contents.json | 23 --- .../splash/ic_title.imageset/ic_title@1x.png | Bin 1396 -> 0 bytes .../splash/ic_title.imageset/ic_title@2x.png | Bin 2407 -> 0 bytes .../splash/ic_title.imageset/ic_title@3x.png | Bin 3788 -> 0 bytes .../Base.lproj/LaunchScreen.storyboard | 32 +++- 20 files changed, 237 insertions(+), 41 deletions(-) create mode 100644 GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift create mode 100644 GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift rename GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/{splash/ic_splash_image.imageset => icons/ic_launchscreen.imageset}/Contents.json (66%) create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@1x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@2x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@3x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@3x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/Contents.json delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_title.imageset/ic_title@3x.png diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 3c9ed386..a46d9eda 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -66,6 +66,8 @@ DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; DF959A6C2A568C4600E75774 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DF959A6B2A568C4600E75774 /* Colors.xcassets */; }; DF959A6E2A568C9400E75774 /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF959A6D2A568C9400E75774 /* UIColor+.swift */; }; + DFB587B92A5D584800704B6C /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB587B82A5D584800704B6C /* OnboardingViewController.swift */; }; + DFB587BB2A5D588500704B6C /* DrawDashLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB587BA2A5D588500704B6C /* DrawDashLineView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -125,6 +127,8 @@ DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; DF959A6B2A568C4600E75774 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; DF959A6D2A568C9400E75774 /* UIColor+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; }; + DFB587B82A5D584800704B6C /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; + DFB587BA2A5D588500704B6C /* DrawDashLineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawDashLineView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -307,6 +311,7 @@ 0961C36A2A501EF60031A822 /* Presentation */ = { isa = PBXGroup; children = ( + DFB587B72A5D580B00704B6C /* Onboarding */, 093214032A5AE3C000875EF6 /* Search */, 09B13F492A593C5900C0C723 /* Home */, 09B13F4D2A593C7600C0C723 /* BakeryList */, @@ -480,6 +485,7 @@ 3E79B19B2A54523400D36A26 /* Button */, 3EA2E1E12A53E880003516A3 /* Base */, 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */, + DFB587BA2A5D588500704B6C /* DrawDashLineView.swift */, ); path = Common; sourceTree = ""; @@ -509,6 +515,14 @@ path = Colors; sourceTree = ""; }; + DFB587B72A5D580B00704B6C /* Onboarding */ = { + isa = PBXGroup; + children = ( + DFB587B82A5D584800704B6C /* OnboardingViewController.swift */, + ); + path = Onboarding; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -659,6 +673,7 @@ 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */, 09C626582A5B4269002C8110 /* HomeHeaderView.swift in Sources */, 0915C1722A5C3D3700ACB8D4 /* PaddingLabel.swift in Sources */, + DFB587BB2A5D588500704B6C /* DrawDashLineView.swift in Sources */, 090556222A51DB3300752067 /* UIFont+.swift in Sources */, 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */, 09C6264E2A5B29F8002C8110 /* SearchEnum.swift in Sources */, @@ -680,6 +695,7 @@ 093214022A5AE27800875EF6 /* Utils.swift in Sources */, 090556452A51E79B00752067 /* UITextField+.swift in Sources */, 09CA3F062A569EB30063897A /* API.swift in Sources */, + DFB587B92A5D584800704B6C /* OnboardingViewController.swift in Sources */, DF959A6E2A568C9400E75774 /* UIColor+.swift in Sources */, 09C626562A5B3572002C8110 /* HomeBestReviewResponseDTO.swift in Sources */, 090556472A51E7D900752067 /* UITextView+.swift in Sources */, diff --git a/GEON-PPANG-iOS/Application/AppDelegate.swift b/GEON-PPANG-iOS/Application/AppDelegate.swift index ee1b7f9b..f57a2e57 100644 --- a/GEON-PPANG-iOS/Application/AppDelegate.swift +++ b/GEON-PPANG-iOS/Application/AppDelegate.swift @@ -16,6 +16,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() + sleep(UInt32(1.5)) + return true } diff --git a/GEON-PPANG-iOS/Application/SceneDelegate.swift b/GEON-PPANG-iOS/Application/SceneDelegate.swift index 5a66dd4c..8bf33263 100644 --- a/GEON-PPANG-iOS/Application/SceneDelegate.swift +++ b/GEON-PPANG-iOS/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let window = UIWindow(windowScene: windowScene) window.overrideUserInterfaceStyle = UIUserInterfaceStyle.light - let rootViewController = TabBarController() + let rootViewController = OnboardingViewController() let navigationController = UINavigationController(rootViewController: rootViewController) navigationController.isNavigationBarHidden = true window.rootViewController = navigationController diff --git a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift index 8410b65c..4da509ed 100644 --- a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift @@ -6,7 +6,6 @@ // import UIKit - extension UIImage { // 따로 픽셀이 적혀있지 않은 컴포넌트는 24px임. @@ -44,8 +43,9 @@ extension UIImage { static let deleteIcon = UIImage(named: "ic_delete")!.withRenderingMode(.alwaysOriginal) static let dotdotdotIcon = UIImage(named: "ic_dotdotdot")!.withRenderingMode(.alwaysOriginal) static let hideIcon = UIImage(named: "ic_hide")!.withRenderingMode(.alwaysOriginal) + static let launchscreenIcon = UIImage(named: "ic_launchscreen")!.withRenderingMode(.alwaysOriginal) static let linkIcon = UIImage(named: "ic_link")!.withRenderingMode(.alwaysOriginal) - static let listIcon = UIImage(named: "ic_link")!.withRenderingMode(.alwaysOriginal) // 건빵집 리스트 옆에 얘 써야 됨, 탭바의 storelist 아님! + static let listIcon = UIImage(named: "ic_list")!.withRenderingMode(.alwaysOriginal) // 건빵집 리스트 옆에 얘 써야 됨, 탭바의 storelist 아님! static let logoIcon16px = UIImage(named: "ic_logo_16px")!.withRenderingMode(.alwaysOriginal) static let noticeIcon18px = UIImage(named: "ic_notice_18px")!.withRenderingMode(.alwaysOriginal) static let reviewIcon = UIImage(named: "ic_review")!.withRenderingMode(.alwaysOriginal) diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift index 0ed7644d..2b92f5f8 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/UIView+.swift @@ -18,7 +18,7 @@ extension UIView { layer.masksToBounds = true } - func makeBorder(width: CGFloat, color: UIColor ) { + func makeBorder(width: CGFloat, color: UIColor) { layer.borderWidth = width layer.borderColor = color.cgColor } diff --git a/GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift b/GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift new file mode 100644 index 00000000..c488ed44 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift @@ -0,0 +1,33 @@ +// +// DrawDashLineView.swift +// GEON-PPANG-iOS +// +// Created by kyun on 2023/07/11. +// + +import UIKit + +class DrawDashLineView: UIView { // 코너가 들어간 점선 그리기 + + private let borderLayer = CAShapeLayer() + + override init(frame: CGRect) { + super.init(frame: frame) + + borderLayer.strokeColor = UIColor.gbbMain3?.cgColor + borderLayer.lineDashPattern = [2, 2] + borderLayer.backgroundColor = UIColor.clear.cgColor + borderLayer.fillColor = UIColor.clear.cgColor + + layer.addSublayer(borderLayer) + } + + override func draw(_ rect: CGRect) { + + borderLayer.path = UIBezierPath(roundedRect: rect, cornerRadius: 15).cgPath + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift new file mode 100644 index 00000000..5d849640 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift @@ -0,0 +1,152 @@ +// +// OnboardingViewController.swift +// GEON-PPANG-iOS +// +// Created by kyun on 2023/07/11. +// + +import UIKit + +import SnapKit +import Then + +class OnboardingViewController: BaseViewController { + + private let logoImage = UIImageView() + private lazy var signinButton = UIView() // 공통 버튼 구현 전까지 + private let signinLabel = UILabel() // 임시로 레이아웃 잡는 용도 + private lazy var signupButton = UIView() // 위와 + private let signupLabel = UILabel() // 동일 + private let latelySigninView = DrawDashLineView() + private let latelySigninLabel = UILabel() + private let kakaoButton = UIImageView() + private let appleButton = UIImageView() + private let naverButton = UIImageView() + private let googleButton = UIImageView() + + override func viewDidLoad() { + + super.viewDidLoad() + } + + override func setUI() { + + logoImage.do { + $0.image = .launchscreenIcon + $0.contentMode = .scaleAspectFit + } + + signinButton.do { + $0.backgroundColor = .gbbMain2 + $0.makeCornerRound(radius: 12) + } + + signupButton.do { + $0.makeCornerRound(radius: 12) + $0.makeBorder(width: 1, color: .gbbGray300!) + } + + signinLabel.do { + $0.text = "로그인" + $0.font = .headLine + $0.textColor = .gbbGray100 + $0.textAlignment = .center + } + + signupLabel.do { + $0.text = "회원가입" + $0.font = .bodyB1 + $0.textColor = .gbbGray400 + $0.textAlignment = .center + } + + latelySigninLabel.do { + $0.text = "최근에 카카오톡으로 로그인 했습니다." + $0.font = .captionB1 + $0.textColor = .gbbGray500 + $0.textAlignment = .center + $0.partColorChange(targetString: "카카오톡", textColor: .gbbMain1!) // 특정 문자열의 textColor를 변경 + } + + kakaoButton.do { + $0.image = .kakaoLoginButton + } + + appleButton.do { + $0.image = .appleLoginButton + } + + naverButton.do { + $0.image = .naverLoginButton + } + + googleButton.do { + $0.image = .googleLoginButton + } + } + + override func setLayout() { + + view.addSubviews(logoImage, signinButton, signupButton, signinLabel, signupLabel, latelySigninView, latelySigninLabel, kakaoButton, appleButton, naverButton, googleButton) + + logoImage.snp.makeConstraints { + $0.top.equalToSuperview().inset(convertByHeightRatio(190)) + $0.centerX.equalToSuperview() + $0.height.equalTo(convertByHeightRatio(179)) + } + + signinButton.snp.makeConstraints { + $0.top.equalTo(logoImage.snp.bottom).offset(convertByHeightRatio(71)) + $0.directionalHorizontalEdges.equalToSuperview().inset(24) + $0.height.equalTo(convertByHeightRatio(56)) + } + + signupButton.snp.makeConstraints { + $0.top.equalTo(signinButton.snp.bottom).offset(convertByHeightRatio(20)) + $0.directionalHorizontalEdges.equalToSuperview().inset(24) + $0.height.equalTo(convertByHeightRatio(56)) + } + + signinLabel.snp.makeConstraints { + $0.center.equalTo(signinButton.snp.center) + } + + signupLabel.snp.makeConstraints { + $0.center.equalTo(signupButton.snp.center) + } + + latelySigninView.snp.makeConstraints { + $0.top.equalTo(signupButton.snp.bottom).offset(convertByHeightRatio(65)) + $0.directionalHorizontalEdges.equalToSuperview().inset(77) + $0.height.equalTo(convertByHeightRatio(30)) + } + + latelySigninLabel.snp.makeConstraints { + $0.center.equalTo(latelySigninView.snp.center) + } + + kakaoButton.snp.makeConstraints { + $0.top.equalTo(latelySigninView.snp.bottom).offset(convertByHeightRatio(23)) + $0.leading.equalToSuperview().inset(convertByWidthRatio(45)) + $0.size.equalTo(convertByWidthRatio(56)) + } + + appleButton.snp.makeConstraints { + $0.top.equalTo(kakaoButton.snp.top) + $0.leading.equalTo(kakaoButton.snp.trailing).offset(convertByWidthRatio(20)) + $0.size.equalTo(convertByWidthRatio(56)) + } + + naverButton.snp.makeConstraints { + $0.top.equalTo(appleButton.snp.top) + $0.leading.equalTo(appleButton.snp.trailing).offset(convertByWidthRatio(20)) + $0.size.equalTo(convertByWidthRatio(56)) + } + + googleButton.snp.makeConstraints { + $0.top.equalTo(naverButton.snp.top) + $0.leading.equalTo(naverButton.snp.trailing).offset(convertByWidthRatio(20)) + $0.size.equalTo(convertByWidthRatio(56)) + } + } +} diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/Contents.json similarity index 66% rename from GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/Contents.json rename to GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/Contents.json index 64226422..4ed22a14 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "ic_splash_image@1x.png", + "filename" : "ic_launchscreen@1x.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "ic_splash_image@2x.png", + "filename" : "ic_launchscreen@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "ic_splash_image@3x.png", + "filename" : "ic_launchscreen@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f66f6c3807c6b5d1e25083bad8eacf8408c6b9c0 GIT binary patch literal 4835 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 JPDHLkV1jd@N|gWr literal 0 HcmV?d00001 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_launchscreen.imageset/ic_launchscreen@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..24220bd0ace9c32983067e56f8132c018374434f GIT binary patch literal 9624 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 literal 0 HcmV?d00001 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@1x.png deleted file mode 100644 index ce2b83215a8756700246089e885dc84ae8c4bf36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3587 zcmV+e4*c5l<5yXz_BS+#s?FSUG0fd-J6A}xGqVFr<4wLlQsmJG|wo#}f+QkKXW?gy9D?sk3v zEsMK5r1rn>&CHuOGXNHg#bU8oEEbE!VzF2(34lS$$d45BdHg~DuVtZNI!`jF<{YS2 z0beWSDx{FaiCY*c7IrgG=RAy(p&n8&hEWWX;7CP%_rVmH(rab|0!T!9pj zg+qn}eIW-VrNC|xr_nD}06<_%%t9oqdR+xk;W2~%%!7h$uqS8E$$13et z@gY2KT3eokGNgo_irX$~H%RP@vQ-f9ndE{5DDOB>3DZZ#DgpoHT5%bF_FyEPo{8J2 zQy0(@3J?le#YWYNkm8eE4OS` z0I|Apqr3_|!p%T6>*|j&21Q5-k@h!EU3z;Y!zBtE#08_f6(}eZE4>u7mBF#nm!SWi z)otwSrXeI5ndP3oT)Ku~z^lG5ka86*_0~=e7ON}keZP_TU2kC{?26`4{)Hoa8o$sK zB%H1-S2db)>?XNkUl*XL_|I%VtyBlK39$8a+jv4BLXoOng3-8oXqBoZc0J1Yc30w3 z{hD+6ZLC`hUgy^9Q#o@U=bgHDZhW; zz*uP=@@f=_G5|)P2Tt{Avb0B{3QfUr2OhVVl)s3a~VXw3N8U+db z$PwqdF$fMJz`(?Ur^O1G-*Mz{+(%e8me;OgT%ZTvbVjgh3<~wOOn5R7 zkVakc^G@erT{N}1yf*XX?$#4X0FVB;wQ}N(Q!k;pyaQc;)>b^4VecP*^VEYAZ@xn1 zZqfVX{!hI1>J={7BK~?ZK#7GDZ=HgN|G0k#LJ-I;*8>#%o=1TbpC>ebpM2g`sjkZ8;nOsVz<4G2l*jy?vx*0jl(eqFP3Sxp}>>7l?x8-`Z@X%Fb-*s&U zQUqFZ5&y0sCV7Ezc#+<>y3HU!_aI`ejoxrl{3OR9qxxAvvyIi`7H*-XHCbgc?E1rP>_;Sl+wPs;u#dSn# zlFEXhJQdc5pS~TW*A$k>J{4pj+O7}Xf7LG!fG=_JskvZ2DreJ@P!n zpOJvVsL*OBD4>Jqs0Pw{TQ?DhHLFr~FciiDc?nOqjN!I?Eyusq9iu0f{xGoYq5858 z6eZ((Lx(6ljUSh{Yf$zRl!$7?%5zkxmhCjY$yUK~fUVytYoyl-ghj%p#}~JN+$(N&tRtRm8=I-{194P$>K9hz@o>8xJ>W+>jT%89wC7h zveK-_4ja^#8L$L*B8uJyb0zUC>EpzkqiWfK^0ZZgKIrDvO%(n1_ zr?_s$+~;B$c?B$y(>dJhe=d`+Q6U^SxMy+`X_~AY2RbE01P%B48#s_)j6`K~Yym8h zk#V_kaDWMR3j*Lv+-yzEnUAuephHm>J&lBjantddD+0~<_a$ycjY61*vuHNo$&q3K zETJKHjA9tAmJ%X@R)4yoKd-lxR4U1YkBg@Abhx0fln#U&!$3Ed! zH`6cn<_`mod_`1dSjZiBN_h>F5D_T*(KD?iWR{*6uf6y7q!4ljG-I5Ueo_-+YJWyU z6lDq!7dMy6eTkn_t`-BnZag7mep;aLBh|efQ%Yp?{a(tGMiHp4(FRQDY0q$ebKt$w zRq%CiQWBzl0w0 z>m_7it^GaW3iU#-0ix!rpIR79>a4f!vg>nkTgzzvZUS9?B+2LfCYIu6ooCi3g@lvO ze-);GGzFvI`~kQRcfs9$3htv_5RO(5)n#gZQ!=g^M`E`Im%j0RnEvrE;d@{EHn@+U zLhZp5Rc7ts6OgXE~~L`=Juuee3`` zjw8#QwOlT#VRs;!gHQ1gS?K6@ehBj){93*Dvv+?2?|yIvKKlE|>US!$w!I6v6Gv5k z(E;i`fmKKlv9ny&=-Jo67<~EFJzx0~e&T{Gw63+xG7LWYvMB?wi#(9!L}ZM0h@QXRO8C{J!E@q zmP?)}%Z+7gxfNr#r{hJP`^cVU>W=edWqig?TwM}8;~rmAbG$iO+W0w~d47?$w_>#D zw;y6BuGBw)2!Km%s6BoS_zWx3Xp)G-uRD?ZylxY3?_&2zl-=V`zP zrUD5fes0+ix6T~Zud2kK)3*ut3xV}(yA|WZ!jBlrG`yd*g|_48mYLo<_|a^8Bq~D! z>BZeIL8z`H=FrkI$BwFSB=tdg79~4sUL%cW zu{ZyZLk?x#b4>u5%Aqzs%rxOb__ z^e-<$!ic4~^$bd{WqHH4BUGC=%5%OKx|T4zd1KAf!f5eq-;FCQvs1D= z&FwioR$4ecTDlg;=`^tqKW^SwAE%paK10$Jkf|Vv+Z#*k=Q>-kcbSy`Osm*p9Y2o2 zjjOqwzr7OrNg`s)bdzftaYk9OB&)-lPct7-AX*&LkHxl?Nfu0ta<-O<57M?H&v=!| z61=g&%2I?!hu>}-xNP7ZC z$2OOPN5=Yzb;}xPEsm^9tIOy&PNr4jw_PycP~KuRQ)9LcAT zzwgf=fXt2T79uD1txF5Kdi(Bjf$XbEB%tiTZ? z)s}iuB)fN2F{%}3P~eW6H(Go{_Yq&iQLQl<*^1EvW5sbM*`#;ogQX2gi=VMOwBA*e z`C5@L2Tqv}`GhSOf0&?>)ubliSu7Td#bU8oEEbE!VzETR{{Z{S8ZD&N01N;C002ov JPDHLkV1gjV&Y}PS diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@2x.png deleted file mode 100644 index af27a0821f30abd1ba9c3c23c02bb4a74c0e7542..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7222 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@3x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/splash/ic_splash_image.imageset/ic_splash_image@3x.png deleted file mode 100644 index b6b38b6c987911e356e630b6357286593dcf492e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10758 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 diff --git a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard index 865e9329..cdd745a8 100644 --- a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard +++ b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,10 @@ - - + + + - + + + @@ -11,10 +14,23 @@ - + - + + + + + + + + + + + + + + @@ -22,4 +38,10 @@ + + + + + + From 73e8720109734f85ece1a31572ae3e760959779a Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Tue, 11 Jul 2023 23:24:36 +0900 Subject: [PATCH 036/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=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 버튼, view 내부 라벨들의 슈퍼뷰 변경 --- .../Onboarding/OnboardingViewController.swift | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift index 5d849640..17fad288 100644 --- a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift @@ -87,7 +87,11 @@ class OnboardingViewController: BaseViewController { override func setLayout() { - view.addSubviews(logoImage, signinButton, signupButton, signinLabel, signupLabel, latelySigninView, latelySigninLabel, kakaoButton, appleButton, naverButton, googleButton) + view.addSubviews(logoImage, signinButton, signupButton, latelySigninView, kakaoButton, appleButton, naverButton, googleButton) + + signinButton.addSubview(signinLabel) + signupButton.addSubview(signupLabel) + latelySigninView.addSubview(latelySigninLabel) logoImage.snp.makeConstraints { $0.top.equalToSuperview().inset(convertByHeightRatio(190)) @@ -108,11 +112,11 @@ class OnboardingViewController: BaseViewController { } signinLabel.snp.makeConstraints { - $0.center.equalTo(signinButton.snp.center) + $0.center.equalToSuperview() } signupLabel.snp.makeConstraints { - $0.center.equalTo(signupButton.snp.center) + $0.center.equalToSuperview() } latelySigninView.snp.makeConstraints { @@ -122,7 +126,7 @@ class OnboardingViewController: BaseViewController { } latelySigninLabel.snp.makeConstraints { - $0.center.equalTo(latelySigninView.snp.center) + $0.center.equalToSuperview() } kakaoButton.snp.makeConstraints { From 8be649b818ac163c670ad980a9f0e8d7c366389f Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Tue, 11 Jul 2023 23:28:00 +0900 Subject: [PATCH 037/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=812?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 버튼들 이미지뷰로 때려넣었던 거 버튼으로 수정 --- .../Onboarding/OnboardingViewController.swift | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift index 17fad288..eb8c7c63 100644 --- a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift @@ -19,10 +19,10 @@ class OnboardingViewController: BaseViewController { private let signupLabel = UILabel() // 동일 private let latelySigninView = DrawDashLineView() private let latelySigninLabel = UILabel() - private let kakaoButton = UIImageView() - private let appleButton = UIImageView() - private let naverButton = UIImageView() - private let googleButton = UIImageView() + private let kakaoButton = UIButton() + private let appleButton = UIButton() + private let naverButton = UIButton() + private let googleButton = UIButton() override func viewDidLoad() { @@ -69,19 +69,19 @@ class OnboardingViewController: BaseViewController { } kakaoButton.do { - $0.image = .kakaoLoginButton + $0.setImage(.kakaoLoginButton, for: .normal) } appleButton.do { - $0.image = .appleLoginButton + $0.setImage(.appleLoginButton, for: .normal) } naverButton.do { - $0.image = .naverLoginButton + $0.setImage(.naverLoginButton, for: .normal) } googleButton.do { - $0.image = .googleLoginButton + $0.setImage(.googleLoginButton, for: .normal) } } @@ -132,25 +132,21 @@ class OnboardingViewController: BaseViewController { kakaoButton.snp.makeConstraints { $0.top.equalTo(latelySigninView.snp.bottom).offset(convertByHeightRatio(23)) $0.leading.equalToSuperview().inset(convertByWidthRatio(45)) - $0.size.equalTo(convertByWidthRatio(56)) } appleButton.snp.makeConstraints { $0.top.equalTo(kakaoButton.snp.top) $0.leading.equalTo(kakaoButton.snp.trailing).offset(convertByWidthRatio(20)) - $0.size.equalTo(convertByWidthRatio(56)) } naverButton.snp.makeConstraints { $0.top.equalTo(appleButton.snp.top) $0.leading.equalTo(appleButton.snp.trailing).offset(convertByWidthRatio(20)) - $0.size.equalTo(convertByWidthRatio(56)) } googleButton.snp.makeConstraints { $0.top.equalTo(naverButton.snp.top) $0.leading.equalTo(naverButton.snp.trailing).offset(convertByWidthRatio(20)) - $0.size.equalTo(convertByWidthRatio(56)) } } } From 03dffe30c07b1fd92ee664178446ccc2a96a73c0 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 23:29:31 +0900 Subject: [PATCH 038/153] =?UTF-8?q?[Feat]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=85=80=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListCollectionViewCell.swift | 124 +++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 9416c47b..3f3cb710 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -11,8 +11,28 @@ enum BakeryViewType { case defaultType case reviewType } + final class BakeryListCollectionViewCell: UICollectionViewCell { + // MARK: - Property + + var index = 0 + var updateData: ((Bool, Int) -> Void)? + private var bakeryViewType: BakeryViewType? = .defaultType { + didSet { + configure() + } + } + + // MARK: - UI Property + + private let markStackView = MarkStackView() + private let bakeryImage = UIImageView() + private let bakeryTitle = UILabel() + private let regionStackView = RegionStackView() + private lazy var bookMarkButton = BookmarkButton(configuration: .plain()) + private lazy var arrowButton = UIButton() + // MARK: - Life Cycle override init(frame: CGRect) { @@ -21,7 +41,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { setLayout() setUI() } - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -29,10 +49,112 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { // MARK: - Setting private func setUI() { + bakeryImage.do { + $0.backgroundColor = .darkGray + $0.makeCornerRound(radius: 5) + } + + markStackView.do { + $0.getIconImage(.smallHACCPMark, .smallVeganMark, .smallGMOMark) + } + bakeryTitle.do { + $0.basic(font: .pretendardBold(20), color: .gbbGray700!) + } } private func setLayout() { + contentView.addSubviews(bakeryImage, bakeryTitle, regionStackView) + bakeryImage.addSubview(markStackView) + + bakeryImage.snp.makeConstraints { + $0.size.equalTo(90) + $0.top.leading.equalToSuperview().offset(24) + $0.bottom.equalToSuperview().offset(-24) + } + + markStackView.snp.makeConstraints { + $0.top.leading.equalToSuperview().offset(8) + $0.height.equalTo(22) + } + + bakeryTitle.snp.makeConstraints { + $0.top.equalToSuperview().offset(24) + $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) + } + + regionStackView.snp.makeConstraints { + $0.height.equalTo(29) + $0.leading.equalTo(bakeryImage.snp.trailing).offset(24) + $0.bottom.equalToSuperview().offset(-24) + } + } + + func updateUI(data: BakeryListResponseDTO, index: Int) { + self.index = index + bakeryTitle.text = data.bakeryName + bookMarkButton.getCount(data.bookmarkCount) + bookMarkButton.updateData = { [weak self] status in + guard let self = self else { return } + self.updateData?(status, self.index) + } + bookMarkButton.isSelected = data.isBooked ? true : false + markStackView.getMarkStatus(data.isHACCP, data.isVegan, data.isNonGMO) + if data.secondNearStation == "" { + regionStackView.removeSecondRegion() + } + regionStackView.getRegionName(data.firstNearStation, data.secondNearStation ?? "") + } + + func getViewType(_ type: BakeryViewType) { + bakeryViewType = type + } + + func defaultViewButton() { + addSubview(bookMarkButton) + + bookMarkButton.do { + $0.configuration?.imagePlacement = NSDirectionalRectEdge.top + $0.configuration?.imagePadding = 4 + $0.configuration?.contentInsets = .zero + $0.addAction(UIAction { _ in + print("default") + }, for: .touchUpInside) + } + bookMarkButton.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().offset(-24) + $0.size.equalTo(34) + } + } + + func reviewViewButton() { + addSubview(arrowButton) + + regionStackView.getBackgroundColor(.gbbGray700!) + arrowButton.do { + $0.setImage(.rightArrowIcon, for: .normal) + $0.addAction(UIAction { _ in + print("review") + }, for: .touchUpInside) + } + + arrowButton.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().offset(-12) + $0.size.equalTo(23) + } + } + + func configure() { + switch bakeryViewType { + case .defaultType: + defaultViewButton() + case .reviewType: + reviewViewButton() + case .none: + return + } } } From d71415a1f3f0f94252beea3420650d402b28e5dc Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 23:50:58 +0900 Subject: [PATCH 039/153] =?UTF-8?q?[Fix]=20#36=20-=20=EB=8D=94=EB=AF=B8=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Model/BakeryListResponseDTO.swift | 18 +++++++++++++----- .../Home/Model/HomeBestBakeryResponseDTO.swift | 6 ++++-- .../Home/Model/HomeBestReviewResponseDTO.swift | 12 ++++++++---- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index 43c3a9cf..46aface9 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -8,10 +8,14 @@ // MARK: - BakeryListResponseDTO struct BakeryListResponseDTO: Hashable { let bakeryID: Int - let bakeryName, bakeryPicture: String - let isHACCP, isVegan, isNonGMO: Bool + let bakeryName: String + let bakeryPicture: String + let isHACCP: Bool + let isVegan: Bool + let isNonGMO: Bool let breadType: BreadType - let firstNearStation, secondNearStation: String + let firstNearStation: String + let secondNearStation: String? let isBooked: Bool let bookmarkCount: Int } @@ -21,10 +25,14 @@ struct BakeryListResponseDTO: Hashable { struct BreadType: Hashable { let breadTypeID: Int let breadTypeName: String - let isGlutenFree, isVegan, isNutFree, isSugarFree: Bool + let isGlutenFree: Bool + let isVegan: Bool + let isNutFree: Bool + let isSugarFree: Bool } extension BakeryListResponseDTO { - static let item: [BakeryListResponseDTO] = [BakeryListResponseDTO(bakeryID: 1, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: false, breadType: breadItem, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7)] + static let item: [BakeryListResponseDTO] = [BakeryListResponseDTO(bakeryID: 1, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: false, isVegan: true, isNonGMO: false, breadType: breadItem, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7), + BakeryListResponseDTO(bakeryID: 2, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: false, isNonGMO: true, breadType: breadItem, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7)] static let breadItem: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: false, isNutFree: false, isSugarFree: false) } diff --git a/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestBakeryResponseDTO.swift b/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestBakeryResponseDTO.swift index d66d0fd3..a64bd806 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestBakeryResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestBakeryResponseDTO.swift @@ -10,9 +10,11 @@ struct HomeBestBakeryResponseDTO: Hashable { let bakeryID: Int let bakeryName: String - let isHACCP, isVegan: Bool + let isHACCP: Bool + let isVegan: Bool let isNONGMO: Bool - let firstNearStation, secondNearStation: String + let firstNearStation: String + let secondNearStation: String? let isBooked: Bool let bookmarkCount: Int let bakeryPicture: String diff --git a/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestReviewResponseDTO.swift b/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestReviewResponseDTO.swift index 2c8ea709..7ca41b96 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestReviewResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Model/HomeBestReviewResponseDTO.swift @@ -13,14 +13,18 @@ struct HomeBestReviewResponseDTO: Hashable { let bakeryID: Int let bakeryName: String - let isHACCP, isVegan: Bool - let isNONGMO: Bool? - let firstNearStation, secondNearStation: String + let isHACCP: Bool + let isVegan: Bool + let isNONGMO: Bool + let firstNearStation: String + let secondNearStation: String? let isBooked: Bool let bookmarkCount: Int let bakeryPicture: String let reviewCount: Int - let reviewText, firstMaxRecommendKeyword, secondMaxRecommendKeyword: String + let reviewText: String + let firstMaxRecommendKeyword: String + let secondMaxRecommendKeyword: String? } extension HomeBestReviewResponseDTO { From 149e32793ca12e24c61fe76c0a88d527a4573630 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Tue, 11 Jul 2023 23:51:27 +0900 Subject: [PATCH 040/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=813?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit String Literal 추가 --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 6 ++++++ .../Presentation/Onboarding/OnboardingViewController.swift | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 7dbc24c1..8bba192b 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -17,4 +17,10 @@ struct I18N { - 건빵은 건강한 빵집의 위치와 성분 정보를 제공하여 소비자의 선택을 돕는 용도의 서비스입니다. 건빵의 모든 정보는 제조사에서 제공한 정보입니다. 이는 소비자의 구매를 돕기 위한 참고 사항이며, 제공 정보의 오류에 대한 책임을 지지 않습니다. """ } + + /// Onboarding + struct Onboarding { + static let latelySigninText = "최근에 카카오톡으로 로그인 했습니다." + static let latelySigninSNS = "카카오톡" + } } diff --git a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift index 411850c1..3fa9362b 100644 --- a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift @@ -1,4 +1,3 @@ - // // OnboardingViewController.swift // GEON-PPANG-iOS @@ -62,11 +61,11 @@ class OnboardingViewController: BaseViewController { } latelySigninLabel.do { - $0.text = "최근에 카카오톡으로 로그인 했습니다." + $0.text = I18N.Onboarding.latelySigninText $0.font = .captionB1 $0.textColor = .gbbGray500 $0.textAlignment = .center - $0.partColorChange(targetString: "카카오톡", textColor: .gbbMain1!) // 특정 문자열의 textColor를 변경 + $0.partColorChange(targetString: I18N.Onboarding.latelySigninSNS, textColor: .gbbMain1!) // 특정 문자열의 textColor를 변경 } kakaoButton.do { From c2c2518decd25164ca84c5e8a59450f1d5a99e1c Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 23:56:55 +0900 Subject: [PATCH 041/153] =?UTF-8?q?[Move]=20#36=20-=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=ED=8F=B4=EB=8D=94=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 20 +++++++++++++------ .../{ => Model}/BakeryFilterItems.swift | 0 .../BakeryFilterView.swift | 0 .../BakeryListTopView.swift | 1 + 4 files changed, 15 insertions(+), 6 deletions(-) rename GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/{ => Model}/BakeryFilterItems.swift (100%) rename GEON-PPANG-iOS/Presentation/BakeryList/{ViewControllers => Views}/BakeryFilterView.swift (100%) rename GEON-PPANG-iOS/Presentation/BakeryList/{ViewControllers => Views}/BakeryListTopView.swift (98%) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 4172d43f..62e9dbaf 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -38,13 +38,13 @@ 0961C3642A501EBF0031A822 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0961C3632A501EBF0031A822 /* Strings.swift */; }; 097682DA2A5C829D0008F4FB /* GradientImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682D92A5C829D0008F4FB /* GradientImageView.swift */; }; 097682DC2A5C83910008F4FB /* CGFloat+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682DB2A5C83910008F4FB /* CGFloat+.swift */; }; - 0987288D2A5BA1F000A29402 /* BookmarkButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */; }; 097682DF2A5C91280008F4FB /* BakeryListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682DE2A5C91280008F4FB /* BakeryListResponseDTO.swift */; }; 097682E32A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */; }; 097682E52A5C99340008F4FB /* BakeryFilterItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */; }; 097682E72A5CF0080008F4FB /* BakeryFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */; }; 097682E92A5D0B6B0008F4FB /* BakeryListTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */; }; 097682EB2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */; }; + 0987288D2A5BA1F000A29402 /* BookmarkButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */; }; 098F32EA2A4200FE0092D09A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 098F32E92A4200FE0092D09A /* Assets.xcassets */; }; 098F32ED2A4200FE0092D09A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 098F32EB2A4200FE0092D09A /* LaunchScreen.storyboard */; }; 099FC1C62A51F19300116D00 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 099FC1C52A51F19300116D00 /* GoogleService-Info.plist */; }; @@ -99,13 +99,13 @@ 0961C3632A501EBF0031A822 /* Strings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; 097682D92A5C829D0008F4FB /* GradientImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientImageView.swift; sourceTree = ""; }; 097682DB2A5C83910008F4FB /* CGFloat+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGFloat+.swift"; sourceTree = ""; }; - 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkButton.swift; sourceTree = ""; }; 097682DE2A5C91280008F4FB /* BakeryListResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListResponseDTO.swift; sourceTree = ""; }; 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterCollectionViewCell.swift; sourceTree = ""; }; 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterItems.swift; sourceTree = ""; }; 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterView.swift; sourceTree = ""; }; 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListTopView.swift; sourceTree = ""; }; 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListCollectionViewCell.swift; sourceTree = ""; }; + 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkButton.swift; sourceTree = ""; }; 098F32DD2A4200FD0092D09A /* GEON-PPANG-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GEON-PPANG-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 098F32E02A4200FD0092D09A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 098F32E22A4200FD0092D09A /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -378,11 +378,21 @@ 097682DD2A5C91050008F4FB /* Model */ = { isa = PBXGroup; children = ( + 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */, 097682DE2A5C91280008F4FB /* BakeryListResponseDTO.swift */, ); path = Model; sourceTree = ""; }; + 0979852E2A5D9DBF004263E5 /* Views */ = { + isa = PBXGroup; + children = ( + 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */, + 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */, + ); + path = Views; + sourceTree = ""; + }; 098F32D42A4200FD0092D09A = { isa = PBXGroup; children = ( @@ -443,6 +453,7 @@ 09B13F4D2A593C7600C0C723 /* BakeryList */ = { isa = PBXGroup; children = ( + 0979852E2A5D9DBF004263E5 /* Views */, 09B13F4E2A593CAE00C0C723 /* ViewControllers */, ); path = BakeryList; @@ -451,12 +462,9 @@ 09B13F4E2A593CAE00C0C723 /* ViewControllers */ = { isa = PBXGroup; children = ( - 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */, - 097682E42A5C99340008F4FB /* BakeryFilterItems.swift */, 09B13F4F2A593CB800C0C723 /* BakeryListViewController.swift */, + 097682E22A5C95750008F4FB /* BakeryFilterCollectionViewCell.swift */, 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */, - 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */, - 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */, 097682DD2A5C91050008F4FB /* Model */, ); path = ViewControllers; diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryFilterItems.swift similarity index 100% rename from GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterItems.swift rename to GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryFilterItems.swift diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift similarity index 100% rename from GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterView.swift rename to GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift similarity index 98% rename from GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift rename to GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift index edc1ab3c..def4399c 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListTopView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift @@ -36,6 +36,7 @@ final class BakeryListTopView: UIView { hStackView.do { $0.axis = .horizontal $0.spacing = 8 + $0.sizeToFit() } bakeryTitle.do { From c04579d2ead897e99f2c3ddc9c2a0234f0db4e20 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 23:57:56 +0900 Subject: [PATCH 042/153] =?UTF-8?q?[Fix]=20#36=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListCollectionViewCell.swift | 2 +- .../ViewControllers/BakeryListViewController.swift | 11 +++++++---- .../Common/StackView/RegionStackView.swift | 2 +- .../HomeBakeryCollectionViewCell.swift | 5 ++++- .../HomeReviewCollectionViewCell.swift | 3 +-- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 3f3cb710..7ce345d4 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -98,7 +98,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { guard let self = self else { return } self.updateData?(status, self.index) } - bookMarkButton.isSelected = data.isBooked ? true : false + bookMarkButton.isSelected = data.isBooked markStackView.getMarkStatus(data.isHACCP, data.isVegan, data.isNonGMO) if data.secondNearStation == "" { regionStackView.removeSecondRegion() diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index 673c06e6..57d262ee 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -11,7 +11,7 @@ import SnapKit import Then final class BakeryListViewController: BaseViewController { - + // MARK: - Property enum Section { @@ -27,17 +27,18 @@ final class BakeryListViewController: BaseViewController { private let bakeryTopView = BakeryListTopView() private let bakeryFilterView = BakeryFilterView() private lazy var bakeryListCollectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) - + // MARK: - Life Cycle override func viewDidLoad() { - super.viewDidLoad() + super.viewDidLoad() setRegister() setupDataSource() setReloadData() } + override func setUI() { bakeryFilterView.do { $0.backgroundColor = .clear @@ -74,7 +75,7 @@ final class BakeryListViewController: BaseViewController { var config = UICollectionLayoutListConfiguration(appearance: .plain) config.backgroundColor = .clear config.showsSeparators = true - + let layout = UICollectionViewCompositionalLayout.list(using: config) return layout } @@ -82,6 +83,8 @@ final class BakeryListViewController: BaseViewController { private func setupDataSource() { dataSource = DataSource(collectionView: bakeryListCollectionView, cellProvider: { collectionView, indexPath, item in let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.defaultType) + cell.updateUI(data: item, index: indexPath.item) return cell }) } diff --git a/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift b/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift index 0adea678..e225f65c 100644 --- a/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift @@ -46,7 +46,7 @@ final class RegionStackView: UIStackView { $0.textColor = .gbbGray100 } } - + func getRegionName(_ first: String, _ second: String) { regionFirstTag.text = first regionSeconodTag.text = second diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift index 2837e565..16e5f253 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift @@ -61,6 +61,9 @@ final class HomeBakeryCollectionViewCell: UICollectionViewCell { $0.contentMode = .scaleAspectFill $0.backgroundColor = .gbbPoint1 } + markStackView.do { + $0.getIconImage(.bigHACCPMark, .bigVeganMark, .bigGMOMark) + } [bakeryTitle, bakeryReview].forEach { $0.do { @@ -132,6 +135,6 @@ final class HomeBakeryCollectionViewCell: UICollectionViewCell { if data.secondNearStation == "" { regionStackView.removeSecondRegion() } - regionStackView.getRegionName(data.firstNearStation, data.secondNearStation) + regionStackView.getRegionName(data.firstNearStation, data.secondNearStation ?? "") } } diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift index c5f8a6bd..67c80d1f 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift @@ -110,7 +110,6 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { guard let self = self else { return } self.updateData?(status, self.index) } - bookMarkButton.isSelected = data.isBooked ? true: false - + bookMarkButton.isSelected = data.isBooked } } From 1136df15fe956417880586c2a29853af8e4ecc2b Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Tue, 11 Jul 2023 23:58:32 +0900 Subject: [PATCH 043/153] =?UTF-8?q?[Add]=20#36=20-=20getIconImage=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common/StackView/MarkStackView.swift | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift index 223393c7..b7ec1dda 100644 --- a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift @@ -39,16 +39,16 @@ final class MarkStackView: UIStackView { $0.spacing = -9 $0.axis = .horizontal } + hccpMarkIconView.do { - $0.image = .bigHACCPMark - $0.contentMode = .scaleAspectFit + $0.contentMode = .topLeft } + veganIconView.do { - $0.image = .bigVeganMark $0.contentMode = .topLeft } + gmoIconView.do { - $0.image = .bigGMOMark $0.contentMode = .topLeft } } @@ -61,6 +61,12 @@ final class MarkStackView: UIStackView { } } + func getIconImage(_ haccp: UIImage, _ vegan: UIImage, _ gmo: UIImage) { + hccpMarkIconView.image = haccp + veganIconView.image = vegan + gmoIconView.image = gmo + } + func getMarkStatus(_ isHACCP: Bool, _ isVegan: Bool, _ isNONGMO: Bool) { if !isHACCP { hccpMarkIconView.isHidden = true From 6687564f800ca4f8a93a29e38984b2a4e6842a1f Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Wed, 12 Jul 2023 00:02:49 +0900 Subject: [PATCH 044/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=814?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 사용하지 않는 viewDidLoad 삭제 --- .../Presentation/Onboarding/OnboardingViewController.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift index 3fa9362b..90c0ac20 100644 --- a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift @@ -24,11 +24,6 @@ class OnboardingViewController: BaseViewController { private let naverButton = UIButton() private let googleButton = UIButton() - override func viewDidLoad() { - - super.viewDidLoad() - } - override func setUI() { logoImage.do { From 0bb6c2fabaf86138c1f3e5a6a6b45da052e9159e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 03:11:24 +0900 Subject: [PATCH 045/153] =?UTF-8?q?[Feat]=20#40=20-=20search=20=EB=84=A4?= =?UTF-8?q?=EB=B9=84=EA=B2=8C=EC=9D=B4=EC=85=98=EB=B7=B0=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 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 12 ++++ .../SearchViewController.swift | 33 ++++++++-- .../Search/Views/SearchNavigationView.swift | 66 +++++++++++++++++++ 3 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 3c9ed386..31673d89 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -58,6 +58,7 @@ 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3EFB2A569E4A0063897A /* URLConstant.swift */; }; 09CA3F062A569EB30063897A /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F052A569EB30063897A /* API.swift */; }; 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; + 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; @@ -117,6 +118,7 @@ 09CA3EFB2A569E4A0063897A /* URLConstant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLConstant.swift; sourceTree = ""; }; 09CA3F052A569EB30063897A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; + 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; @@ -218,6 +220,7 @@ 093214032A5AE3C000875EF6 /* Search */ = { isa = PBXGroup; children = ( + 09FD47C62A5DC97E002020BD /* Views */, 093214052A5AE3D600875EF6 /* ViewControllers */, ); path = Search; @@ -461,6 +464,14 @@ path = Model; sourceTree = ""; }; + 09FD47C62A5DC97E002020BD /* Views */ = { + isa = PBXGroup; + children = ( + 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */, + ); + path = Views; + sourceTree = ""; + }; 3E79B19B2A54523400D36A26 /* Button */ = { isa = PBXGroup; children = ( @@ -644,6 +655,7 @@ 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, + 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, 097682DC2A5C83910008F4FB /* CGFloat+.swift in Sources */, 0924632F2A5BA0F200B6F65D /* HomeBakeryCollectionViewCell.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift index abe039ad..d3ec0584 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift @@ -7,11 +7,36 @@ import UIKit -final class SearchViewController: UIViewController { +import SnapKit +import Then - override func viewDidLoad() { - super.viewDidLoad() +final class SearchViewController: BaseViewController { + + // MARK: - Property + + private lazy var safeArea = self.view.safeAreaLayoutGuide + + // MARK: - UI Property + + private let naviView = SearchNavigationView() + + // MARK: - Setting + + override func setLayout() { + view.addSubview(naviView) - view.backgroundColor = .purple + naviView.snp.makeConstraints { + $0.top.equalTo(safeArea) + $0.directionalHorizontalEdges.equalTo(safeArea) + $0.height.equalTo(convertByHeightRatio(68)) + } + } + + override func setUI() { + naviView.do { + $0.dismissClosure = { + self.navigationController?.popViewController(animated: true) + } + } } } diff --git a/GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift b/GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift new file mode 100644 index 00000000..06212916 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift @@ -0,0 +1,66 @@ +// +// SearchNavigationView.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class SearchNavigationView: UIView { + + // MARK: - Property + + var dismissClosure: (() -> Void)? + + // MARK: - UI Property + + private lazy var backButton = UIButton() + private let searchTextField = SearchTextField() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: -Setting + + private func setLayout() { + addSubviews(backButton, searchTextField) + + backButton.snp.makeConstraints { + $0.top.equalToSuperview().offset(10) + $0.leading.equalToSuperview().offset(5) + $0.size.equalTo(48) + } + + searchTextField.snp.makeConstraints { + $0.directionalVerticalEdges.equalToSuperview().inset(10) + $0.leading.equalTo(backButton.snp.trailing) + $0.trailing.equalToSuperview().inset(24) + } + } + + private func setUI() { + searchTextField.do { + $0.viewType(.search) + } + backButton.do { + $0.setImage(.leftArrowIcon, for: .normal) + $0.addAction(UIAction { [weak self] _ in + self?.dismissClosure?() + }, for: .touchUpInside) + } + } +} From 107b8be861d9116c1f0bf91b47d3c9faf8cc100e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 03:54:48 +0900 Subject: [PATCH 046/153] =?UTF-8?q?[Feat]=20#40=20-=20search=20result?= =?UTF-8?q?=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 ++ .../SearchViewController.swift | 12 +++- .../Search/Views/SearchResultView.swift | 66 +++++++++++++++++++ 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 31673d89..5432e6fc 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -59,6 +59,7 @@ 09CA3F062A569EB30063897A /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F052A569EB30063897A /* API.swift */; }; 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */; }; + 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C92A5DD38D002020BD /* SearchResultView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; @@ -119,6 +120,7 @@ 09CA3F052A569EB30063897A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; + 09FD47C92A5DD38D002020BD /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; @@ -468,6 +470,7 @@ isa = PBXGroup; children = ( 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */, + 09FD47C92A5DD38D002020BD /* SearchResultView.swift */, ); path = Views; sourceTree = ""; @@ -701,6 +704,7 @@ 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, + 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift index d3ec0584..3ec07811 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift @@ -19,17 +19,24 @@ final class SearchViewController: BaseViewController { // MARK: - UI Property private let naviView = SearchNavigationView() + private let searchResultView = SearchResultView() // MARK: - Setting override func setLayout() { - view.addSubview(naviView) + view.addSubviews(naviView, searchResultView) naviView.snp.makeConstraints { $0.top.equalTo(safeArea) $0.directionalHorizontalEdges.equalTo(safeArea) $0.height.equalTo(convertByHeightRatio(68)) } + + searchResultView.snp.makeConstraints { + $0.top.equalTo(naviView.snp.bottom) + $0.directionalHorizontalEdges.equalTo(safeArea) + $0.height.equalTo(convertByHeightRatio(55)) + } } override func setUI() { @@ -38,5 +45,8 @@ final class SearchViewController: BaseViewController { self.navigationController?.popViewController(animated: true) } } + searchResultView.do { + $0.updateUI(count: 3) + } } } diff --git a/GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift b/GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift new file mode 100644 index 00000000..d11fe828 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift @@ -0,0 +1,66 @@ +// +// SearchResultView.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class SearchResultView: UIView { + + // MARK: - Property + + // MARK: - UI Property + + private let resultLabel = UILabel() + private let lineView = UIView() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubviews(resultLabel, lineView) + + resultLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(12) + $0.leading.equalToSuperview().offset(24) + } + + lineView.snp.makeConstraints { + $0.height.equalTo(1) + $0.directionalHorizontalEdges.equalToSuperview() + $0.bottom.equalToSuperview() + } + } + + private func setUI() { + resultLabel.do { + $0.basic(font: .headLine!, color: .gbbGray600!) + } + + lineView.do { + $0.makeBorder(width: 1, color: .gbbGray200!) + } + } + + func updateUI(count: Int) { + resultLabel.text = "건빵집 결과 \(count)개" + resultLabel.partColorChange(targetString: "\(count)개", textColor: .gbbPoint1!) + } +} From f762c93dc00b1cfe3bf96c3121791b8da41ffe2b Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Wed, 12 Jul 2023 04:19:47 +0900 Subject: [PATCH 047/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=815?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit class에 final 키워드 추가 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 5 +---- .../xcshareddata/xcschemes/GEON-PPANG-iOS.xcscheme | 2 +- GEON-PPANG-iOS/Presentation/Common/DrawDashLineView.swift | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index aff83ba2..04c053b4 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -560,7 +560,7 @@ attributes = { BuildIndependentTargetsInParallel = 1; LastSwiftUpdateCheck = 1420; - LastUpgradeCheck = 1420; + LastUpgradeCheck = 1430; TargetAttributes = { 098F32DC2A4200FD0092D09A = { CreatedOnToolsVersion = 14.2; @@ -658,7 +658,6 @@ 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, - DFAF7C992A5C921B00A93E19 /* DrawDashLineView.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, 097682DC2A5C83910008F4FB /* CGFloat+.swift in Sources */, 0924632F2A5BA0F200B6F65D /* HomeBakeryCollectionViewCell.swift in Sources */, @@ -701,11 +700,9 @@ 09C626562A5B3572002C8110 /* HomeBestReviewResponseDTO.swift in Sources */, 090556472A51E7D900752067 /* UITextView+.swift in Sources */, 0905562B2A51DBCE00752067 /* UIStackView+.swift in Sources */, - DFAF7C972A5C6CD300A93E19 /* OnboardingViewController.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */, 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */, - 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/GEON-PPANG-iOS.xcodeproj/xcshareddata/xcschemes/GEON-PPANG-iOS.xcscheme b/GEON-PPANG-iOS.xcodeproj/xcshareddata/xcschemes/GEON-PPANG-iOS.xcscheme index 05ff9a2a..58878658 100644 --- a/GEON-PPANG-iOS.xcodeproj/xcshareddata/xcschemes/GEON-PPANG-iOS.xcscheme +++ b/GEON-PPANG-iOS.xcodeproj/xcshareddata/xcschemes/GEON-PPANG-iOS.xcscheme @@ -1,6 +1,6 @@ Date: Wed, 12 Jul 2023 04:32:34 +0900 Subject: [PATCH 048/153] =?UTF-8?q?[Feat]=20#40=20-=20search=20Initial=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EB=B7=B0=EC=85=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 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 ++ .../SearchInitialCollectionViewCell.swift | 60 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 94dead9f..72fe294e 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -62,6 +62,7 @@ 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */; }; 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C92A5DD38D002020BD /* SearchResultView.swift */; }; + 09FD47CC2A5DE167002020BD /* SearchInitialCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; @@ -126,6 +127,7 @@ 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; 09FD47C92A5DD38D002020BD /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; + 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchInitialCollectionViewCell.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; @@ -238,6 +240,7 @@ isa = PBXGroup; children = ( 093214072A5AE40900875EF6 /* SearchViewController.swift */, + 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */, ); path = ViewControllers; sourceTree = ""; @@ -681,6 +684,7 @@ buildActionMask = 2147483647; files = ( 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, + 09FD47CC2A5DE167002020BD /* SearchInitialCollectionViewCell.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift new file mode 100644 index 00000000..645cb897 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift @@ -0,0 +1,60 @@ +// +// SearchInitialCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +final class SearchInitialCollectionViewCell: UICollectionViewCell { + + // MARK: - Property + + // MARK: - UI Property + + private let initialIcon = UIImageView() + private let initialLabel = UILabel() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubviews(initialIcon, initialLabel) + + initialIcon.snp.makeConstraints { + $0.size.equalTo(CGSize(width: 154, height: 132)) + $0.centerX.equalToSuperview() + } + + initialLabel.snp.makeConstraints { + $0.top.equalTo(initialIcon.snp.bottom).offset(20) + $0.centerY.equalToSuperview().inset(-35) + $0.centerX.equalToSuperview() + } + } + + private func setUI() { + initialIcon.do { + $0.contentMode = .scaleAspectFit + } + initialLabel.do { + $0.textAlignment = .center + $0.basic(text: "궁금하신 건빵집을 \n검색해보세요!", font: .pretendardBold(20), color: .gbbGray300!) + } + + } + +} From 2617aa92aad8f18993fcf5a3434ef8f76037c108 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 04:46:25 +0900 Subject: [PATCH 049/153] =?UTF-8?q?[Feat]=20#40=20-=20search=20empty=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=EB=B7=B0=EC=85=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 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 ++ .../SearchEmptyCollectionViewCell.swift | 62 +++++++++++++++++++ .../SearchInitialCollectionViewCell.swift | 4 ++ 3 files changed, 70 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 72fe294e..358d8fa9 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -63,6 +63,7 @@ 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */; }; 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C92A5DD38D002020BD /* SearchResultView.swift */; }; 09FD47CC2A5DE167002020BD /* SearchInitialCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */; }; + 09FD47CE2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47CD2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; @@ -128,6 +129,7 @@ 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; 09FD47C92A5DD38D002020BD /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchInitialCollectionViewCell.swift; sourceTree = ""; }; + 09FD47CD2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEmptyCollectionViewCell.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; @@ -241,6 +243,7 @@ children = ( 093214072A5AE40900875EF6 /* SearchViewController.swift */, 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */, + 09FD47CD2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift */, ); path = ViewControllers; sourceTree = ""; @@ -703,6 +706,7 @@ 09CA3EF82A5676AA0063897A /* CommonButton.swift in Sources */, 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */, 09C626582A5B4269002C8110 /* HomeHeaderView.swift in Sources */, + 09FD47CE2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift in Sources */, 0915C1722A5C3D3700ACB8D4 /* PaddingLabel.swift in Sources */, 090556222A51DB3300752067 /* UIFont+.swift in Sources */, 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift new file mode 100644 index 00000000..2dbf6426 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift @@ -0,0 +1,62 @@ +// +// SearchEmptyCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +final class SearchEmptyCollectionViewCell: UICollectionViewCell { + + // MARK: - Property + + // MARK: - UI Property + + private let initialIcon = UIImageView() + private let initialLabel = UILabel() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubviews(initialIcon, initialLabel) + + initialIcon.snp.makeConstraints { + $0.size.equalTo(CGSize(width: 154, height: 132)) + $0.centerX.equalToSuperview() + } + + initialLabel.snp.makeConstraints { + $0.top.equalTo(initialIcon.snp.bottom).offset(20) + $0.centerY.equalToSuperview().inset(-33) + $0.centerX.equalToSuperview() + } + } + + private func setUI() { + initialIcon.do { + $0.contentMode = .scaleAspectFit + $0.image = .noSearchResultImage + } + initialLabel.do { + $0.textAlignment = .center + $0.basic(text: "검색결과가 없어요\n다른 키워드로 검색해보세요!", font: .pretendardBold(20), color: .gbbGray300!) + $0.partFontChange(targetString: "다른 키워드로 검색해보세요!", font: .pretendardMedium(15)) + } + + } + +} diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift index 645cb897..80c17ad6 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift @@ -7,6 +7,9 @@ import UIKit +import SnapKit +import Then + final class SearchInitialCollectionViewCell: UICollectionViewCell { // MARK: - Property @@ -49,6 +52,7 @@ final class SearchInitialCollectionViewCell: UICollectionViewCell { private func setUI() { initialIcon.do { $0.contentMode = .scaleAspectFit + $0.image = .searchImage } initialLabel.do { $0.textAlignment = .center From ea17411e2c3724db560b3b2e90cc44f5f2ed48d8 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 05:08:06 +0900 Subject: [PATCH 050/153] [Feat] #39 - FilterViewControllers added --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 36 +++++++++++++++++ .../FilterBreadTypeViewController.swift | 39 +++++++++++++++++++ .../FilterIngredientViewController.swift | 39 +++++++++++++++++++ .../FilterPurposeViewController.swift | 39 +++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift create mode 100644 GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift create mode 100644 GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 7aa7adf1..b0b776a6 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -65,6 +65,9 @@ 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */; }; + 3EDC05BE2A5DED4400EAD950 /* FilterPurposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */; }; + 3EDC05C02A5DED9200EAD950 /* FilterBreadTypeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */; }; + 3EDC05C22A5DED9D00EAD950 /* FilterIngredientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */; }; DF959A612A539FBE00E75774 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */; }; DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; DF959A6C2A568C4600E75774 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DF959A6B2A568C4600E75774 /* Colors.xcassets */; }; @@ -127,6 +130,9 @@ 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeLiteral.swift; sourceTree = ""; }; + 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterPurposeViewController.swift; sourceTree = ""; }; + 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBreadTypeViewController.swift; sourceTree = ""; }; + 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterIngredientViewController.swift; sourceTree = ""; }; DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; DF959A6B2A568C4600E75774 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; @@ -314,6 +320,7 @@ 0961C36A2A501EF60031A822 /* Presentation */ = { isa = PBXGroup; children = ( + 3EDC05BA2A5DEB7500EAD950 /* Filter */, 093214032A5AE3C000875EF6 /* Search */, 09B13F492A593C5900C0C723 /* Home */, 09B13F4D2A593C7600C0C723 /* BakeryList */, @@ -517,6 +524,32 @@ path = Base; sourceTree = ""; }; + 3EDC05BA2A5DEB7500EAD950 /* Filter */ = { + isa = PBXGroup; + children = ( + 3EDC05BC2A5DEB7F00EAD950 /* Views */, + 3EDC05BB2A5DEB7B00EAD950 /* ViewControllers */, + ); + path = Filter; + sourceTree = ""; + }; + 3EDC05BB2A5DEB7B00EAD950 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */, + 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */, + 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; + 3EDC05BC2A5DEB7F00EAD950 /* Views */ = { + isa = PBXGroup; + children = ( + ); + path = Views; + sourceTree = ""; + }; DF959A672A56851000E75774 /* Enum */ = { isa = PBXGroup; children = ( @@ -669,6 +702,7 @@ 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, + 3EDC05C02A5DED9200EAD950 /* FilterBreadTypeViewController.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, 097682DC2A5C83910008F4FB /* CGFloat+.swift in Sources */, 0924632F2A5BA0F200B6F65D /* HomeBakeryCollectionViewCell.swift in Sources */, @@ -687,6 +721,8 @@ 0915C1722A5C3D3700ACB8D4 /* PaddingLabel.swift in Sources */, 090556222A51DB3300752067 /* UIFont+.swift in Sources */, 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */, + 3EDC05BE2A5DED4400EAD950 /* FilterPurposeViewController.swift in Sources */, + 3EDC05C22A5DED9D00EAD950 /* FilterIngredientViewController.swift in Sources */, 09C6264E2A5B29F8002C8110 /* SearchEnum.swift in Sources */, 0915C16A2A5BFC5900ACB8D4 /* HomeBottomCollectionViewCell.swift in Sources */, 09CA3F082A569EBA0063897A /* Service.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift new file mode 100644 index 00000000..9f8ef6bf --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -0,0 +1,39 @@ +// +// FilterBreadTypeViewController.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class FilterBreadTypeViewController: BaseViewController { + + // MARK: - Property + + + + // MARK: - UI Property + + + + // MARK: - Life Cycle + + + + // MARK: - Setting + + + + // MARK: - Action Helper + + + + // MARK: - Custom Method + + + +} diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift new file mode 100644 index 00000000..12036559 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -0,0 +1,39 @@ +// +// FilterIngredientViewController.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class FilterIngredientViewController: BaseViewController { + + // MARK: - Property + + + + // MARK: - UI Property + + + + // MARK: - Life Cycle + + + + // MARK: - Setting + + + + // MARK: - Action Helper + + + + // MARK: - Custom Method + + + +} diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift new file mode 100644 index 00000000..b12493fa --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -0,0 +1,39 @@ +// +// FilterPurposeViewController.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class FilterPurposeViewController: BaseViewController { + + // MARK: - Property + + + + // MARK: - UI Property + + + + // MARK: - Life Cycle + + + + // MARK: - Setting + + + + // MARK: - Action Helper + + + + // MARK: - Custom Method + + + +} From a362b71034f865053e9c38c9f3eabb4be3ef8668 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Wed, 12 Jul 2023 05:31:38 +0900 Subject: [PATCH 051/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=816?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gray50, gray800 -> white, black으로 수정, 임시 버튼들 공통 버튼으로 변경 --- .../Global/Extensions/Design/UIColor+.swift | 4 +- .../Common/Button/CommonButton.swift | 12 ++--- .../Onboarding/OnboardingViewController.swift | 52 ++++++------------- .../Contents.json | 0 .../Contents.json | 0 5 files changed, 21 insertions(+), 47 deletions(-) rename GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/{gray-800.colorset => black.colorset}/Contents.json (100%) rename GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/{gray-50.colorset => white.colorset}/Contents.json (100%) diff --git a/GEON-PPANG-iOS/Global/Extensions/Design/UIColor+.swift b/GEON-PPANG-iOS/Global/Extensions/Design/UIColor+.swift index c1dfd1b1..8451c597 100644 --- a/GEON-PPANG-iOS/Global/Extensions/Design/UIColor+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/Design/UIColor+.swift @@ -25,7 +25,7 @@ extension UIColor { static let gbbBackground1 = UIColor(named: "Background_1") static let gbbBackground2 = UIColor(named: "Background_2") - static let gbbGray50 = UIColor(named: "gray-50") + static let gbbWhite = UIColor(named: "white") static let gbbGray100 = UIColor(named: "gray-100") static let gbbGray200 = UIColor(named: "gray-200") static let gbbGray300 = UIColor(named: "gray-300") @@ -33,5 +33,5 @@ extension UIColor { static let gbbGray500 = UIColor(named: "gray-500") static let gbbGray600 = UIColor(named: "gray-600") static let gbbGray700 = UIColor(named: "gray-700") - static let gbbGray800 = UIColor(named: "gray-800") + static let gbbBlack = UIColor(named: "black") } diff --git a/GEON-PPANG-iOS/Presentation/Common/Button/CommonButton.swift b/GEON-PPANG-iOS/Presentation/Common/Button/CommonButton.swift index 59e0c24f..b5663989 100644 --- a/GEON-PPANG-iOS/Presentation/Common/Button/CommonButton.swift +++ b/GEON-PPANG-iOS/Presentation/Common/Button/CommonButton.swift @@ -40,7 +40,7 @@ final class CommonButton: UIButton { private func setUI() { self.do { - $0.makeCornerRound(radius: 11) + $0.makeCornerRound(radius: 12) $0.titleLabel?.font = .headLine } } @@ -52,17 +52,13 @@ final class CommonButton: UIButton { func getButtonUI(_ color: UIColor, _ border: UIColor? = .clear) { self.backgroundColor = color switch color { - case .gbbMain3!, .gbbGray700!: setTitleColor(.gbbGray100, for: .normal) - case .gbbMain2!: setTitleColor(.white, for: .normal) + case .gbbMain2!, .gbbGray700!: setTitleColor(.gbbGray100, for: .normal) default: setTitleColor(.gbbGray400, for: .normal) } - if let border = border { - makeBorder(width: 1, color: border) - if border != .clear { - setTitleColor(border, for: .normal) - } + if border != .clear { + makeBorder(width: 1, color: border!) } } diff --git a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift index 90c0ac20..fece6113 100644 --- a/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Onboarding/OnboardingViewController.swift @@ -10,19 +10,21 @@ import UIKit import SnapKit import Then -class OnboardingViewController: BaseViewController { +final class OnboardingViewController: BaseViewController { + + // MARK: - UI Property private let logoImage = UIImageView() - private lazy var signinButton = UIView() // 공통 버튼 구현 전까지 - private let signinLabel = UILabel() // 임시로 레이아웃 잡는 용도 - private lazy var signupButton = UIView() // 위와 - private let signupLabel = UILabel() // 동일 + private lazy var signinButton = CommonButton() + private lazy var signupButton = CommonButton() private let latelySigninView = DrawDashLineView() private let latelySigninLabel = UILabel() - private let kakaoButton = UIButton() - private let appleButton = UIButton() - private let naverButton = UIButton() - private let googleButton = UIButton() + private lazy var kakaoButton = UIButton() + private lazy var appleButton = UIButton() + private lazy var naverButton = UIButton() + private lazy var googleButton = UIButton() + + // MARK: - Setting override func setUI() { @@ -32,27 +34,13 @@ class OnboardingViewController: BaseViewController { } signinButton.do { - $0.backgroundColor = .gbbMain2 - $0.makeCornerRound(radius: 12) + $0.getButtonTitle(.login) + $0.getButtonUI(.gbbMain2!) } signupButton.do { - $0.makeCornerRound(radius: 12) - $0.makeBorder(width: 1, color: .gbbGray300!) - } - - signinLabel.do { - $0.text = "로그인" - $0.font = .headLine - $0.textColor = .gbbGray100 - $0.textAlignment = .center - } - - signupLabel.do { - $0.text = "회원가입" - $0.font = .bodyB1 - $0.textColor = .gbbGray400 - $0.textAlignment = .center + $0.getButtonTitle(.signIn) + $0.getButtonUI(.gbbWhite!, .gbbGray300) } latelySigninLabel.do { @@ -84,8 +72,6 @@ class OnboardingViewController: BaseViewController { view.addSubviews(logoImage, signinButton, signupButton, latelySigninView, kakaoButton, appleButton, naverButton, googleButton) - signinButton.addSubview(signinLabel) - signupButton.addSubview(signupLabel) latelySigninView.addSubview(latelySigninLabel) logoImage.snp.makeConstraints { @@ -106,14 +92,6 @@ class OnboardingViewController: BaseViewController { $0.height.equalTo(convertByHeightRatio(56)) } - signinLabel.snp.makeConstraints { - $0.center.equalToSuperview() - } - - signupLabel.snp.makeConstraints { - $0.center.equalToSuperview() - } - latelySigninView.snp.makeConstraints { $0.top.equalTo(signupButton.snp.bottom).offset(convertByHeightRatio(65)) $0.directionalHorizontalEdges.equalToSuperview().inset(77) diff --git a/GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/gray-800.colorset/Contents.json b/GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/black.colorset/Contents.json similarity index 100% rename from GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/gray-800.colorset/Contents.json rename to GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/black.colorset/Contents.json diff --git a/GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/gray-50.colorset/Contents.json b/GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/white.colorset/Contents.json similarity index 100% rename from GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/gray-50.colorset/Contents.json rename to GEON-PPANG-iOS/Resource/Colors/Colors.xcassets/Gray_Scale/white.colorset/Contents.json From 5fa38ebe7171204131cd5c7e05630d63cfae148a Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 05:55:21 +0900 Subject: [PATCH 052/153] [Feat] #39 - FilterCollectionViewCell added --- .../Filter/Model/FilterBreadTypeDTO.swift | 8 ++++ .../Filter/Model/FilterIngredientDTO.swift | 8 ++++ .../Filter/Model/FilterPurposeDTO.swift | 18 +++++++++ .../Views/FilterCollectionViewCell.swift | 39 +++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift create mode 100644 GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift create mode 100644 GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift create mode 100644 GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift new file mode 100644 index 00000000..c5db3383 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift @@ -0,0 +1,8 @@ +// +// FilterBreadTypeDTO.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift new file mode 100644 index 00000000..55e144a5 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift @@ -0,0 +1,8 @@ +// +// FilterIngredientDTO.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift new file mode 100644 index 00000000..de240ea5 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift @@ -0,0 +1,18 @@ +// +// FilterPurposeModel.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import Foundation + +enum FilterType: String, CaseIterable { + case health = "건강 · 체질" + case diet = "" +} + +struct FilterPurposeModel { + let type: FilterType + var isSelected: Bool +} diff --git a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift new file mode 100644 index 00000000..c62ee4ee --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift @@ -0,0 +1,39 @@ +// +// FilterCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class FilterCollectionViewCell: UICollectionViewCell { + + // MARK: - Property + + + + // MARK: - UI Property + + + + // MARK: - Life Cycle + + + + // MARK: - Setting + + + + // MARK: - Action Helper + + + + // MARK: - Custom Method + + + +} From 56c5038690804c0d602e6f7ad89ef969985e3e10 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 05:56:00 +0900 Subject: [PATCH 053/153] [Feat] #39 - FilterPurposeViewController added --- .../FilterPurposeViewController.swift | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index b12493fa..47db915f 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -14,7 +14,7 @@ final class FilterPurposeViewController: BaseViewController { // MARK: - Property - + private var maxSteps: Int = 0 // MARK: - UI Property @@ -22,11 +22,22 @@ final class FilterPurposeViewController: BaseViewController { // MARK: - Life Cycle + init(maxSteps: Int) { + super.init(nibName: nil, bundle: nil) + + setMaxSteps(to: maxSteps) + } + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } // MARK: - Setting - + private func setMaxSteps(to steps: Int) { + self.maxSteps = steps + } // MARK: - Action Helper From c10a768e95cc114c9c1d9c21322839568d986592 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 05:56:23 +0900 Subject: [PATCH 054/153] [Feat] #39 - Models added for ViewControllers --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 24 +++++++++++++++++++ .../Filter/Model/FilterBreadTypeDTO.swift | 21 ++++++++++++++++ .../Filter/Model/FilterIngredientDTO.swift | 11 +++++++++ .../Filter/Model/FilterPurposeDTO.swift | 18 ++++++++++---- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index b0b776a6..c5ad5296 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -68,6 +68,10 @@ 3EDC05BE2A5DED4400EAD950 /* FilterPurposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */; }; 3EDC05C02A5DED9200EAD950 /* FilterBreadTypeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */; }; 3EDC05C22A5DED9D00EAD950 /* FilterIngredientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */; }; + 3EDC05C42A5DEE3600EAD950 /* FilterCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C32A5DEE3600EAD950 /* FilterCollectionViewCell.swift */; }; + 3EDC05CA2A5DF26700EAD950 /* FilterPurposeDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */; }; + 3EDC05CC2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */; }; + 3EDC05CE2A5DF8A900EAD950 /* FilterIngredientDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */; }; DF959A612A539FBE00E75774 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */; }; DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; DF959A6C2A568C4600E75774 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DF959A6B2A568C4600E75774 /* Colors.xcassets */; }; @@ -133,6 +137,10 @@ 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterPurposeViewController.swift; sourceTree = ""; }; 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBreadTypeViewController.swift; sourceTree = ""; }; 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterIngredientViewController.swift; sourceTree = ""; }; + 3EDC05C32A5DEE3600EAD950 /* FilterCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterCollectionViewCell.swift; sourceTree = ""; }; + 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterPurposeDTO.swift; sourceTree = ""; }; + 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBreadTypeDTO.swift; sourceTree = ""; }; + 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterIngredientDTO.swift; sourceTree = ""; }; DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; DF959A6B2A568C4600E75774 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; @@ -527,6 +535,7 @@ 3EDC05BA2A5DEB7500EAD950 /* Filter */ = { isa = PBXGroup; children = ( + 3EDC05C82A5DF25900EAD950 /* Model */, 3EDC05BC2A5DEB7F00EAD950 /* Views */, 3EDC05BB2A5DEB7B00EAD950 /* ViewControllers */, ); @@ -546,10 +555,21 @@ 3EDC05BC2A5DEB7F00EAD950 /* Views */ = { isa = PBXGroup; children = ( + 3EDC05C32A5DEE3600EAD950 /* FilterCollectionViewCell.swift */, ); path = Views; sourceTree = ""; }; + 3EDC05C82A5DF25900EAD950 /* Model */ = { + isa = PBXGroup; + children = ( + 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */, + 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */, + 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */, + ); + path = Model; + sourceTree = ""; + }; DF959A672A56851000E75774 /* Enum */ = { isa = PBXGroup; children = ( @@ -714,6 +734,8 @@ 0961C3642A501EBF0031A822 /* Strings.swift in Sources */, 093214082A5AE40900875EF6 /* SearchViewController.swift in Sources */, 09B13F542A593CD300C0C723 /* MyPageViewController.swift in Sources */, + 3EDC05C42A5DEE3600EAD950 /* FilterCollectionViewCell.swift in Sources */, + 3EDC05CE2A5DF8A900EAD950 /* FilterIngredientDTO.swift in Sources */, 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */, 09CA3EF82A5676AA0063897A /* CommonButton.swift in Sources */, 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */, @@ -722,8 +744,10 @@ 090556222A51DB3300752067 /* UIFont+.swift in Sources */, 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */, 3EDC05BE2A5DED4400EAD950 /* FilterPurposeViewController.swift in Sources */, + 3EDC05CA2A5DF26700EAD950 /* FilterPurposeDTO.swift in Sources */, 3EDC05C22A5DED9D00EAD950 /* FilterIngredientViewController.swift in Sources */, 09C6264E2A5B29F8002C8110 /* SearchEnum.swift in Sources */, + 3EDC05CC2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift in Sources */, 0915C16A2A5BFC5900ACB8D4 /* HomeBottomCollectionViewCell.swift in Sources */, 09CA3F082A569EBA0063897A /* Service.swift in Sources */, 09B13F4C2A593C6F00C0C723 /* HomeViewController.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift index c5db3383..4d60a79b 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift @@ -6,3 +6,24 @@ // import Foundation + +enum FilterBreadType: String, CaseIterable { + case isGlutenFree = "글루텐프리" + case isVegan = "비건빵" + case isNutFree = "넛프리" + case isSugarless = "저당, 무설탕" + + var description: String { + switch self { + case .isGlutenFree: return "NO 글루텐 포함\n밀 , 곡물류" + case .isVegan: return "NO 동물성재료\n(유제품, 계란)" + case .isNutFree: return "NO 견과류" + case .isSugarless: return "대체당 사용" + } + } +} + +struct FilterBreadTypeDTO { + let type: FilterBreadType + let isSelected: Bool +} diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift index 55e144a5..4880c71a 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift @@ -6,3 +6,14 @@ // import Foundation + +enum FilterIngredientType: String, CaseIterable { + case isNutrientOpen = "영양성분 공개" + case isIngredientOpen = "원재료 공개" + case isNotOpen = "비공개" +} + +struct FilterIngredientDTO { + let type: FilterIngredientType + let isSeleted: Bool +} diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift index de240ea5..1a7dacd2 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift @@ -7,12 +7,20 @@ import Foundation -enum FilterType: String, CaseIterable { +enum FilterPurposeType: String, CaseIterable { case health = "건강 · 체질" - case diet = "" + case taste = "맛 · 다이어트" + case vegan = "비건 · 채식지향" + + var description: String { + switch self { + case .health: return "아토피 , 알레르기 , 암 , 당뇨 , 소화문제" + case .taste: return "그냥 맛있어서! 식이 관리를 위해" + case .vegan: return "종교 , 환경 , 동물 , 노동권을 위한 비거니즘" + } + } } -struct FilterPurposeModel { - let type: FilterType - var isSelected: Bool +struct FilterPurposeDTO { + let type: FilterPurposeType } From 22e602fe87f05cb8456aa5f4f860481d7645c612 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 06:36:20 +0900 Subject: [PATCH 055/153] =?UTF-8?q?[Add]=20#40=20-=20search=20=EC=BB=AC?= =?UTF-8?q?=EB=A0=89=EC=85=98=EB=B7=B0=20=EC=85=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchCollectionViewCell.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift new file mode 100644 index 00000000..ec492c88 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift @@ -0,0 +1,15 @@ +// +// SearchCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class SearchCollectionViewCell: UICollectionViewCell { + +} From 1406ec4c188aa52b6933226dbfd370e4349f01e5 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 06:37:13 +0900 Subject: [PATCH 056/153] =?UTF-8?q?[Feat]=20#40=20-=20empty=20=EC=BB=AC?= =?UTF-8?q?=EB=A0=89=EC=85=98=EB=B7=B0=20=EC=85=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 16 ++-- .../EmptyCollectionViewCell.swift | 93 +++++++++++++++++++ .../SearchEmptyCollectionViewCell.swift | 62 ------------- .../SearchInitialCollectionViewCell.swift | 64 ------------- 4 files changed, 101 insertions(+), 134 deletions(-) create mode 100644 GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift delete mode 100644 GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift delete mode 100644 GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 358d8fa9..a85abb7b 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -62,8 +62,8 @@ 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */; }; 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C92A5DD38D002020BD /* SearchResultView.swift */; }; - 09FD47CC2A5DE167002020BD /* SearchInitialCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */; }; - 09FD47CE2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47CD2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift */; }; + 09FD47D02A5DEE9E002020BD /* SearchCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47CF2A5DEE9E002020BD /* SearchCollectionViewCell.swift */; }; + 09FD47D22A5DF892002020BD /* EmptyCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; @@ -128,8 +128,8 @@ 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; 09FD47C92A5DD38D002020BD /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; - 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchInitialCollectionViewCell.swift; sourceTree = ""; }; - 09FD47CD2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEmptyCollectionViewCell.swift; sourceTree = ""; }; + 09FD47CF2A5DEE9E002020BD /* SearchCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCollectionViewCell.swift; sourceTree = ""; }; + 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCollectionViewCell.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; @@ -242,8 +242,8 @@ isa = PBXGroup; children = ( 093214072A5AE40900875EF6 /* SearchViewController.swift */, - 09FD47CB2A5DE167002020BD /* SearchInitialCollectionViewCell.swift */, - 09FD47CD2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift */, + 09FD47CF2A5DEE9E002020BD /* SearchCollectionViewCell.swift */, + 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */, ); path = ViewControllers; sourceTree = ""; @@ -687,7 +687,6 @@ buildActionMask = 2147483647; files = ( 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, - 09FD47CC2A5DE167002020BD /* SearchInitialCollectionViewCell.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */, @@ -706,7 +705,6 @@ 09CA3EF82A5676AA0063897A /* CommonButton.swift in Sources */, 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */, 09C626582A5B4269002C8110 /* HomeHeaderView.swift in Sources */, - 09FD47CE2A5DE650002020BD /* SearchEmptyCollectionViewCell.swift in Sources */, 0915C1722A5C3D3700ACB8D4 /* PaddingLabel.swift in Sources */, 090556222A51DB3300752067 /* UIFont+.swift in Sources */, 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */, @@ -738,8 +736,10 @@ 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */, 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, + 09FD47D22A5DF892002020BD /* EmptyCollectionViewCell.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */, + 09FD47D02A5DEE9E002020BD /* SearchCollectionViewCell.swift in Sources */, 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift new file mode 100644 index 00000000..49679bd4 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift @@ -0,0 +1,93 @@ +// +// EmptyCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +enum EmptyType: String { + case noReview = "작성된 리뷰가 없어요!" + case noBookMark = "저장 목록이 없어요!" + case noSearch = "검색결과가 없어요\n다른 키워드로 검색해보세요!" + case initialize = "궁금하신 건빵집을\n검색해보세요!" + + var icon: UIImage { + switch self { + case .noReview: return .noReviewImage + case .noBookMark: return .noBookmarkImage + case .noSearch: return .noSearchResultImage + case .initialize: return .searchImage + } + } +} + +final class EmptyCollectionViewCell: UICollectionViewCell { + + // MARK: - Property + + private var emptyType: EmptyType = .initialize + + // MARK: - UI Property + + private let emptyIcon = UIImageView() + private let emptyLabel = UILabel() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubviews(emptyIcon, emptyLabel) + + emptyIcon.snp.makeConstraints { + $0.size.equalTo(CGSize(width: 154, height: 132)) + $0.centerX.equalToSuperview() + } + + emptyLabel.snp.makeConstraints { + $0.top.equalTo(emptyIcon.snp.bottom).offset(20) + switch emptyType { + case .initialize, .noSearch: + $0.centerY.equalToSuperview().inset(-33) + case .noReview, .noBookMark: + $0.centerY.equalToSuperview().inset(-22) + } + $0.centerX.equalToSuperview() + } + } + + private func setUI() { + emptyIcon.do { + $0.contentMode = .scaleAspectFit + $0.image = .noSearchResultImage + } + + emptyLabel.do { + $0.textAlignment = .center + $0.partFontChange(targetString: "검색결과가 없어요", font: .pretendardMedium(15)) + $0.basic(text: "다른 키워드로 검색해보세요!", font: .pretendardBold(20), color: .gbbGray300!) + } + } + + func getViewType(_ type: EmptyType) { + emptyType = type + emptyIcon.image = type.icon + emptyLabel.text = type.rawValue + } +} diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift deleted file mode 100644 index 2dbf6426..00000000 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchEmptyCollectionViewCell.swift +++ /dev/null @@ -1,62 +0,0 @@ -// -// SearchEmptyCollectionViewCell.swift -// GEON-PPANG-iOS -// -// Created by JEONGEUN KIM on 2023/07/12. -// - -import UIKit - -final class SearchEmptyCollectionViewCell: UICollectionViewCell { - - // MARK: - Property - - // MARK: - UI Property - - private let initialIcon = UIImageView() - private let initialLabel = UILabel() - - // MARK: - Life Cycle - - override init(frame: CGRect) { - super.init(frame: .zero) - - setLayout() - setUI() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Setting - - private func setLayout() { - addSubviews(initialIcon, initialLabel) - - initialIcon.snp.makeConstraints { - $0.size.equalTo(CGSize(width: 154, height: 132)) - $0.centerX.equalToSuperview() - } - - initialLabel.snp.makeConstraints { - $0.top.equalTo(initialIcon.snp.bottom).offset(20) - $0.centerY.equalToSuperview().inset(-33) - $0.centerX.equalToSuperview() - } - } - - private func setUI() { - initialIcon.do { - $0.contentMode = .scaleAspectFit - $0.image = .noSearchResultImage - } - initialLabel.do { - $0.textAlignment = .center - $0.basic(text: "검색결과가 없어요\n다른 키워드로 검색해보세요!", font: .pretendardBold(20), color: .gbbGray300!) - $0.partFontChange(targetString: "다른 키워드로 검색해보세요!", font: .pretendardMedium(15)) - } - - } - -} diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift deleted file mode 100644 index 80c17ad6..00000000 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchInitialCollectionViewCell.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// SearchInitialCollectionViewCell.swift -// GEON-PPANG-iOS -// -// Created by JEONGEUN KIM on 2023/07/12. -// - -import UIKit - -import SnapKit -import Then - -final class SearchInitialCollectionViewCell: UICollectionViewCell { - - // MARK: - Property - - // MARK: - UI Property - - private let initialIcon = UIImageView() - private let initialLabel = UILabel() - - // MARK: - Life Cycle - - override init(frame: CGRect) { - super.init(frame: .zero) - - setLayout() - setUI() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Setting - - private func setLayout() { - addSubviews(initialIcon, initialLabel) - - initialIcon.snp.makeConstraints { - $0.size.equalTo(CGSize(width: 154, height: 132)) - $0.centerX.equalToSuperview() - } - - initialLabel.snp.makeConstraints { - $0.top.equalTo(initialIcon.snp.bottom).offset(20) - $0.centerY.equalToSuperview().inset(-35) - $0.centerX.equalToSuperview() - } - } - - private func setUI() { - initialIcon.do { - $0.contentMode = .scaleAspectFit - $0.image = .searchImage - } - initialLabel.do { - $0.textAlignment = .center - $0.basic(text: "궁금하신 건빵집을 \n검색해보세요!", font: .pretendardBold(20), color: .gbbGray300!) - } - - } - -} From b4c707217984d3d8fb110dc7c815911afa5c74d7 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 06:37:38 +0900 Subject: [PATCH 057/153] =?UTF-8?q?[Feat]=20#40=20-=20search=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=B7=B0=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 --- .../SearchViewController.swift | 103 +++++++++++++++++- .../Search/Views/SearchNavigationView.swift | 2 +- 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift index 3ec07811..fee09cf1 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift @@ -14,17 +14,38 @@ final class SearchViewController: BaseViewController { // MARK: - Property + enum Section { + case initial, main, empty + } private lazy var safeArea = self.view.safeAreaLayoutGuide + typealias Item = AnyHashable + typealias DataSource = UICollectionViewDiffableDataSource + private var dataSource: DataSource? + private let bakeryList: [HomeBestBakeryResponseDTO] = HomeBestBakeryResponseDTO.item // MARK: - UI Property private let naviView = SearchNavigationView() private let searchResultView = SearchResultView() + private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) // MARK: - Setting + override func viewDidLoad() { + super.viewDidLoad() + + setRegister() + setupDataSource() + setReloadData() + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + + self.view.endEditing(true) + } + override func setLayout() { - view.addSubviews(naviView, searchResultView) + view.addSubviews(naviView, searchResultView, collectionView) naviView.snp.makeConstraints { $0.top.equalTo(safeArea) @@ -37,6 +58,12 @@ final class SearchViewController: BaseViewController { $0.directionalHorizontalEdges.equalTo(safeArea) $0.height.equalTo(convertByHeightRatio(55)) } + + collectionView.snp.makeConstraints { + $0.top.equalTo(searchResultView.snp.bottom) + $0.directionalHorizontalEdges.equalTo(safeArea) + $0.bottom.equalToSuperview() + } } override func setUI() { @@ -47,6 +74,80 @@ final class SearchViewController: BaseViewController { } searchResultView.do { $0.updateUI(count: 3) + $0.isHidden = true + } + collectionView.do { + $0.backgroundColor = .clear + $0.isScrollEnabled = false } } + + private func setRegister() { + collectionView.register(cell: EmptyCollectionViewCell.self) + collectionView.register(cell: SearchCollectionViewCell.self) + } + + private func setupDataSource() { + dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in + let section = self.dataSource?.snapshot().sectionIdentifiers[indexPath.section] + switch section { + case .initial: + let cell: EmptyCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.initialize) + return cell + case .empty: + let cell: EmptyCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.noSearch) + return cell + case .main, .none: + let cell: SearchCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + return cell + } + }) + } + + private func setReloadData() { + var snapshot = NSDiffableDataSourceSnapshot() + defer { dataSource?.apply(snapshot, animatingDifferences: false)} + snapshot.appendSections([.initial]) + snapshot.appendItems([0]) + } + + private func setDataSource(data: [HomeBestBakeryResponseDTO]) { + guard var snapshot = dataSource?.snapshot() else { return} + if data.count == 0 { + snapshot.appendItems([0], toSection: .empty) + dataSource?.apply(snapshot) + } else { + snapshot.deleteSections([.initial]) + snapshot.appendItems(bakeryList, toSection: .main) + } + } + + private func layout() -> UICollectionViewLayout { + + let layout = UICollectionViewCompositionalLayout { sectionIndex, layoutEnvirnment in + let section = self.dataSource?.snapshot().sectionIdentifiers[sectionIndex] + switch section { + case .main: + var config = UICollectionLayoutListConfiguration(appearance: .plain) + config.backgroundColor = .clear + config.showsSeparators = true + + let layoutSection = NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvirnment) + return layoutSection + case .initial, .empty, .none: + return self.normalSection() + } + } + return layout + } + + private func normalSection() -> NSCollectionLayoutSection { + let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1))) + let group = NSCollectionLayoutGroup.vertical(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1)), subitem: item, count: 1) + let section = NSCollectionLayoutSection(group: group) + return section + } + } diff --git a/GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift b/GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift index 06212916..1a42b678 100644 --- a/GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift +++ b/GEON-PPANG-iOS/Presentation/Search/Views/SearchNavigationView.swift @@ -34,7 +34,7 @@ final class SearchNavigationView: UIView { fatalError("init(coder:) has not been implemented") } - // MARK: -Setting + // MARK: - Setting private func setLayout() { addSubviews(backButton, searchTextField) From c8bbaa0c472d93860587c26a73162a94c5abd4f5 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 06:51:20 +0900 Subject: [PATCH 058/153] =?UTF-8?q?[Fix]=20#40=20-=20empty=20icon=20=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../img_no_bookmark.imageset/Contents.json | 4 +- .../img_no_bookmark.svg | 20 +++++++++ .../img_no_bookmark@1x.png | Bin 8299 -> 0 bytes .../img_no_bookmark@2x.png | Bin 16310 -> 0 bytes .../img_no_bookmark@3x.png | Bin 24878 -> 0 bytes .../img_no_myreview.imageset/Contents.json | 23 ---------- .../img_no_myreview@1x.png | Bin 6910 -> 0 bytes .../img_no_myreview@2x.png | Bin 13086 -> 0 bytes .../img_no_myreview@3x.png | Bin 19184 -> 0 bytes .../img_no_review.imageset/Contents.json | 4 +- .../img_no_review.imageset/img_no_review.svg | 18 ++++++++ .../img_no_review@1x.png | Bin 6972 -> 0 bytes .../img_no_review@2x.png | Bin 13277 -> 0 bytes .../img_no_review@3x.png | Bin 19757 -> 0 bytes .../Contents.json | 4 +- .../img_no_search_result.svg | 19 +++++++++ .../img_no_search_result@1x.png | Bin 10249 -> 0 bytes .../img_no_search_result@2x.png | Bin 19968 -> 0 bytes .../img_no_search_result@3x.png | Bin 28972 -> 0 bytes .../images/img_search.imageset/Contents.json | 4 +- .../images/img_search.imageset/img_search.svg | 21 +++++++++ .../img_search.imageset/img_search@1x.png | Bin 9912 -> 0 bytes .../img_search.imageset/img_search@2x.png | Bin 18828 -> 0 bytes .../img_search.imageset/img_search@3x.png | Bin 27623 -> 0 bytes .../Contents.json | 4 +- .../img_server_maintenance.svg | 40 ++++++++++++++++++ .../img_server_maintenance@1x.png | Bin 9610 -> 0 bytes .../img_server_maintenance@2x.png | Bin 19285 -> 0 bytes .../img_server_maintenance@3x.png | Bin 28991 -> 0 bytes .../images/img_welcome.imageset/Contents.json | 4 +- .../img_welcome.imageset/img_welcome.png | Bin 0 -> 7096 bytes .../img_welcome.imageset/img_welcome@1x.png | Bin 7161 -> 0 bytes .../img_welcome.imageset/img_welcome@2x.png | Bin 15116 -> 0 bytes .../img_welcome.imageset/img_welcome@3x.png | Bin 23775 -> 0 bytes 34 files changed, 124 insertions(+), 41 deletions(-) create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark.svg delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark@3x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/Contents.json delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/img_no_myreview@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/img_no_myreview@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/img_no_myreview@3x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review.svg delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review@3x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result.svg delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result@3x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search.svg delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search@3x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance.svg delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance@3x.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome@1x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome@2x.png delete mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome@3x.png diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/Contents.json index 3d0a8af5..9fecf89f 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/Contents.json @@ -1,17 +1,15 @@ { "images" : [ { - "filename" : "img_no_bookmark@1x.png", + "filename" : "img_no_bookmark.svg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "img_no_bookmark@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "img_no_bookmark@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark.svg b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark.svg new file mode 100644 index 00000000..c0193287 --- /dev/null +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark@1x.png deleted file mode 100644 index 24ee0839bb3726953e86e0b2fba2ffc5d85e454e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8299 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 AZ2$lO diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_bookmark.imageset/img_no_bookmark@2x.png deleted file mode 100644 index 37fd3a6a79bb2287bc2a3026eda29691dda6e93c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16310 zcmd6ORa9Kj(q>}`n&9s4F2N;0Xxyc7cemi~?lc}WK;sSp0>Rx~f(M7-KAn5#ZT@+i zhv~J>>h67Nd!5=6vXal>7ZoeqyY++$Ih*^=<7 zd;6VDY^xDsl3M{#2~5)XD{Ac>&dTXmvrk9xe7l5D7qVypKb5zRdMm%1(AF+5XoPu2 zJatS;qFM(A6~M4d5}%xla3b?4XkM&j)}4H~_0Y5y3mQfGnTSpem|IF}tD<9|kjCeY zBYJe3T2t1B_JTCf?wuT-i8O$w&r^Lo{rY-Fh=yJ}1;B^xQ&5jKP=1H1Is?EZ1i&ex z4{2S8a&DW>{2n*32%uv5H^xuZqygA;mDXra$BuWN8+-iLfDEian9?jn`X5E4DT~E0 z%-n!?_zVRlBILjjq4cjmCE$$2_9P4n1MUtU4Q1WKmJ=LL`TnV9plptry=4D9_y2Sn=wt+Y#w+nl{^L%&Uxd$QbvDHOs7g`i zE=&TtssKCN3F=Rdm@prQVS$9LBV5DpHHsTmyw_QB9LC0&%d)J)3Sbglp;8qKi3SdM zf-xiHG-!#~0P=&SX1)g!Oc-bU;{U9wOKj|%X5SeyhbW@MwWKl+~H?O$Dv^ za+VIx)}8AKm74k88v@n35Ng$pon^u9wL(Pr+;=0JimRZ?vsisYdT1r$WKAD6CYAaU z((*wR6i=#-wuqx|GfMVTK5rshai%9O*3T7D$Y;=G3)I@MV5D_+M^RU|-g^Rx@B)W>Wv_4g>L{ z>q*Iu4UeV0siL!#D$`>$^B>Qs_y6uCNsWW!WGdh!3)fgCdK1_YdwU7S=-{y zBRKE497$cq{>*{iJZhYLXsl-vaj&yf?+w*C7qR*1dL6PrC4siAW=d=LQ=XF0sN<@b zCX0e5^p?~}fB z#Xn;9WEpDb+{*FV)+GsVGypM+Ii|l&E?s8ZX$vL`)NWP$tD8y7)=bzLtYK|HU`OB1 zS`oOUq{Q@r6spPu=&ce1-rsW`X7>kjcYn{joxTSbPoG&fVMZ*O;6|E-o6ycdn&w+N zHtil(ywc}DuEeZaY|u%}NJ8pH9{Q+E9II@iqGHW=;K81!CpOYm{I=gxWJ1Ry0!JML&!-$@J|$&4@CW#7Q`%{N(Fozo`kV5Ayk+R|kXaZ+@Nv)c!WI z^a1hjOvd`DoR~XQt!&J7?Z>A18#nOfN^+tEGyG`37>U#|sT{jfFMkz2ngT=u+5HC@ zh&B2lo^G~|n8(a9y=#q0R|ge!McjJw{B$>{WdIbkz({q=r-bf5O^Ne|ysFtzW!oUj zbxBTztVu%w&8nP~fwx~0aOAMtCYrjDk5m?vLOR+i)>VR2aS56_SqE%pW_(a9)NUla zC@NK$sz$GB9vu|9t2a<>fvc$_mc4BVeZbucR#27=If^1R)$MUXyFdLGcr10a&3iI0 zj3UjyUa~OmQ;u~07zC{S!F*V9#qv)@-8I^x^u z+3?H;(#iMfuouV6w+soSfSWV>aW29);Q)wHnz}Xxxf*rdPwQDlRDCV&-2sf1v1MVW z$v&r%wrNeztN^i3OPgL9l4I>UI6cuji^%8nO*c&QnqiZqtJR!&xX@=BEMF>HaR-975 z7jGEwDWx_aJNTV+^eEU|RW(u5FO_keWi3u`*1fgclsRkHFIK?^y^%ea?QR9+)A2Np zYbzw%rE-YcPSQ?zX;0crTRdXi7VRLt=T})im3MkSv;$)5^A_&Q{mWNf7Rq4Ig~^c zs6BRbaq^a93nrpJ71C1cvlsvJFV5pmv>ns%hoBy;^{SR;!HJJ@1PN|GrL5eP`sUN( z90Ogh$BlwkDsDJ{BfgXK?WJz{XTBz{;lpCnNOc0`U7{H}Hh7?yHXHa^|g8nnPm7gT*8iyYTi-~#PFTK9U z{XN+g0=+SUshCd+d@~gnlc-n9-|r8&oF|i_l&ZkT+bXyY^bZ?5E1WJ1edoTBS{o*C z@Kx{C;kxnqrKc(P%l!wx&QMq5B;&T>H4r-MPYQS`5)z*TJn1F*W4rrcAunZ4T8(@m zK?Ft1pdM@=^rounse{%@rMHekRlVJBCrm1CG;$Fq?sT@Slp#8v&(C;VT%($47hcSl z?6|ugIfoRabzXngN3XxV7nc)T|Es#vNs{`0m)(C>E!K7qcfxUbqtTgzfVW&(X{vfo zH+f@f2IWZKb&)?@13UNL?^~T5Z!oZ7IhM5|B&vx6v0mV$D)MFz3kT;xO)~zW027id zAfLIk`Cu)s7wtZhxiVIt7X|*?`J{?dlXmU9GS2M^TrY(mV}AcJn#YwyL`l^8CsQ>e z1gbt^=Pm|uc9sr$qKL~_4x z2zgJWp}CW;1;5jXm+qhvEu%1z+_#|MeY1V4~Okk z?T4M|fP>aL2utgey{$qoYc(tJ>G`=P8U0wD$oq&kx?tXGoe86Y&4@aUE18E15XiXq zX(-GrJn{?f_@D{N(zR7{G??Al+gr6wv*1&#V9-}T=2+pS<-GU~(N32Ro9c_Ixs-PU z<{pvx1h%IbgTz#uzax(W;pbh7l|hT%GjG zh_4^eFy=X9dS#mwBq1DaaMFu}F*_c`xT4pcH4JbWnbA3m3X0Bvs3hx~AEEpnyMrmvk(aG3MiY#6^8C8?xWy>fN_c4Kowy?OO(jmLX zZM*Kxph3WRFJHzoCnO3FMAEBHgR_1A2_KKl^iW0$=XS+rq)1FTzRGLTHeX`QmiRZ*VpnTNd zzV$oId3~~n@14n1X7WF+8Y56darL_krX+gYPKU4DG}=I#RN1O{XkUZ8`^1p5;3H{v zH26~rP72^3;Fv1S9LDbYHtHf5mTr#sibp;6V(ehMn^@!i_!yI-yQ*YWf%B6`45ld0 zl@icxPpy1>m^!+qEPTCW?jnOQ8`~3sfxMfF<{Cd@!55$;Lyu}d5Fzyzr_vll_LtD} ztAtb-XBMQoi9)+YCME^k$&#ETdqXR(PR3>QcM?;qi>lWPnKL!biXX_h$`?(%ytp+9 zuT>VBKV|tVEtB&Z?oRsIZ40?v=;NL^r3Fap=xa&qHRQ1;g|0M#*e=m+S#GWpHS|sJ z+i)A72ZkzOOZ{rNtroPfD~8`i$D!61%O}$Lsx!%^ZTDU7hVyD>)&1F)H;9WwmR78p z1t_y!$_QHC)&pJ}zs72CdYL-eo z1%)Q}LJYD_+&Na7FGJ4jMT+Z`Y1LRHcue+js|Rfi&iQnx(R>pO)IJXDb9bH}Gx$?$ zQ}33T1Tamqe#Tvb?5oiYt1l=@66{;C?#C^|Q{~N8K$P0ayvUoTH-+(!mSh~@PdOE7 zQ&=BAD_`|@32n(0(VD~!nazzf1?vkj7ooJSHZC+uQUhTs%(!S^*yR@$rvlGsnMSXS zo8l!fT_~({Sn3JmrknZ%D2h_;L=qr)z2EhjmQKQl zx;ue}TXP;mqbd?*HGQy6D%>l+MV|S6Ghq?jSzLT_Hh849;;ahH>8;!VnfsbZ+WpGC z-+lP57uwus=z57s!22n`NJ2G{^}peq`csMRPL7S=FT=al*~6Ful7Hbd>o3QiPV_}Tmy(_6{hcnLOKU)f~rN{|LrP4h_;RQJ_1 zv135-+#`kgykJBS&%Nj?W5+Fx8H*24m8nWGYawz@a(FQ+YBuGExtjeCObnjQqNgii zyIoRgRlLRmJT<&xdesWP2BcZrYqN=X*&KIqP7%Tr-Q&Sj+uWklM zEooG8G>n7QYc#cHOpT~24RjjfSRAhE6qUx#x@Y${5s@i35iL)fB1!@6<)}T^-L(CK z^^D3zB{Z-e-U1wlQ&Jp=-?3`k3YQ8nlp67r6eC4u@svYy^1fvPZ(ZJ*ECiUDH5?7oAMTb2 z%fDWQB&JO?3`8z7$-*(5I$3v+4YL2C#^rWKqqaz|&b*Aeh8y{W-G;uYlZ9uZVe~MH6V&|7#hrIR=+wDXGL)`cI>O>gbs@X< zmm3{}O0tERRLvvx#m&`CZhYKdVGZ!jy`koRwBQLjSF#j*WMr-2ZgKJi z|HPq00W~3epU^ww@b%gK0op5knZiw&+X)Nn_+#xrQC~oEcJ4sO(?VfU)L&9Nt@Tjv z^cY*X)7O;kB>Xu_y%~eK3z-9sBWcq6A0_~eHPYSur^r*i%;JEuW9vFu---`{t!FfL zgipiq;oCu0hh{tvk`-?h7Gj8;VUSW_CEIuthg44!jztebj97lA?Rl#+$ym&6zCvK$ zyEBXQ4=5O4AG(?aI%CabEy^j5mnF5t<;nun$xOou{tQe{PwyTcT9ezYllpJ-peBFk ziPp(=?xR(8kZpMER>P5(?CHdD|Q$2w+ShNbhR1Oi~mKbs*IYIRPy z@S@fUz%q@%brQyJVd_wJ=FRt!STR{42&XrSo--r^3h;*9d0UJ)Big|8xDaVvTljQ{ zfkl_L(yZ9HVOn$WeqFtTBeI?XHH=t7l8!wT0(<1Esj^68S&Pxnqh5VFaZKdVL)~_! zQv6V_nT`UK=n^?VE6iLmiXlJcZ8naqiRay+}R!39A= ze?9K9aSW{)Mmp_T{bGU_jHD_sAD&k_JxsYOZ&;J%;cn#z+>Aqi2|FC4e87n|LxON6 zT3VdHJ9dA^@P16DIM) zSeJY0!qabTYe{R&#*t9lb$UT`xojAAa%@GW1&5*<3M&{|3uS6Kp&1%jKyffc-BH)W zL~ow$pFDR}>Rwb}2a?#zR}nu25BUU}2WdHyta=xI;lK7uLVyA^2=OsRqUf7mW+BFI zQGo^)tXav?2iFP05Ey*lzT>)6V*FX8_g_BHlOeDGB>-4lFhhv@i)JB&&f;og%_4jd zE&yjRQTjqmNL!s~5ytL}1eLH9?!8DS9YBnhUQXOpRgF7X4`ekmA)zKPI4c2z?{s9Z zeHp-}?Q5}Xh0fg(3TO~bX2Atq2P3zc!zQ&cuNrlP8Q~mq!T`iRL^e*b0|2P7P#o#! zRHF7&<}(8JqyOx^5C!AW*?P__Iz;$Za8^MVd(V2XIKIt;kX=J_7*CwAeHce&s>$qx8TZ)GZ) zn=$;ZbT~JcMB5r*2588A&s}lzjSNA7)@&u7(V3VP6F{zE1_Z8#shX8A5{hSy@TS&h z=cwokpa2pnf$6Dkbc{u(F34TyZ(^E8{T6^3X$F5W4`Ne-j-vosv*G3CB}N#4s`#41 zDh-XopCJeOUGynxt21k(QV@gSnj&C^DypO0uSSweHl<)beWL!lv+Zl^oqZAjFsyPN z%IsV%J|&WDbjWNSQh)OR1K|0Gq}w-S*B9@8AD9ef3g-3qr~{_sZ~8SIJ;4DWK%-oa zD>*{rYD7>nPIefFM(ry*0N*`X$Fg3!nspixOGG5{fkB5-lhDK(pq>0vfJ>s4!PaXA z5sT5P$({G~#cA)SEF3v4)Y-|SuA9hwN%G(eYlb8ByX6}qWIa1Suf_n7V~U@Et#g?< zB(w*DH%Z{DoIqZRND%HXmsr$@fXMJ7{Y)mUzW!G!Kwvzz zJ5RqrwxQk%HTglI@R!xqlr-Bg&;3<+zpSH&wchnX_^iZ@#Stj911U|@B(pT|I_dr> z-F@#S)ZNIPh&J$EP;ge(If>Y>LBu&NO@LxDKq)$5i%=hvdMZ`XESF>UGa?9Q-adp6 z3U}Lv7$feU511OpP(W|fPKt?FXq}mGTihBSn;2SQpe1>FS$>rDpiO% zs0V%TE$(#Yt7^$Y8G?;NO?8pk80h|GOkC!dk~%Yy^xQPI*0-`dlNfKxa}q>>j23?r zLo#`0=Orrtd0x$@pHc*pquLr;8x^S}2wA1*Wostabxw3Ooeh>0b;sbZ^0vDiKKisJxZD%aghug^TWCcwTg|5o4ntsfyz}yL!@GWK_Q~^` zuBrs@G)ER(gXWG*q;uA1!hW&Z0N?TP*7CGCo%07VN#b&U^Ts?SS_~2WK9|AW2agA# zy76RmmE-=Cy}qgN+?XJ{2f3h>3SKw z@7v2ApEV+o%GEsN^YaP$uO^kvu4Vmi@P6U9PIVc$R!T;Bl)Cb&_O}!3EU@-bELIXt zd9hXF2InVb-GPx$jasGJ;0Fn# zH-_%oqlGo%R+JA^VJ^y*3`Wke2b+maVJ6~bK+@DDHIKifav7BbIY5hy^y;hKb;jf^ zEz7QFl|-k>-tGr~Z%&H7$*0A{{Lc4%D-(TT`1UI z&j2Z`#cH(@)o-G&TVEc_HlGFV7bBlfuCG&RX=$ku<&iufXL(gA2u;pnTId|fFHe;L zZ;NCJ2MGc9a4)y{{^qYQ3ny2hb%k!^-jrsRmg5q1gLE}<2??_|$BV=7BCfUeQC9rL z=xe8#lknBb#!A=j`5b&D?z;3!-!91BXj>l;7Tpi=-i{1sH(wW5xnCYOr!$YkU#qp< zfK$<3lyb3X8bAJKVQ^s-w}q9I?mS#izQ(@pi@vaov$2BneRiXah-@JmV}wchFFlCg z5Dk4>Bh4|z1<9?_=}X8OpLEu%+Fu^*$c;|#uL7i({miJz@q=rMfA zZLWF0efrxZ$L^q~XTmL0d6YxH1D7T8&5|QQzi({+equ5}k((R_l@3~~T}LE$+hS`q z!Tq_d)uQ<;S&qqd-0Gx&tA0e`Z#VvQ_P(Zg+mbf7wretgJGqr+V@-jU?DS#8N9+iP z)tE5#@};P(nj(~}nJusiKkcxQ^w#y~XUXtL@PP(BtrTnl0wPGhkLCE zBLfhRi7Hdq3QCl{zdL`WNN)No`uY@rQgPJrs=wm_G8Y8X7MZ~d>f~*^AlKLA-W$GM z+$F`+pz=4j+N&JZjsc(Z z6<#SnkuH~QzCLQX86RWvkq7hg;tI=+_`gNi1pC5>#~`I-MYpf{u4`cNo&0hv9GqKu zwI7Am-5FDGUzN56BD#rk)(Ih4*NXB#kZ7QY%lX$F24M`z7>`P)(oU|WtV<}nHq>C9OROq|`Qy&mPsI-borZw1Po~g=of33dt zGlZUo?-Vd&Qo}*}1n=!F1=CWdhU272;`s3%57#U4GFy3-)^hF-6sOGdk>x(i~YnmS>10ktgos&bXq94>Bywa z5*hACEo*a_bW*z>7Kz(yYi-s3-_oEMi}RyM94wk+20kCmPSrVkztTR| z9AZOk6)Xxl7vHWgQGIy-F&W8bi+wy#yD3U58)NQ^ENC29taI9CNi)@qD#&wpqGRn4 zvi#U9MOa%_3;>JR6tl9tZYp}+Pm!mShTj9YG19O4-Oj>aS>jh0!gfA6EI&UdM;bCV z>AU!1zKtH;3$c-0BK$&t9}jNpXOm6sjWe9Qi0a2|wF$daUnxGyBoDA_i3N9;rVbt5 z7w=hHTO$!DIw2rt(O7TX>wH^Eum>`3D~yQJz>>p53%$B8`=iTslIxt5n9AF7b$U*^ zssCeTlhaqhIHW1_3Wil*Mr(|gka_UY$gPkrmNyG>wo^8!q}6a&%A@~Up2rog{ixD*TEFYS_mMwsCAz@NgV6S+PfJpyewzjD6FeGfeYOd%nH zB!pZR7`{+9O&sk`%I>77hZ3UlKu`9_uk<5I%q;WSB1)Qsm1x?Q1w`nL*iItq3k>fG zluUC=yk{5dqx_W6)w#0ej^V}d$gLQZZMDxUd8qh0>n2o{RMoXbOGRRMIJ3za(Hm1U zbzA97X83Hwmjg1x-e;Kksfb+`RL1q{7tgT}Slb#SwzweP4D={3u^ z{QYtPk%;gtQm~7&MNf0Oc=nZemnEQ_T1&Jo9z1U^3yXJ5fqpQrDC-K`QAZ= zrk>A_pO0WD7ijZ5y7_SF^Y8b20wJ`KDDW(BeJ^TV8C4~;CYr4qYADk116-PF&4mMW zC*^xyvF~A_X-ZC$+cUP7r6PF;|3k$;O_}o;Dnw6CA}LbSRjptg4-0aOpHLGLJ`~4* ztKiMo4Oy8;IKVrvy5(x7J}U!aGZQTejGr8&0|8?{$Kip21?I791uj=yYQ3oR8GYX6 zX%V}yJD{5E)|D#iU=~d<#=su*_p+qo^_jV1B(qt zc9(xl04jCVN1@ai-0`j~Q?-wUFSHq%^P~K8nL*e=1vi=PwWp`23jDixaZ#N1kkst` zcloLLOseL$5ARidPZWJ!gy=Qp6rAL~eEDL#5h02zTvFOJ(?XOmO81zwBuJWl?}oB~ zKLm>i%Kxszo6T)D7itsZG6jb${jqNf0Qd|Cj|O1p7W*H67TB3eCbqXgbExBad4DyU zc;y=eRN@W0E;@Jm`}a6u*ndNlzxd@Fbf>;jCpDN4DPxL8DYn+1FjKkP1$P-EHqOpd z$C+q0i_o|uLc|e*c|+kPN^|I>tD~jsB9CAfU>fFAAL?xy?Qfg{THMYqcW4la@Y%_& zKKD&e-;UMP0$Ut!N$Ja+iYpvUD} z5vCvhINuC|>lk_V`oY>b?!SeSCOXMM#UkHugoBQe{vyKL15`eU7K!XsT;jotO#~L8 z;fvz|$|-M1SkK6hkzC%v+y7LS{i3JA;4_f(+SUmOg%Kwrk8f_FOBtLnvld!OoL@|- zKB~svlh%WQ`gCxid}r7UFtkkVTk)H%Jl(a8w3RiZ6=%`UX!T*%^+&L9i65tOL}Z5O z$#paHCRkak_`1|}WgSnA&O3(xpuo5MsG6A(1W^K90L)OM5mgm@F~G?**%YZmWm<-( zs%6o1QA6pT4W$vGHwH=QAZ0m18WctIbqqu& z3a|_KC!ATu%)NO)W@_hP{tYG(YGdGFnapW;L6x7*$W4rm3W5sI5KpW|>yh)K>)d1Q z*_;O)e^5aO4{tAaAtWfC!UI!iMq#U?&V+J$H7OdP^xtL^sZj{b$%}3eF?0$rZ$n@c zX`!>}Wko6H5k4|2L9oR_*JTM9EFOUuQ-lr+UE0kc1x-FBt>GdlmeQ?WG4ON+p7g;G z3&0N(%qvD;T8;B|x|R0pWxZ4*+e}q@??)}mF?=FTUYRVkfuD_WFulT6#9Gxj)bSQN z20c<*I2#1UOa$&ZsG+gLgi-k{EG#7d+QMA{P$=xmzskv?;-zStyE7J_SeC;i!k{;b ze?C?iK^kKWLO~UKglb{zgO~GVtEAsRYj$>%Dki`M4ys4xwO5IcOP&mM4JZprNP#&} zMG@=ctS24Hgym$%Tp$>tf^N*-#5UgXi<5Bwe9k}M1KJ{nWK3qY=moeO0#=A-|Sr4+vc$0Gp}Ss+gNQq)NWarydoP*hJX^MNKv zh8nXGY|atVCJ6|XSC%wSaElV7PNqZ1%!f)~$>%)oZEu@^#i+4Mey+Ya=5rl>fd|N- z)lFDHnG+b1@{Hz04Jd{XFdL#CY$BnrOOH2Lj9Invv#V&%=y1e$m_&RLV+xqA)Ung*(wT=by(;Wb~&(p$s}m?Sj(SsuFa-u)Zdo03z2ILkLzaEtWVG=z*eu zX$C5NE#m=kt>r*ifbwt6WC0G2e9VTo8E7u?EA$v%hf<9Hzxup`l@i__-)K1o9n!_s zJe-JjHr)3M+(iC*Id2}Pz{@r;3-EHdjKM@B@bOtyV{KDQrFao=eDAXfVch#+k2x}+uBP@|+RtYdV}^uuk}s=BPOmA7-`8BB(lO=P5%ix$IYWURCU zC{>4Uz1h{uE*HeMhRp%1%4_H_jgEzgQEBaRttFWeYru|Wuw>!m8w>sxKTse3?w-CXg3~r~IvVa%y?;(8 zwXsd)7M{-*n+TT^cl&Pn4F02BA7N1%RhPcsf5wjM=COZO$f7G34_F(Z+59RkNR3<0 zpE0=WV`%xneot@pFF$;l>P1)*s&rNwmzbj{FQ1iCE6cE@x<{i?g*5eLHyo0qBt&@| ztNeY~8}iEvfx#6kQtVz{=>RW-w_FL{p`DQLBWjzt;4ey#lbY-ogU;Vqdyr5X^!kS0 zh7p1q_yYySoaC$hL|et2ho|iQbJ5e1S`B@xL7~={?Jp(ggql2a<7fN93Cq5I){7U! z&UYLGwbiS%&DWXUu_r}E$g~q0O~gf%Pr?@dlh6J~g|vLmdv@|BjwvJ)s}+^Vl}}F{ z33#|?B4w!MBB=xU_&oYWax^gtFAcoCx8~{`7N^yr`XODKCKQG^|8QYgFMCQh=$Yq* z%vcA{oZ0y_%5r5MquSewrWt&zLjUQ=xmKu$&WGeTU*UD==SiM?dR1LaLA8-q?>@t< zkEO$^iJPuX7LuYSIc$ZnCYIyvH_Jeh=+Wwj@-IB(o zl_yw9om=4fw*hf8A&|Pvd2F4j7-mcC*c#6%t-JniYqhBFG>*yndC({j`sIV591D zM`a>;)GB#gD9P-7)AHHDfa=%j#})8kO-8yuIJ>}wbVy*70HLjCJR@ykF>b!iIGJaX zW&jj7_?@l_uf6C#s%?m`$jmKeo8I$uB!+f?tK}=3y0TQ`n16<@9EW_@@9CZmKCR|O z(B`%2SE~U`Z)_WI!`qx08Xp}kt)e9PSd?A!Z!m2ohnQ>=v82eLa!-b9V{PNc>7A`a z3&Y#kXOPMF$*j%r(g`J$zXT99dF~dBMnzWHs(6d0OP+qWnNdQ{Ehz7Ig?j0MI~P-72Re_wR=*(Qk*q)K04uuIZ-buN-t^1oWmlJ%!3HBLaiD#xgUW@B%$Me% z*Iw&AuRYK=2IHbM*^5BOQch+I&- z#Gm%ZDTU64jFvlpzugM0Z{`;4kEmw0&)@d_LL51Mkm`V!(jy*RQ)j7O2;1amHgZU< zAyMexzeBR=<;3CMndsDtD_hZ1!n8P42N3!T*RP=%Kdtc2dYT(X)}%JOt$d8)H}pc6 z{9Ys%{1EG}gk&7$r+;bkQtq*8i?wZnbK8zb`uSKUJ9srefK^^)^nL3;u5n#)_1aGm zzaee8KF4ysR&ERX;VYldp!4j42@n0>5pLKa1gyT#YK0PME~~MGa>81_aIDr^9n#Z1 zG|G9TD}V|r`}Z`i*}Qbhjs6y-OQWZxOHG^!w8cNDm|sD1zIJNV)oZr;{m;?li?0?m z)Es4vZ#p@v${WAzACxoauxa|{k35bYKCNwpIgVR2`v@l&gdr$|)f)X+7%{V&Qy$hXv~lW3GS(%0E^qLdCi z9iKcA4)L>n!>iMyi*0s~BYTZ%eytJq9}T@pNJe}bjf<7L{C&vDyn?cUjhNGEkc^`v z7_c8hrKanknbCSJDrjuAmJrzr=$~nNZqef*0nu%+?AHuAj?Lwyp*BHPa7P|+R1Kf& zvwIo&n0YR@@+hkxgVFSh&quBEsLrx$j0_|C1HqvYLmUr3e#*Thg?|L8O1F0sfM%HSI3M1whX7BLTdBgs7TBL#cfN~i=I;(c=+FUEO?5{b} zkVf0|hW*0Ofk2y{d--Izzg^JWV}4i^7`{bHh?;A__*7$_w8K+XR4vXuP`p4hWC<_0 zp5{u~`p$L!+ow#hA?@(v9!bLb!JGj4H;bMDB;%oGDE(#IyQcAVtaY3y6;_{xyW~2g zS+fEu&zmfVl4q{wLB!E5@*7S$$_?%Q2$-A0(2opAu&ChUMM-*cvPKtCt*)_{U(JfM zD;$tCh-#HCdAi4)UMS?HJGmZS=hl(OMo{!Q=`gPj&9lur!b_$)JHqHew#P;{m^#oI z_zT6!Cv4JtrVZ2Rqvxf@1;3!$6C z#?9-;7KaXZ?a=*bm@dcry{(eZENy#Jc1w|@~ra=l!UX0Hm7-*gzG>PN`$(B-YitI1e#!)10YW<3Z`#G zJQlJAdsug!d5{B%h*EJMNKPhE zcVh|Vt$Z=yDr`PUY}xn}*D#$m3QJ%%IJYK_f%L)8USOnuRn}mTs@!H~f9Gw_dZTLW zi`EYYtU()Zg{$ z=+=}UFHVl8a+>sHxz>3#3HHR>+1XI9n`L?z?=24Ej)1Sx$)~1Hj zP&?NpVm0r@LSG_S-Lls1n35l}bL?cb^Op`<5pt>RxLUgpH0*!rWUp*?dHv>gamhe* z+h8ln)*dIWBMyWA+@s)Hz2LyQ2Fux3cI?_tv9K_{ zwJ6!`F)iZ0Xd&TTt9Bh-gsN#1Ea(}m)C*5-XI1g{MziejN8Vr!NtGs{VaKPZi^P@G z!MWhSY6<~VI}*F>)MqxYXX6Xnsv(?eSQJ@?PYq3gd5*n_161vZ! zJPMPRlejp<(vY?Jmuu#6&EIF8&n|W9u|6 z4KJ<#pf~vep*S9C{a&HR^U#`ybk;%}gNx~9+lI>LNwXaC2iKEFb6pDvX|KIE`QzW% zHC25!+KNteLzm|3*YS4xu4SPVy@o&~+huT)l(rLHFiPh_eda8K(@qg2Re`rSk1E6S ziJ^|zk6AbtPxS3aQ>KZbQH#o#qS%~lIk_jy6rO--fvNM;?9TW5w0e$yAFG}ZxJ??5 zt@><1A#w`M{4#2u@!rp>i* zAg~t++Hq6Ukzrrgz}Wy+7;s8pI>am0! zas!N}E(Pb17LeepY%c#;Ztb`~>;~sD)p4lE4>O0G3$a>;pZoK6IPs+gx5?EtIex1+ zU29YiCF@$&RqDtlcN_oJXx$KQGF~{YF~&Z$a(XJ{kn5*GgTIRX=)6!r`#``w#mSXG z)vmbTYMQZy`1c{)N36%tuspARs=jo*O@x&*g-1oex&k*#9(C^`8OGwKRX@Ev;d2UT0vjl5}B;L@>6h}4N2d=h$g2o4;w>D$0H5?o@&DM@HO$VbBHb2Cp**6MIateAkei;D7;JDkcv7hrCj0p0YM5D4e{*^bMaihv) z`Px2RF+8FZ)cXS>HWf@BpytY&pZWXr*Rr5o(zg8HCny(&YlFvAe{5G#Q(v!Fi}GM* zE!QUrzQH{2!NYd%4$35|fD-!B24pRG(->&}Qp*CZtA08Xi&HgOB!h`cGj$@;dk#OP zFdp?o28^`142Di0y;449J-jwSdDo}ZVlDk$zw{i=pRXTQkJRJU{mX8=5vz%|4-~4K zFYCvS&xuTL6l{^zUp(9ezsj=qVHJZ09LKdK%S9M^Z7O4pKqV!6)C@S+c?MmgWqddu zuV=}v{kEx?#;`(vxHW%&L>{?2GyGncuzcxZ@8Q0}%BV`WUmTs~oVemXkJi!ObzIl! z=0AupT|@M?=>T#cr`d$Obu)}I_zTidyEka@v`it|S+~iA`1Ypu{$y{dofC#3hKm|T zOXA{9xlPfdDTYJ8T_u3B1LTH)GdCZyP4j;m+t zc`nSi1!qIjO|>d#4{nR+W4nL0#zlc&CD(X3z;dXdQE*o25^;F$mVaWWs4E{(#l>h? zC^kPsP`J=$i|A*msHRi0F42+*P?;aik+Ag$J|uxAb^5Y67quhuuhg@rHOOk}YKiKD z3X_t$kY%WvzTOM$p&~(jqv0!#uFTtIhDo+{L5Fn<@`b(B`>;q*rI+=`jFmV_SaMd( zX63mbA{I-nmE_VSs;45dYR1Ww2SCisQ^M!>7T=8d(aT4T6D%Z`KHZ|S16^mOm94v- zKAOB!l>)&KRRak;d9XaJZ9D{i1D1luKXmY#6)GDS0lC@JQdSd^8*`Qw*(yPW)|VmQikqw?ROj2d!KB(c!!}FCpe|v42TZxB$_V#2^Nmc z+u3FP@2bxMfUxiP@0qjSvd)6GNvAjEackJ$L_RH-?R@;PI&!-<>lK#IiVTD-I`B2H zF}j>!xiytXUhD=@S76+)$L(Ha_ZB}5>j5bP+?|8pZGS4L6=1P6XGBU84v4|wBSqB! zLMTM%7J^Dt>-fn+aZ$-%1l$L>xm~4M(mb|h@jT}f)#`|S7D@onL|%|DRH#g_^WY%1 zEitnIK$xC9G(dlO62&LnQQO?<{%Fl3%;CSaww8`A*qMwOhl&C!U}M(M++3MeRA3VFPPp<;6BNW z{BKIyJ)ELJ$wUJ#D7G<*^zC zt0$mQAMoc)kVu2mt=8&|I+D>Kn8UlLn*CQCb-HOEJI{S!lk^a`!-h*BPA!H=b+In= zEC;~zqOh*0%5joE_K)rY$L8(G?7>c6Q`LXhsn(kmZN>v!Ao%Yx5nU6BDHx%s_xt_hU} z!N%INf1^Jp4SQbq8HWFz|Byqn(R|GLIQ!>X{Q{@D%U^42YkyrHG-Mw{yB#QzZCGS| z5B;NK2!O8V?ly@yQ{B6pn|Z7o58E$}#(1XIV}=?l7;6HWT3cZX!eNiykOW2@RX)w+ zwh339w<+q@Y37Dy=K_xn|AG-=Jxi%1<# zK&sEN{#WApPljy&4J&4etT8rh3!N09%Jzk&`>UnVXY3m+P>>x+MeN$D_Be)i{w5kA zrc63o8b}TGI`m&}#crA{iG2VGp^>c=TW_~3);y?{)*aY37in>qA&noA<)ZrUwBnu% z!^#R}V{zW*B5tE_+^kRI?nn33CHxO$EX;EWBHJllMhwuPh}d;7O(}3p zT+nAmBDXsa4zFmZ%x6Z{IW9y#E@s^T_6A#Fot@&cwCz+NdpusO4xzP5%Z75qtH>{` zjPH&(D4WMG1u91VVx*V zpw!e3hx2AClfj2F$|Qa7J(EH_n!fWdWwBN5u387s>)|H^sxTM7t~-$kW(I({`bTN_ zd!UN({;IdwIP2Nc%5sMGeNPJ2NhvFrykham)yY?c@$;MIHy(IEh`dh0_uA+SA?NWJ z?~Ln7M_TD|LN(rQ$Q4@bj@63ETB%-KN8_WErN~J~BmQw|HeWFu^?!E1l@C+*^p8e5 zeR4VLW$!C6G%A~2$d1t}YEnpHCjCgXT$sU{nhQXQYSCvlneW>p!4}nVud@$yz0qwKh4OVSc3&!Q(}HRX`04olSG0do!S{x@ zN5eZG6nUZWWK|gN6hiFG`8YCJn)*?uEywRKF4Sh6&NteaNQ+p+n1;B{+pBaH7;c~! z7SD`tfWBJT~!%Uej zbh+^6A@7LxmX*0`+sVrmd*dq=GAUF4+jwxdIOBssT;+r8OEW0tsDtTx=qC(L=Ny#5 z@m-XSYK~LV>rR}B9gP%R7EXR&zzw;|dv4B@b*`~KgyJT!mt>Ok#Cv@*!11?E=R};f z>z`kR`{zQlS$-h{TI@ywl4_NM$tEMb)q4l(-Vhy|t8na`zPs@R!7Dk%W^7W1ev2(i z?2Ll!t01r1oAr!)Y{r{<$$agALl#_6&5<~0n~2n$72Vt=A>#6iVI%!+5;LR8)&Y~y z;F)lICvJOZDv@V)7w)#SplW#OU2t#`pkiy^O{QpV#AFB!wBh}+S3D%GTh#1pr-Mdx zx6t49$ph>tz#s~mBi{+J%zu#4J?n4Y!XN8@MU&Upb<_=`)uEHuHaecpBx_yeifMxU zAocq@&oJC}g2;jcQCv}>XW9w#38o)a%y6!ljo|FDV7P98{M;QeZWDS-| z4dn)3;>z8;4O4I5WOKuq@71hlEn5SrY8Ht!3trL=f$vWA9RlZd9_W#ZJ8dTD z0Gc2vXJvbXXD<7`PN6Bj<2s(6w%sH6PTQEzhn^R3lw)eYzta>%^P&Meaw*fl-!Zk( zc)Ik&;P0n0sY#r6#f`j`a!i|><352^12S;i1IaUfvl|YSd=*J10q))RTKiGv16~(9 zSh0iM_=lScL5>A13$Zuk9}iWIcN-`Ue| zp%dquqHLOqPUsfI)kKK~xOdNFC)%sJkJ)hh$2Ri2B&lY%nvP~AYtGZ!gv&z4Dtqr- zvp_wvO~h!2P0(&RR661{gOnCQ({Evll~Kh33rK^E>v{GdjWB_KYN7zHM)6@b(UXkb zyk_{O5+%>&F15>FPOQ^KULA8RTNKAM$5{`e%Gln^-ray!qYFZcF*2f+`e#6>da!p2 z!#_5DehY4FTCiV#cDW`qz6h#WIL}a$PIFRuWy;@Tnh_JWmBlj(bTl4;fX0%hT$`w=;%<*eD9H2VlnT5-Cx zz-69F%C6>e<;dr`#226!mX&lQJfewWvt1QwBI2{c^6-fxkvCf;M1q<>Bi;j0V+`vfEEp9APDDT18Ld%D$U{_vAX-y?nt-p2~Mwi+~>6*Tgsmzq{Gy zQ|aYtQf1B;<1^7@8%k&`<2dDcJkHYkL0?n)p*36D-{f>IXAvkUJ9Tg6Q;jV^+aF}f zcH`L#x=-s#?`^iXMQvYWyb{1b3gKno#Y(q`vp(d23TW(VymHcs@(h7+`fmPQTFPE* zAZSwyDmf9?j!L)@X--pe$%F#m9LrMh+f#?b@S*bdbDJu*)V)XN;n|tWXwk?e6XE z`?b3v+gIh!upNF}?g8wa;*Uk5+u?pE@wLT+^%GD)NWQPkng606;!X7*`b_3yybqIB zXFcb%9#mT~F*$I=i3+|;<$R<{PA@_Ko;Q_exLe_g*r*zQ()Pwy{$1Y}@-3zp2%Gd& zP}IAWvYIsAPz$MEyE5J+9j|lbDXOZfDsEs}_4^c1PAt>ExIV-NsUvEvzg?1u5Z%ugAZ^nBUb=xvqAHWKrn>TTz5tHJz2V+h>U2S1dS z>gKiy-M!2*FekY|TPT|RyZMltAtFxd-M=XmNBowt=2m2Bze5K~(`s*~NZdA9urO{7 zvB|CCcX5fvNwY9=XEUI6m9Y_#)$ofCF5)%%>*`E z&zp6T9nq4c$lSA6bk6_h6}uOHM0ZV25P8KPx%eoFYQA4$Y;RXb{=M1t+{yLe70cy+ z?wB}C;+rUHBsHK~KnU6x}+Z}@{d(zHLw7;sTVqBr`xtczD z^s+6moXBxszGahc=!S5rbPsfqQs6+Uz_Vh+rFYHWhAmP%;(X?5m!oA9W7*B@F8 zCT%_z)k>C0mMo-eF4Et+5CeE8)4Ro~f3Y*1A_R+?JUy+G(DB?T51dqmgEvA-*(JEo z=fCNSHar)~=T7I;^m)Nc;X|}pworN2LhNB(iLQlGfTM?|xqTFrxJRVV6k|PJG&AO? zA#g*orL-WipAFt(u-Np&0o_4wMOaLbUkVy`r4Ed0%btXbwrw2W009Vx``$ zxjN=zqMn&ExX(3~fEnpk0*!>-1b1dYk)Smin4wEmg z`TMAI)coZP)Z=n;QC%V!N_WHOO(;JBzg;R`Nwji}_v#K9W-4^Z+Q>3valo0HK*Ii^21j!j{(EH) z5fGgo(4Lghl(b?)^>i~%dCEl&Rc?)4+zYa5&H1~PPpX@0gVB<)nMvYkBn(NH-pBUJLU}O?PWB@|{jzIh|ErQDzh}t1 zLC&tJ65{3l(Gk4>N3gtyF*~!Ry`56Y&JaMcVh0W-0_f0WrIvA zZojo_urk8L%&>8kSt5B_S5)d}98;KF0*T!Jh?C|e3I6%Uo-Hr}WzRYsQ?47k3cnee z#O#_EamL|svX^0 zI<(_s$oJ`ZI>=u@0Y^@hw0GaljBCEbdxE*2F7J}5UF-8mS*LB9{St0Dao&y`89%jv zHv6)OwA8i2%rnINgRZh1@}^_bW7LHGM@dO-RpKB&_z(I*Omzrq2GDU+Yn)mB&dotz z+l;$WU9>SnfySC>5BOrci-1`ZpNXW11Ng@Jb5e}R*(OD(_4Y`{7sk066COs0=lT`o zF4pGy=-@US!^cL5P22Ga z)Je2VE{mN>eXic2zOVn}#>JVXuQk>U4`stb3nG3aWHfAFUHy3+`6 zz*h?%PWECI#mtyzYs1BepYFGA{bbvCA`Yn(hf&GQO!G_D(V9*DxNQ=xLZ!_^Tb1?b zWbI5z_6@A_f}12B`LJvu>h13>jHFMq8iJgoU=PAiWmPu)4q+1c84hYT0?NgM@v$E5 zG_Fi|W_$bUfeT_!X3lDPV?CE*3>s+6tas$%MP^X0Yy5QF*S?9oX6#J7H+v91(?A}J zM&6j7p8f>)2wkF}qSC;izSprH3s#Rn+xW#Qn-EX(RKU*+)*d7rXR1<}%J*5VDjZRi z8;QtHr-)|{bcxJo=jn|5i6>038i^SE#FzGvfl`3x-5On8Vz50d+BknnBjP=XJ43{m&Lq=S^9c=h}NeVUL27?%M)nxM+LU= z?<+xP`Ftz3E(tGNe28P^1(DMBjtcyV#ZGQ;$^QQPrViRCp|B^Y!~64@+@H^mJMl0S z<*`5CeK=6RiJ-Tg*+yQtc-dz)?EKu(Qpz+1wEQV6x?vdxws z5~$g8q&i{!n%>qroiwROKw7%rCu(^Tj|$fy_O;y&;u@{oOm_?@z#+}V8GuZ~e~%Tk zWO(f<+7y07Z0TorH2U2xSZ=nvGu=#&RSdPenDNbodfX!0+(`7qbu#xV7MG2E?&DAV zFag(&)y5Eli*P$9b$VHkr{Eu=`G=1R)MU6gg}B?E#y#-|&`E~6NGaL16KkTVUlyv1 zX4cu4mfemt^`muF3%ye|zPnUE2cEtcS7i`-uqR4<;@(aFh) z?xQc7=N_|0!HE2Uqt$T#W=9`O74U*eG9%}f{DnmOm|TyJkHqYAlz)18d*9r+HdQNL z9-mY1ouUbOY>{bxp55^rU}!Hf&BswrDMir_Ofu1iQjTwkB%MKi75~^BRta}UTy#;j zuG0^V$U+1$J{A56)tz}|@?^!7Rbf5M;EI1^_2yIAnBX@Bd&3Hc=cK>wr6ne~7>`CrG?Tq{wg4%bS zapC(vhv;iz_?|tPMWd-4=exJY4$B&6leujW*m4m=Js&)Qbb(5W4UnDeec+t>E76g2ODuL?Mtrk*%wSl8Rd33T+O++S+T zl~f=fo;~TZW3WbX(rEy38iWe$URT+-@prN4Us8UzvFjopKT`nKEpi+Clm9&8(2p3~q}? zGaCx~o&p!1e;S$YLUkw@WTgN0%;U>!+4b#@cI&Wwcy?K7X({!4W^+S?QbwRk3hP~n znb9`20vF15X?E}ljfle)1@B5g-FIo0uu1~#A|k1u)7=StSlWt;ip6^&Z>T#XZ3Tf8Avom9sSC;pKQ_Ej`VR~C7k;eK&-pZMClUE5qC}%d=fBo zUXcXk^H zb8#@>HZ%ASo-kTM+ilr#Wanqke&AN;|Dr_-Fr(Pk=lBX-&5xMDFw@ot4OZrdkaaX) z5Fh3L_K7Iss7boyB&hMM@Km-pdobu+J>8Cu9_mN6>Tm91-B0gev-OLA`wlbBvMhR> z2r~y^S7miGmY_CQ+{uQ#^UsaVRpkZE$xzJ_b_QnJAM(u14-%nuPUQ*^;waoxj5Eys z(Y{FD(5dgI>AuH~NEb!%Uf59HU7yC*yQohF_JmOyguV_Q?_PA$vxt46pn-{Rx&DmJ zW8HrFbNhZ{1cIu*qhd(Ig2t1kxnmvu^#zNOTW#a%n~glyv=VEaXs*nVA46j6o{rlG zHi_+}JMXaG7bSan&y7l0%P#*fpmgU~sdY0KODC}v7yQQHydaq_vVFjxCJFI`d#YR2avqO2Z>@0WqpTm~gG$V~`bW&1@D#|ZC%s*PI2F$E z($Ruf!*qm8oLyb%G*ftYCWADe$ex#R25rrm6vpbW*T{f`D zkW1rx|Hc1i@*#;`%y4%r4A|-6a?O5V0f`xF&=ys-xe5sSEinr39;jnOh|ovQ78EBqnMbTb zgvyS}osw;NpJpUjkJ8zNvEuU)hI8AS`Yt;_xQntrb{NR-9tCXHMl3b-CK#^{2dO9K z?u9hROmd`c1>4P>xvcyC%eHUvDhrTM`+5RXQ`raio}jWi%wwmJ$$~7Cf;BVD#huHC z@b9UjDzW-l(b_8dc_ndyZNjFd5xE=ova-hQQCDmCq@!}$+&jP7n<4WamLa=nY_v_% ztXtmQA@cEtqyG8@%bCdTc)KEaL~O0(L=m~;wg8Na>kpQ4y%e|cK@%<>Jlga|^^W-CV56um3?c};`6OO0or|5#+9Fbt>f2$hnlkI3yj+r0}*Rv+YB+z23*tet)6pQzuQO zWU;WSP?n;v>m&G8#O=@GnM1>`i}B!@mfwuIQR70vStL)g9+8P%akr}vDB1V%|820G8O)4MbUNm8H&57?yx3SHe86KA1 z7aOSh>Z$r)5GGbsUNLGjNAvy@AvJ%QXTbS)N^$eoLh9x(3C!v_LwUYz&XN3&7WvJR zy{>?pRrQ%-GnW+&Gee8v*gMDwOZ=f%$TrtCydcrWM3T4%BITyk7WBh6E(4S})1SNyr)#MD( z-in;oul&V`eV)ZW{TqG)wj6`O%$e>#(L>Y(_;-U8 zIV@{dUv?Rw4?b&KBkSgu({w)O1v_8$I+_;`zo~4y{Xl5EV8qQTgJxdC*`6+70XocP zpECrR%=cfsN$!K>=CK-o(e*6v+Oy%RC-TxP=t@^G5vLGEa{Xy!n}ZT&6Uk@GQuZg# z@u*(kQ->`#m|wItKxXxW+_sRa`IX56qp_KeUrZiWT)SxWrQtc*f(IGz@U2-^9&5q3 zDA`tWpR|%O%^{-(ccp_E-ejhuIULm0tZ9KCO_l?%b{_R$#nan(FA+xXzFpnsx2Yu zG!Z*;e=^;1`l%4bxK-W2sa;G>k%wxfPStsKJkl!U16`&CT^ ztWIyvufDhV75pQ86z9xzT`z~@C^PcAIzaNG>f7j~NX@nhY2oYI<;?eKC9TiPO0?yegN}c zUVc7WgoxBl-?oGO9YQ^VCCk&vEmo#AGmb&v)G^#;;H7xA!TrB}$spypa);0<2Xvx3 zDYuWO3c$+-!UbUu(wuv*6dL_mWZOJ2RQHwGMdaGv{st7NH#ypv[W!%^(|Np0MrnovSQwI;GHh{f`#Lv|)GfjHT!r!rgpJM z6(Yw5{ya}C$J>}MeTo+__V0?$U}y0eFrLrBXD#_mJnO0Y1al}aCWqKRwJAF(96+kR zv(stwXgE{wknc<65lClrbaX#d+UI%}0v?kGTkW{6!36x^fQM(4&}@OCN3I`gG$l(d z4}^pyU&SPjd_jz_eD5kFB<&n2lG_tN0%C+$44)0uzAUo9)bSEu-x%+EmahWx$>;PK z+pIy^zVwFuZK3p7+pLyb6JfE%A4lNLn#A@Q^!9x==Em6r@0Cg@a0P_OUX*SUfh6ck zBv(MYNpJeW7GfdhdmCF5Sm}U|6E#4??WufD3#qNIhcY5Um#fi65!Q$q$9&TYJG4!3 zR>epYzXPi}EiYZKuxYPD{h^+fM0>TVk*S2_pPc}})tXiZ(<|=Z%f-~0<#+X?orR-s zO45VOWL2RS9V?C4ArrdeRh7i)S1bUI9aFB7PC%#0beW=@qicsI4t_GTqnZUdT-pr+i1$0UY14m?|snsDNv&H*vVdmB=G)PEx^(b>LXUI zM@E#G5Hfn!-W29Q5KnUGXwE%f|6Ude^xDDUMEarUUXT|=PV1jYqz{kuu8jrea`&K!2#Ma^u`~<8>2HdQP zuCgDwZ~@%ZR|75ddz=*Cl{eU8rAG6^b2_O|sh49GR;kg3Ps^Blx{WKb6fNHBK8SPw zC4+11^Z$l$PDC;JTjZ5i>~W*Z2e z4CJk9f>XtE1oFI0n%=0;<{g#>;h|@^@`n+1ovo*G+D7E!KMynqeZky63Ig?;0{> zN&aCTg6zS0@2?B-dal(PwPLee3)U{uuj@D8IhqO?Ev})p+-09+7r;EOF(X#LbLV$A z`t`+~G#mcHb4wGXSTzf{88VWeD+okTe)M8pD4%!vm6X9h;7d=bgI*-1y(3|iWjiks zPhyJM2oI(%Iy9mRR8q zhnRp`c>5u8pZ`A6*oR8l<)k*&VQ0wH{lCwW%_Qi4)l+&>H1+P+>b9*y1WuvVJw@YG zNtzi4;*72{N};f&DDLodPQyZon9<+AfS~S0c4k^h`rYjD1=)(uXuWauH~RjsKJrX5 zm^oYZeR+gzj&ft)qGz1w(KKFlx&|+KE7Eok4mlC8)lGY2F!fM4Z?O85xaDxa5`Ql9 zhfk4}JA9jd*2Idf$#J8Lb&>_aCf__HWxD-#{J;)P^Kz&`1APP+RnzKBC+ydDLFM1Z zejV2=@Ufu+H%R@XRn4zj!`$J`Z|D8;s>am${s9bl^dj;Q`R{F8lNoW!#4n7p0|vN^ zlk85rl~xIL%(bAWKO73ASQm5N40JD#K4G5W!)Yv`b}iJnu$ns3hcZ>38+c?xml3Mi#~3Yc>yOsf0Y?hdHkN(`!Rz3SlP)kjB1 zLIej>BB(AII?L>p?{GsAgH|<p}Wi6Ve?dPqSp+p0VL@aJurE|Dhi=OY!`qdHW;$ zeDtfR=4YOZq4}jIcWra;nC#gY9nEjm>5_dYrD?5~BPFrt8rHsU9XrO`IH#$MW+eg1 zyG*HeRr=bav)I09j0@1YK4{|Z)#8$W=6`QkY?~hhKWHaHa;G?UbrC6!s>>URZJH9O zDh*ti`>4%OPS-G#jg;%Q6uX)eBFUjQ^)#-ZLp{lKONXZRW9)ISC&HKIGXgNhkyz)U0L@d(EVR@& zR(sRMB0KE*0|0#@5~$?iG_J&E(ij1>?}Nx3vgLCEFfCqJ5zt_vjv_l))bHsD1$b zMdtgU$yj|uYC&JM(Xp{l=>)+++ke}x)5udNY}iBE*q#$k){5F&$KAV@V>nRWN<1tb z+g)Eigs2b@R5k8*UCl~9sDx6D2d;dPC^3|ZyVO)y*J&10HrSPZIB>D>7+c8{dK()3*1x%B$m^^nEATJZg8?zxqA3HkNmQdV}hd}kQV&UKLH7@qTD zTHS@uAgbJh0X;y184Ak_U^7e%XhW5PyBB%%rY6_yU$yzEmqec2%YDa$X#n^-VSRN~b)MD@-$$h|t^xr#Gtt)Vc_^o=v6xH)~w3i?r zm@I7;CL(+K{%$|mqjh_o=?mh)(>C6DxrGQ##aB$^i$AZly$KWhiO=9RS!n=; zI?_j^P*})(X4o4+*;KXDnW{0nqoX%tI&TCY)-3KEu3hf0f<^zVGu+fuipidoLo>D| z4=$at%<=giHaoA6cd75zA2QJ6`@N4wW%TL-sgqqJpM;zU8&GNX^3E}!z9d1mMY<{{ z^e>ErsuB2c9$ipxUE8F$D|xdy_`O&9lff|8%fFn1$E z4rg&73rAfFKGR&gqdb1NST=^w*fo1gr5jL*Vg>!w5L!!WT950p_iQKFG!6;H6MDh~ zcQ!`Yy`ejO{_uzTKJ}Y~Mi?lGWj}TQ@*YY<1)VxCRU0mIAAUZBMKCG`GN}~0yiM)b zol%XQ*qq<8XFVPIfn*xd1$jAG80jWyz>_>C@j#hQ6H3DcpE-bLoASqVK4K6!^Xlxy z^DB4G|N1p%L`t2P83>@r(~cPq30;FfMVO_iF|*`<-tiV|O6XzKXrn(2G2k&=y>qh8 z?#Ad;p~ucNjXiZM{=^eY2e%UVn03r2uSphTeFVsV=z`EBuxjT%h8rkOHkufePQGz8l-WlYn#hgS}J+I%k8vEW^pzb zNOJg%*Vz1*MLisjIU|hZ2daj+gj5bYB}qi*{pJ|-NACUlgQjvi2X|1BPZ5%ZH{&zo z6~dFbSf1UuysK2nOy2`hE*ydP&yv8z#vPCurP316o(e~uP~YEmYEGY2y}0sEXsLDE z$Cx_1xVRX9e~)_eO~Nok;Wqez_Udx+)$lt1M@J(b{c8Q!-)ag`NYIdN^BIQli*&U} z(9eecu1v6KNCte&NMmMf^>aEi&HiJz(?u#cmC(fsxp7uH3@M4*`7cQdW8;EXb#V`^ z?zz)S_sqK8m1M%sIUyN3f76gQyt>lKZHNg}ORsW#)E4kqZ1G~pw!{}(w~@gImJg37 zA8sxmJ}XSryHeQH^H|;XYajI_wemCK^ zbtCmm=kDO0ML<9&RHc*}=R&@CCW2TO<<2FTRek7s@!;S@IYHAwh!PxGOBzK4JO z^|wjKvnxi(*N;au;*A~{_S_{w5!VYO%~42Na&r`V6bd{VChx3EV&N59G9t%ScmYKm zdar;eAQT2bb)S$X$gkproxv9Cq59y9+8^Bds^?qm^ll=x*WvhNUbgNNFJoP)i1WI@ zge8xXSwSSg@yAEB+yT0eq{~|SNgPy~YI4BA5B5qxWx5hCM$LEc3HS&FLJ1_|)g$<> z(`D)B0!k?ewpkM&GJPN@a~}+ikZO+^_u{6$4CXoSso2M-2hsklV+~xlericz{u&Jr zbql%l%v@b}Vs^bQ?ISdP6FG(eRpX!Be5fM@vTeo+eHc?nAZC`UddB->A)GV&pf7XU zPb{g;tCmOkuEgv>1U0u-kFkFiwB%7vy5rz=9w5|8;V=FB6K6`E(xI-f_}vj2B&Xx(a( z@zVCtY+YSl=+NY(PJwD=Z+M2%t+1QAhDL%@NwCe}PcmjHK~Ur6&)GFVMP27PruNSK zzxKb`JDWD{vu`!^zdCW$l~K(s22OB8VKhIqC=;c51{OHD=Z6K(k+-$d*AGtWP&FL7 zr?xH~*KId>O@_LVPH@1kDuh&tuN%<);GZ3B>IHl$N{MQ9j%jSKH797DQvsLG?bI zVPmGs1R8bg=m^ck4kgHA2HmjNZ`iFB;C5l&6XkcH z9h9_z9{XD56s1ppVPg{HY(6DKd}#irrSah|Ac98Wt>y7Nj4ZKRNyHlgmGepC{t1UidCVjzuFKs3ULeVf(Tu}7)jeY z|E)#mAQDj3u+UFl+1F>>98wD;vLc2TTjOKePJO%=x;b1D`(IV{^D42fqYqS^ahZS6 z^P!zZ6f#58p}7fHN_bDhLXg{=SX6>oVMAq#W-AAA!*^g>Znjq$sfzOUU&0X^UFLQ* z+Q^A@)??Lm@8r)kT3*N@IiR%mNj}*dA@9iA&MG1Fbk<=N{-ZZ(5%o>&6*OqQ>Kbt=F=IxgL z;rGdJ`@aUk@Ch*f0`zj!bIcsa)1F@YsgM5)shK6Qm?Vkk;ryHr;DCl+YTc-sA5wBi z^3&ZZ8vx7LMho5qX;{hFs*p1c)l*g-49Urc2Q*o_IOgyIg;J{=U)_ugVa;5E68pV2 zvmcS7KsN2_dmTG^(X!Z7`C`F{9-V~^B#1p%V76@aeb4~(dmGDsuY7LEz{dLM+9W!X z6bHzP24~WeRY;vX1b7RH&q4}7v(iNO?Are6Klz*xngvuPP)=5(M0QHWS6_G`hdC0^ z2&0a^(&~|xJVfgJNPq{1Xn#ttQlQ9_pTWrfL<=BEH(1!Na|>1Ry8hq^^~XHqr!OQpk&G825Qt$E1NNPbh8KUfZhzc?x0z4t z`k53``o!4b!_{C~TFwf@*nO+-1(t;G&@!WyOP%3Ie&Y}huoEpj&AkC`?E&V0DSVDU zFndVJ++Sd@Qv5`0>4}+T#Wuh3BmZ<$0iK|eD44xC&46efU8UMAJR8w88=QO83LY_! zF1bhZB8#-{=bWb6YD6^Dbu_iZE1i5l1K0vzSr&`7_Dl16Mq+*PA zB1T*21H7mjML6X{4KR&lr{{b~l~Su8J|;P3W9CGCJ|X546|puE z3}cp*A4jc40WCtpDqQUgjO<@A`#6|wiV!=#O{xi8`+4PPu;~Jy@k00zJ7fSCV1_O; zw9&}{rkdfj`A?4Z+|C)y1;Li`UQpO{$v)R^+0V&*1mh2K&}yHA5>&@mD%)}l*@J>) z{g~>=|L$^`i6{mdIMGtNd7xXTW@clN1Ewt(!0@Fez|3V$YM5sGg}p?`UW~!Biv(+8 z-`Z4VCI8dpaE=_!4O@Ch$r&vZpd|kZxVEbioWXteY?fPNrG}+b;xZQ3?@%<2lFe#h$6{*87O5h7hoH35Wy0jCVi^`LWjQ|Dz$#11~20 zYo{}b20QodoNl9Xv6ZJNa!3)LP`)dJ5*X6c&S~LPpEenpI?oO8J$8{#NeEi#K58(v z^DRpIEK_ofB2vT6#YIg3NIk>M(!z|4G?^NC49uA_HaE+&HfPIo`BKH$D+C|J+$a6Q zPxgAbR5r9ZLDm@wuvsH!oCZlR) zhjxg}El4xhkIX@l{Shj&2<4kdI*rwI9pTtMOIW+QjfZSlK@a}m({AjdGHYPja0s<)3esZ>kcd557TULTxk=aEM3{U2`47xT>M{Zg4w>Qc1aHc#R~M^Q7< z)#hvxv)U9R|5X%_2WpRQ;gM6gZF<%e1*ze?ckdRtIZ?Wlz|XAO&AiX{GsOQz<;s)t z0))iiLd8W)CuT>}j0<3VHw?(D1-p@g1yA~P`o&p^>%4O;s9L5VdAP;c9#oTt)|Fn! zgoNO*{N(&i$%O;0sE%G^W~o=Su3-dBdd)^l@6L?3uUP9eLg>JU4D$y$eHAq7??H%d z*7Fb`&-KwWtYaNGYF3w^#m!A+a=8xzvrj8;-_~6c@dhgzxSf9qzFkiRE3m@4u+nu0 zZ&ElWkgn2DzKeDK^K$a`z9>4q={AE(Iayx_N04)}f--VfSXrD0H znb$T3*xHxb+8ba@i(o)GeXcje82}bS@NTDnryPjs8z3`#{4?SilBS-;uDs21)beIR z1L7#bc0G@BDEq=x?+W#(YbNva2d{Y6RoD)F74W|8X`~aZ|yst@Q7(M^)?vRwc-zvanU7ZM^5q+fA z#CrI2>V%AOBmC?Ghmh5&tt`@i4P_xrd(hDBi9`jf3jE9UXJjrFYV|6_9OunS<<@dD&o4tEBwoIzM;Jj!A zQl90bTn+DuvSDu3zFc_%1b{wmmYc1c{m(vrE7G~F{t}vyAE3yTvfxtdj`Ab?RRAp` zQ0|i2YP|NokE9wcpt1;nYC|J25H2#(_#37+>U5nb=m3gJL>Jbmy|v?QmV1O(y05pl zz&j*rAOWoOWgg*Pv@lF6gk`IZeWS(vPhG%npN(YPk6f`gL(Tqk3xJozAZd`vsG76i z0f=3Cwy4ir#3}d|8Bc+$@GdNk#8uMTZJR&S(l9W!Lk)Oo0QUB+gD8bD3+pvlZyht( zz2U{{`q%yaP27`1SUl|5d!?G!SCd6mZ44~dt9cH@FhaB9*gc+D?4Qe}jEa#${Q_ht zxUA^$x_o3;KP<)J`okFl?4X4bU>8&V5t#2(!kFCM+O@DH zJoWr)XKb55|T&J7tQC?ef8x?^;V7A0k)q$VMt#Ar5RW9%L8Kk)tm?|y!c z9mkGmdv<^B>pIU4@Abj_+dd;^tGUv0DnurG>km!n`GC;>F7M&Qw%zl|7dJ@y4ApLR zI0X9MJ2@l1NB-N}xgCx`V|NqcP;st2{ITT8Pz@P8X4*!d5ZywA^)vepvx_0RfB@D)FYCVFjNhZj+EaVc3-e42z+{uay8WxODGzx(rzON7OOA zP^>GR^6^|l+s4(;Qjpkbl8@Wj=ln=iUrlY%UOT)`4AS{aAy1G3(KFdy8Y4#JIzL-U zY%ZV6<#z_t$hh29(jBEHHd9NwoQNd{YQKqGYm2J;^r}1I`j3Nd_64n$Uz7C|ceqme zc>NA*8jr2Eg$k5NNd9}m9G*EaG)en_UfVHTpT)ynOQKxeZCL(B!K3q!nbz0c+Wfq{ zA8#TeMn$~>h$-q9op8aGD)Ql%Hy(%Hdp;CH7k(nl`zKo2P={O>-#bnJpPrZ&35oV9 z9k)O2k{9jqS;_frE>q$i`TzY2J1QD}cRix$EgK_%zF))-K)b&u}F0Q=S9-M`Ac2Wo_u37gk6z&hK;hIZ=K@TKF~yK;ol2k7v9GLLUbdia)3@(w zaHL#R9Z(T@Qp87_J;5Bvc?OSUL3wiEOQ9Eslj|a8`*UD)jWQIvXL!BK8;kI}$wk6+ol1$R&1+@1o2dsq^KhRh_Mz z##?Z=~4Z|gZAU@?U;n301M5R z+e4AnpziJ}!e$oaHY;icRVT}qe+yot9%Mpub4#!)n@8v7>(aATIx1m)&~+eHy$BGM)Tn_NNa zHb?$pPg4||w7BWVn?~la31g|@@H6pUd;Zb(`B1zEw1LP7AIbO(U+u%`@DJ+BLE14c zivVz;HNYA!^gCGnmCcHb3p9w6I6utIOIAC{OwhlPnXZ|t@GDDmsDG{QWQYi|vH3&C zjbZinqTeftTP|_5FR!)I2%b=Q?rrGA>sD;fJMc)%*=mr*W7pG@7_qr*e`YBdTScH5 z3}Xq50x6OU|Amy;%|fxb7;b+M9=!MzThyK9Th?-U4|QNZ{VQ$zfBBBL_ksYWHbz*#&U|h5SJHJ?u$xe8}dhbT5B%8dWm}x9x4{ zt|Esot|rX%Ctq-J&9hbm$VE0r>_0=Ovb}~+RGlDz0Y?b_oDE-zMBZhUM8?9Hz2#4B z0)tEEa1n`MSg_E=SF))jEz*x1Zn7cDs9^e8GU$D8%f@F}4g70J?0Pj`esMZ7f$g)n z<%k~a$k3(FK0JR%vCXq=UVgBlY!0ansy-6WR3b<7(u>0C+N?|+y zGNX~V!n)o$BkwOxgpFq{d9&(P%N6^B5Nianu?v77A`ylcEt3n)(goR%70x7FSj{gu zy|gt$dVnC1Spp`8rDn_69>Lm9?3r3t#Fz-pR95mb%-Vp`$z&6HIK9$isqRHj!Zkti zG^NLd8s-U5YU*T{3%*_RI|g91nSZN&HQ*)+l}zF*U<%59hY zy;xU7;_>v>hrp- z&HQdID7;5Ws&FohjS`!g*u{6lWC}Wvmddx@HT>63XD#KohHZn4cGXmOJ42lMs-SP18lR=DnSe)#isHr$E&Dge)jD5c#d){z;CDEn$qMY}rRE%4%1jvW2$- z;dqbQE+47i(^kp817Wta5STla(HU}W7s=~^MtTS6bX=Kc!HW(AzTXw3<)J=pMPZ%h zx@8xtp3LxS38<;UXs)mvp|8?`9CM}#LzXL*`Rl|50DEt9$Y10{xPAsl8E)_DZt+>C z(4rpeW?#!ycy7L`+Z{1JNxIE(3m@VFmPx8+X<_(78t zIOVy=?5ACL$4u|Xy{$4V;hQ-V+9!aWD3>v(N%ncQw3K0rlaG;kEKx<@zd@R=Xn93C zRj6Du3WLc8Pd|z=A`Z;8Q;!3Ct$j8=sTN>m;k#V8PSWhHi=##k?pS}gfXc6rU*i(J zPZf&#-w|q5sN4CV1kwU0)3ybh;?-(1OCef&W6-I&UP|NG_-ZS-h0$li-wVw$M%fn+ zj;x`sijf%H(p%Kcw|$$&!YR>-mUf+h)O&oF15LuT>(A;Cl3Isn%nCI-N5mB*s#{|| zBVXsHa0Bt*H$6sW?&uhgbM`en-W*9Z@RM)C(Fw$Tba^YLSZN(vnrRl;!40jCn;=od zSbqGqV!T2nF}lfsEv~}L4?0eK6;@*_+a3KC*olNjyBy76Jf}&c1-U%#nb zU2RPnmm244NDqHWsNI6$%|}15o6wn2*TBtb#jvK01T{cbSK#_^jvdI>)rMRz)gy;T3MzekwypZ zr&aR3UI-gTX80>aP?+775_OV{#Gmz-a)$D(r}#&B*fjf7@;}AGIbB+Ur)7_{Dv{(T zwFmXYInowe!v5*9TF@coE;m9@JX>P4QKBT+(=)+p%e%n?WRXgdY%w-_VE5sUIM08t z@P6yL!SwP#nh_4~h_bGBb$y9B2eRJ>hYedlBZ#9LqTc29`}XTYT{2kPN;<&u*XR?e z0D>WqbqLCR7z0;j`-^Gtj$ujK4zxPgbLm!!ZWbJ2lMN`J6njniK+-O-Syy&_G+wB~ zpIF(YChwjQWY>h4pPRX2BIhzCYewi)X65g{oRF!%lc1r@hFAmFFPa4zOKPmgL zn5u4jKrNq<{6*I;EESyNM5k~jXxLWy*n1i`t6IK6o8gMA-Q;VKH$lk4;oL@*8Xf7c zFe%4mM*qsm-IbV1T1@*wxltsMJC{>3K3D4QR*RWbt_9B)sS=DaDJpgC3o~3}YPTv6 zP4enp)Ao{?yw)Rr<0bvxOt0H)_-uWmVFyD)HJZ7_o#V#+r%H%EgCXy_RHpCtO-Jpj z9gn4iiUuj;+7kRMTRpc8lJ9hva0M&vObtKvIEi!qeX365hqp@3*baAVmj07v{)i8` zi(@jBtBcWOkwo4-Y-ky4nY+1}7py@VXw?!p?5?Y%YerBcf3I`pPLbJ=4(~jTPi3$u zo-~Q4la;YA7f^Klcc3ESMA?!qDB}@~w|KxScSHTJbO%I@iresQ;YT$pGXHUJ?}25* z#t!A){TUwp*D#snkJ@Od$*7H5xbn15*$a3Xx7;!~(CG*q zrZEmXP*kY z3w{bZ^}P=wm7r=~A-vYP>56wWaoJsrwAG!Y>{1hZrMp)8CG3|bLVl{orwu*_-g9pb z-Tu1gg%QOx6YM^ z(uRBk52*AZtfsqtQas3wFbKcGqNty{BWERce;>X`6lNBVx(s}7YO!?W2VXe4%lF^a zb~M4hX`JNau;dLf>Cz@ILC(xl0%WWCHpY+9Xn4Nc&vOccWCMg-uLompVp(A0_=p4!@tC=L8)3BAZ9ve$VuR=7N z!vgV3OlBtDm z0^6W!>P^@zyx%6431ns$DqV)k~M5Pf01PA2D1(y?|}jMsem>xB;t?7vs zxeqfvrlrEG>l@xuvk65XEY`%pDWJS!wnvi1oj23aX?ybP9Uu0RZY2}(xfRS}Hy0Q3 zpXm&zTv{>H-m_`ghXTlU#Z{T#`fPNqf1(xFBDYuqprUIMC(`K|7=3hKP6yYV!=IFV zL(*u~9uYjXxuga(Q&04rTv`@X`}mJx-%_RtkaI8C>UP~sj^cx|-_*5Mf9xP*t_mr$ zEJBsrji$=Y0KrZ#*Gk{@{Uy*0L(_OZ%;S86e%Pm=6&E{!DA6Zb91w`M7Ve#72*!wE zcKgFB5U@m68sH+Gc7UnUHA5-FZpt-GXQ{LxaclecomZZj?_t2*km)wMbT^P;$Kuc< zh!x?yA_+K$pcr^bwmT!9JZ$eAdbSq`vq18rERZY9R~~Qm$&8k(tu(xnn+5(hR}Pdm z9B2AeIIX^KlLToI`!tikiW!c>(B>%m;|SuUQYm_|+YlRKoOSbXKZ~XVGpVno%gU#lId5+vy`~94 z{km?jn~#U8Hs;$5UAI+d6;I7@YrC_E!LhH(gXAnB{j`zmWeaEC$5dCaMBrJ@jANI| zM(|Y<(i9A39V4mY8~5CeH~!JM6#|_#`>@aC#%#%vby z?WQF{TXlrs`6ck-jb^&%IZjiHyt!<)PCk@f-*z=(uqNdHhFruWd6G|=4Br9R=Omge z11|y+)4go+6Ds=2fy}omnf(N`2Vcs0_44UTRhft(D&%wy2(MIHT~wP3({eCY2M31F zE+0vn-%u7Z5rImB!VSv?x{$+xK;59vct82)Ej_Vkv60`A`s- zZN0*8lnxhNs!iJ<8g50))kW~jh(CvP<3@m{J#x_kOD7hWCEh!Dm2iD=s&jhC_XRA! zdwlXwt75C@xV9OEpw@^NrJOLVMw+$$Zoz`IaY=>$yyWU(20YlFd*^=0GMXa(nV6GDt?NSUh+_(U(n2%61!BmRQu38Y3fV zX@vEJNWYgsz9~xCoDB} zEv0bjzse~>al4?CLeA)lCbmTd^}WQ1d`b23QmS9f2hvWDKYYOPF66}@9`q%{$k@)L zvJUw;E;IE<3F-O(_#orR)|{qhfQ^tS+;!y+d<#X%TPs=u7!vM_j;C~HV|*;*ioOpO z&w@_i*Iwn*I|b|r!{O)$_z^ic@MxsM?X7UE2Qj&|t^|y67mLodmNZM8M>Bw{dY2tK z>RdAcRkG=U4-cTDXBv2r>(%T7vQ?&zarp_xXp0>BGhcf=QB?BYk3;nP6zl`oi`(Q_ zRj6h3<7c_-IPQNhUZ*dpo9sWGZeG1k!k<|6g4d~`%{n0lu#jayr|ag!9;@lBKYL?3 zPcHhS!i9Z;K{#?k+E17Xa77hw$w0O;<}y{#^3@19_OsyW3Y2b~7rUMesvmoL%|oJ+qCWmTJO`Zbhi$2qyjK}_>}qpiQ@ zF{^TymFa~hjhWf^CQgcWxhpL4E}S1}K^ylf+yDcK3;Yg!Xv@6y64rYXxAO|*>oArf z!7{hG77fHIXwCqBQ9K^iU6P9_MgHo*HOgl&o=)lWV%XV(o`;f1R9-?!-0!X*0orxx ztR-0@jAgPIl>_3g+_#}VmbhWoftRai?Fyp}X0)H-Ef*&IFXufk3z|Ih*IeCcOFp9F zx=uZy-l9bLV88{-?-G8oG)Z;_v6A-2NvPXq!4vk0vrO%FBCZ5BOP}(NqnvW17wIOv ziRzPzI4z51akEj2W)`Db z*l;(uma-HPFWw!`5&MVsaCr}3|D->GHd!SUs4Irx2D3GTzwH9#mq|%RM%*rJJU3O` znqqhGFe5)snVnbExE1bcSNr3p${6vIYD3e#-p;JZeF^g)uwj_9pl8?)=7nybU8tDr zR8L!oa!tGg`TE~~%ngFX!(M0t!j-uJK*>EtBJ$byU|zLN%8Q@w7-qsiT$suH|qL`3#mr#2+*5eWei=-1yhRhE*$M2w>GPEu^^nf8=#9_b&nSklWw; Ss&d7yFMXq;tz4&M6Y)Q&^WQW8 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/Contents.json deleted file mode 100644 index b96c65ab..00000000 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "img_no_myreview@1x.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "img_no_myreview@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "img_no_myreview@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/img_no_myreview@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/img_no_myreview@1x.png deleted file mode 100644 index 84342b8b4a2ec55d324ddd87cb69cff0fa8e727e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6910 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/img_no_myreview@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_myreview.imageset/img_no_myreview@2x.png deleted file mode 100644 index 11510278673328cb2bc67d33a3b3d68707cdfce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13086 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 zgIDeDMtC1n;xz;S000000000000000000000000000000001b0{|-oM&68W&i8ufN N002ovPDHLkV1kz=rE>rP diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/Contents.json index ef7a2d3f..5eef1317 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/Contents.json @@ -1,17 +1,15 @@ { "images" : [ { - "filename" : "img_no_review@1x.png", + "filename" : "img_no_review.svg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "img_no_review@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "img_no_review@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review.svg b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review.svg new file mode 100644 index 00000000..8b910959 --- /dev/null +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review@1x.png deleted file mode 100644 index 5db2cb60c0954c375f7fcf1008e064349e0fbb3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6972 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_review.imageset/img_no_review@2x.png deleted file mode 100644 index 0e627de67cd5548cb80545bc6de29337aa709b46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13277 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/Contents.json index b943180a..77772d8b 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/Contents.json @@ -1,17 +1,15 @@ { "images" : [ { - "filename" : "img_no_search_result@1x.png", + "filename" : "img_no_search_result.svg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "img_no_search_result@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "img_no_search_result@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result.svg b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result.svg new file mode 100644 index 00000000..bdc1499d --- /dev/null +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result@1x.png deleted file mode 100644 index ef16cdf7be065e1555e626f8172fc648ff00da07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10249 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

IXs=IVO7y! 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%0Db_?CapSvFSOe!@i`h-QCK zC50^SC{jNnh1OpP>nr~KGnIl!ikx|{_E?p(8vL7z`wDH_t37^mEk#q10W6% zSS{foXeX+h{A4%3=tBJnoYH4M(tVNxDN0$wEsBO<2@9=_h`Qh=ZZ*eGd{4lW zx<-7vYl!{+QTksA@Rr5Jyh8WYc>ja=dGPo(sKpQ$`D5&S%x5C)pK_@P{QVe@zWkut zbA?qAKZbEyC7=>^z|^m6{oIE`zDiRYu3xEc-J^Q>NQ>HEwwigrYxG!0mc^v4<{LUrepOP7iVebu?=RA$&grA#e zFFIrzGqq-%g|=Sh_taDh6K(=*s!Rf@>nQ{Ul?W)4*nUcfJ*H3%g2w}txg~kV+KtM z1B1S}AExR-7kjj@oeS&y>~|E^6Aqe}gq5dJIO|~Nx8VfxBql;0VfU@(44FZ*4wv8J z=P68t_(me|%d7mhNiRMmtaS54g#;tZ@qaB#^kbBVJy}w|L!);z=&hLV^?LB1=*g>s z*HLk1zbu{80^&$o62mh!Eb0WZa`fRs>}XkN(Nqjw>={wfVZE_Xokrc+9vY=8 zA;P68HuJdTkYo7wSmkc|W1#JW&HAnzQEG`0&j4yByKmS$0y>i)fH(0IJyDa3zVZ zm~jWtF6DN-tpRum0Wr_mDm57-`r;==K$7rrh+kh2czB4EuYu8?G~eOSP}b7248|m8 zA1Nvz%ej|$n_AHd1o7F*7Sj|vAG)jQdlA5#cUE>*KZ_c_bUsQNeboNyYN+MhoNela z4>eIfHHsW0!p~4iw+{bTo+b?hVV?UV1^j19Vbqc2k1kEQGhPEV z;GdCHu-oU8mficJkH^dk;D4s9&DLPd-#q`r-T#)reTQR>kuLq8`pisfw9(&qhzkk+ zYcEX32=u{W@Uwmig(9qFlsH&I?G|YGhqdWnYhg+sXrrMbX`-T7xG=FJ3a$G9p(X(| z3MPm|z(Hj$p5W(%eMZ%qW8` zYHuz+vFB3X;YB@9$-7J&-KEI{nlS(mf&Al!ucZ3(F$O z{h~ZXgg<+;u%KTKpZ}VbZ%W+YOkPtoZyPL(T*7RLP(8rhH39_r=ixlfs#JHHna{GAenlpVY%Lku1qKb4xjr}D;OnjWG3Ok zqP{H=Izm3TthmSHcsW`*E32%DQXwnMDYkb9u4l&v$yB;_BY>>9Ii&ZnH9B_aHps!900~61eO!%3fDPY1yo+! zy=-`G1)wFb80n86$L_mL-jVbvwXgdj+8a{(dxzT}yI$>zA{k|7Wvzr@_n(1||2+4I zwu^|aEKfPNn5VUF3WsSg4TS(rB?0HnP}AtORkf zsi+lXg##E60}!GsgxMOgfoVxevBH^-0$V}|b@YMw=Pl#j@_1`=&)x=ne2zi(0UjPk zb345EApg?_VMr|yhfEL_a>}btlQEJlWqFdH?Z&3Hk5iFpu>EpvWT3tc23F_TLYnjl2&pWtMSIZ*j z`U)n*UOVRjxch%-%um7XML$FQ`-{Wnh9zomgMze@LtSMeorW>YDcCh1N0bX)Vy7?> zyq4|`%lod#y$ONEA2lRA9{*aS^pzk}O=My4VuLH!pOmp_kLWe0ENe_)+K#pEra}9qU9(}Psqnq^*vSPZL5MS8Sw# zT4eHl5H&zR;BQ2j^8{`f4CnHnbu$RgL6-r+ye(=`JHwEF&&Do!uj$cW-MvGblaNo+ z1L)Uk+MNuXyerfPM9(S%-=||@{*kd0xF7{6!iPPvd3qJ%Qq~)eq{NQ-xsO>r~QhXLb;a61jObXT|$|JHpv#&(F6( zI8X})5Z7VaYPXO6Q(B%Owq`CHz*LCWxG3E@|HDmAWgiLK7-v)!RR(C8|GbUlu%LP( zV~;zelnSozBVMyTaI3NO0OJGXT8*EjoqT{a#W#oCj-l69^d@E+VjGlrPahSr8F@<`CNmF1K{1wMVr0}{?=bm&{LT06nm<)OesrU2u!ZB- zdNqu)wK22_%gmMdyMA(o2>qzgfJKE?-CsFDc#A5iGQ|t3BfIXSa$-p%0as-9RFqCD ze=Z`27Z8!;54J_?^6y0Qg)HD}D4y}4PyCbL{$+)pEv=1jq(7l9owE&0_OOYzmo{F1 zhmoMkAN#_`DU3)ay##?De0X z=`ou3-%2&{2&t_sSPEOlv978wa4*VCx9X3$YJ;uL=@I7Sz*!l|Y!b+~0OoE3DTK$` zD9P;4J=1ToX`1H`tO(N8wwN}WI+A`H#GG^UHE5_)-0wP0n@6)-joklUM0gXuP$_<~ zE*GR}`X!-!7H#slo01dF-cdSTU{vl;*NvE<@cQkMqD7lBm&x0 z1T9)szWzp^$=qBZ9dNA=HHl_;AebYibo-t^b%l9Wq9s<{>x2TZo)zIe)gf{S zx6ayqg2d>3eC_$;!@efs@z!hYL_i0ER;5-JaJSTcn(gg+67E%mY0x4NvO0-7iXQg^ zahram#jqeJ#CNfA?z>*QK)$t3U@o>~eu(;Uz~-eOjgB!t9y(x{3*l%c%$t&XaG1#L zDz&aDcZ-ZcGGqNEUO4f}1Wz%6QX+FVm+QEfD7=p4ilxR;mNtdC#jPa;f~IWuFn=A} z{8?{#$^c2%eGsk9{_(+gA(tpJ%TFj~tlT1EiKDy>$WCL|=I9v%HDf+4R0%d=rL*i!wJEqkEj_H)<`w zhL==(=C;hTqxzpI6M&pvbqqOjNE5kxuJLfJSEF{Y4rTP0iBse%<}X-SlQDFrZT>c! zZ!3i0WZa4(+OGRFp|b!!D5yA5xh=-4R4K*Pfq zbC=c#9vPv@FqToS_|xk!A{!hfA^HjXwHhq`itYRj52_hxrADT~1vFP>r+RLBYHo0F z;7`NI6dw(Qmd#-0I~2-^6dCI9wsZr&0JXbN;fHA#lU@pb&NN9}hTamRkRhfOR zJlFc?%r>gGJ4LbMSdP`j-A!whRe4QSI_khx#_I-x+cBxqsb+M?I4VK*xlKN(^_&?| zSNb(QqSy#k^+vBxq0#q-nV6Lh{q_xe^h!Sa!kfUo+;9|_OpC+*D%|>W-Y7B7d8jT_ z{9cXlt;EjG)xZ_vs*`sY}gpgX`7Ei8?isR<|YWw4WF_G!q zq#E)&Auj_D5Z5wHBjx-k{^)(Ntcv;nAdz~(=KH3YH%5yAduD+W=m~Yr$ zlwfbO#cLNXyuac8g9r6%>%?~+=V*zdWrgN5Ffp=nm@Jqr4e#hYC`sRX74l;I+y)~W z@HN-y)PD5RIQhx3G8=37KKQRt|5ac=!c6L~sO$Jd=*i^dq{`JXvSd`T30H{YcxQ(v zbzt}FMN+6hL06S#^-1s3SI%KuMZAx z+k-1Bvp9BMpnlf3Ch%@h@!A&q$$0@`>{g17% zYUVi5mU^NAg)a>RC&@A4Ow{TZF4G+HYy`Oa#$Wfg3l zgPp_fX`fqbLcs~4>Lkj_iwmkksMXkp?L!l=`;`wXdi!}Fh~QqdzArdoG{!zS)iESwJJ6Hz9@y{ z=or$)@3&1@Gua7Gq{lAw`9M})*Y^@ey@4c@>_X^Uf5Qac`$n-4D@Hnsc_VBDnyvch zL}s|4Y0ozYnNv6H?rofIRhIH(H6R%Gp{vyE<=SnTeA;b7RS!2(TINbb--5Gz2L&Hh zVtggi%JwOlB%fa9x$e^Wno!;^+R4UZ;q@jxN6ea$%f%+Wf4)`A(vsmE;#UIC6@xuk zCT~%5_Az$K4>YUp2%8oRN|FJOBGW%|^}Y!|U1J zMA`=q667(2*A7I;C**K;{Z)P&&f@(LNJ0T}tV`pnyRZENY@9O~l3m`e^f1K?;Vbw5 zo4ssOASHGVjU@jzX3TQ8P16Jyy>D?noa>mIdAJDi6ykEmT#S28;QYbP51)=IJ)4U|CR=997ZV<|3413(_8CC z>lswCrk^{ydMD2c+w-w<8H_9z zSTV`u^QpAw_pMOY)G%u8@42^Z5YuXOV{0q=6d<2dH$&!KNB8tUFXm!oD@w7(VzWN* zd2|nAs($ZNAY3#!1LXFszxZaoyc3SntK4<6cU3sDU!GO}ih1f-Ew<41W!$0w{8m?e zKk4nfGKKnM=A1vl8RDMO8M4^HQFGFdo3Ac% zxVXsS|LpG0d+}`K#5`K`aT)hf_=4aQ;)6hkc8cb9}n%`E($2bIX%KH&2!Lz1dG5aceiREdpiCEAwsl z9Kq^CdtLkFiGc@%YWk*~lBes7K%+0(B~dXpYsl@+ej8M#a05UNb+eBuxgt;>57)=z z;x#w23-#w#cFsQZ0r=sixRSlQy0*t_cSjpQM_+sUS#InEusLx%0=Xz7vmEkZ6=v$N zK}q(_BOs7X$EL~ra~AFC&x3Z0y>&vJ_mobSxmXtd&{3)rv6n4gB!?IQzjF~J?_d~% zu>3-knMTC~+dq}g(V8NaRLJu;Hz#}z)x16Le*#Jiwe*A-p|jMLU2lfN^~s#Oc(#J) zzBo5$cSh5j_<9kay)2BDMXyFnv;w*d#stAI1ckLN|0$&uT(&zg#`f&{lwSh#se zFe0{ku5qJ0Io;iYYz954wFe*G)HR0XY?+-(S|pylc~&tIP;D!|wT+E37tVYMJnkgn zvKFk869yMW9A?R_l)`dFnyjW7$>kO@kyV1G0*r@=lVJgGvd^ zaa+F@OE)mAg{5&i(~e{87Q+vI5|_Q0T=Kmx@&GprxY{9bN8(NjxcD%BCQIF z4DQQ%br|ov+UEINB4%Sf#<-s08o$%&&o^h0vFHX(S8@E|L)XOdQrh9QS=l9nCg(R# z=guy8d5vAh1Q)>*EQ|lg1gR6-$I>RF$>Rzd8t_t!z3+8goPQ0sf-~<)S7ics70isd2An)ni)WPPSL03A>N_k4NIR zi38?>sp&VIawVah^Y*sm|4rB{Z-VPnxwA`<5XAP23yZM?5wpJbKqUJ3Zv0DZ*QI7l z-!0xPJcFK2nC6gx$n0Kaj9+Xd`>w35J$O1jedb`?jkB_IOj;JZ6FhYR#ZzZ#%pzwS zFSbHj*x}YVUa~{taUnhvvMpZKG;#pD7U=eNIxBu`VJ2MLE1VAi<`uNd_#NQ|)T_0Q zC04t)xxU=>`7I)=&;oVpv1~M3kCxn@YSlu{gWq=o&69OF^t@K8kEY%JlI7Cu)eYM2 zyOW530AO3IIFYt=F!Oisx;*C(f@+ZWxdX0LtN?truQ zp%6J)ZGR2%T)^8+A%TLp@NSB`GCFXqB|Mr+S8nLnLi20!e(YSbe={L&7{hi_)Iry+{j|lb+yyT<_d6F0@QR@=fo@mHh#bQ$FE!MS zeVeylE3~O?QW-_FA!Zs6NkB2X*j&KOO?ce;9PESu2{2Rh6#u}uq=;!={=$t3w<+Sz8NtkDY?JFkbT8rX6Y$3F9FE6ZTY0DF#w3z-N1+?|?sZ!U0Ss8U-N;TN3HlW{su zQlp2KWQRWL;-s?oAK${;&Eo0MIO$HHsHaB8d>wbXE-s=C&%0d`gEf`v8P(^Q4BHh@ z#-Z#OB8}>Zo&^*I4cmyp1I)v7Q(F2WioW$$b+{x%4bQ7gTE~l%o#2xN8bs^G53tLv zDVKuP0?tLyecSc)*!*OGDO{lns5LEynZA=nT?yE0+vr)p<0K5wrJ4*BOS4+QdN@G$ zVy}3zV7nMI@wQn?jUFz52PUUyyd2{au*yh$i@bR4Q7_N8%EF5GFJRau$Z!`VHGJqo zrBboBz4aur3avLcPxKtxzMZGaorfK@o zM(xx%w`$=ai)t?(?izn`TpoxSR`E64XL({!dG=I5w{U8zeVivr!%$l3)(bCA!mKz6 zEdkZQEKKI!FMuMNXJD!X2T^d%3=n>*+yAfpSb&z;vPh;nmRVk8^shP7fozXxcsG$H z&bQl;0IUS;o*}a2RIoIfO0HwV2VHwC%?dJkEHs1|3%x7hP4o(zA958?%w}N%qSY6) zW3Swf(eb^Qf{5E?!3R#3xOK)}nBW16S=8M-M6i3u)Gh>d5B;+KV0BS^q2~`i!ebo^ zjRT%*QoT%t(u{GfvD!iqgjnK_Li2rSneB|GFIw9ojzu9dS1_bgui`$p_q*j0jf}}l zk}1Gx2H?;>yKN_YJ{(7DySct~rvkBM>Wmemca76~aN+mbzMNPc#z*kB0Ye4wLnBMv zJiR+Cc83DylGw=>13VqYUXVzomy@}ZU&=VpjZ<<8DOTDvdwM7xaLVy7ms ztWcg?9VYt(G}^%i;enkL$+9i>I36#N?g3cDfFqaP8&v0!R_mfcdSU{D* z{-n?-CG&NBG+InMmXtMw=0bBXJU97caY5Zm%J<)h_0Ed;{tY3XS37xer>5V#B0lT# z)XaOHJL-k_;nePE2V%vI+_l93V5I-7XSpdoGO@{J-kA3G{ z2zq*r&kIAlC0&|7AT#-5it#ofkEX*+e8yBu2N!EvXUc9x#lK^f7vd}ntRk9lo;$F^ zMDPkIL}4+Pn<)W75QGbjB<1e!ttESLnFkuE?a=Syc2OmYWD|zv)~$4jh&kL0HOHV5 zTv8^`dTL!Tn`ZG^ZM%-Q3I{78;$ndYYC80&Mn!9 zVV2s6-1i9!x6h;Edm{*fAP9mW2!bF8f*=TjAP9mW2!bF8f*=Tj=rjI59(tC_(a=Hd P00000NkvXXu0mjf5ap1y diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result@3x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_no_search_result.imageset/img_no_search_result@3x.png deleted file mode 100644 index 5eca82638f419080804a8ac145294dba3afc8efd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28972 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/Contents.json index de222f00..0b5586a5 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/Contents.json @@ -1,17 +1,15 @@ { "images" : [ { - "filename" : "img_search@1x.png", + "filename" : "img_search.svg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "img_search@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "img_search@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search.svg b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search.svg new file mode 100644 index 00000000..80c697e6 --- /dev/null +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search@1x.png deleted file mode 100644 index a147d439dfe5c821d3b75e20acf695e055dc8a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9912 zcmbVyMN}M26D{uU9^8VvySoPogAML(8Qcl(gS*?H9}WpF!5Lf=T!IFF{EN4GySFIm zI^A8HI(_Qi>R2reMNBj@G#D5dOl2iGoe!J)ArmM_9~#oav-M$6-IRM^VT^a_aISKv60ucs=QC(S1TF(#m+!Q@veK|vdxQKZ? zDcj{H8(3i_VxM~~CZS3?o>^CxVt`|fm}!6$h?x0>`hV)fvjmR?K-&(Ed3nzbb6S=2 zE7~YV1(b0+J>Sqn!kERB;Sj7}wwY8JrExm{UHWf&&JdDJa_d93h4lQ4kFlU{9q~fM!7+k4F$FUl^He+mCVf zBN^B8mozJtkFsJ9_^jcG{?2G6kxX_Nu9aHBWvuU(NOe)o7YE*dqg{5+iW_V=nJPEDj-%b+_W-?ojyQc5*7f#(zd$Y>zWo4@=bc%NW z#<^_;-z<%*U#e=5QaxsZDqXS13vThi`|mzful0@xyh>le*+Rh?PcYF@P9Ir0 zS_+JcuwcS6g05trb|)LXBEL$9{DgmeyFVAq$Jew&-#=t*)EaST9`mt%y{A?7Pg#>Y zKEOU|3-&Wrh5%rGK0p03o9_sIjarNDG$N^+w)KCkZ5)q+=4gNBfb5DXI`90>GAmzs zKUSQ;nuHT!q-^|;DDEz&4zIy=+y>D;esbB;UrfsMt?H$M=cy$|Ln+I8wAgjr$JRNL z5*D0rLkhL1)aaLITID!JJ`;Nq1w9VK%l8?MRYj;SqiLYDClJNkCEK{Z-kRYFzI3BP zQ?H`>pBA!iuQ<&V->Fpt8SY{gSY(ex$CndV9!qsAGvH@``Te{5a=Y{;Scki(YA3pz zPk@_WlT_L)1+x||40w=@R|Yka^zXI>*mS^pKW+CvdyBP!i<^|Tlc$YINub}!nj)hg z7YbhkZN#QsirI&hJ#D^S_oCgAfTRWd3cB0&Z1U`UnM+dcls&44;V`u zPEU9TZ~^=wazFhcNNlm7nTWvqTcfi5mc8P8#8nZ@HJ>m+A*_cH$+s9tRA+=N(bd17 zkEACwJcW0~%c6mDd@uz&X-r8hjpDneaZ6TR!da)%TO}5pSXWFg(yF)IW{hQ34Y^w*`ZSEm|As8cF?|F;A$F^ zKP5tgWfhnS05<+zJ8e|Nh#os`b?#70arX9Z`#Osx8Rv0U`+lYHC95O~-eW!aWPvlp zH120O^G=ga-Bgao9B;03qlwlo2y3mxWY#Os``0_kqvi=CPRe#q_wFNA&s>La!II{{ ziA+@swOyrFU7^P3OLqNS^;qZluL}v_JOjO~idPq}t^R_6Yg~FbrQdfUS7a11tqbWz zea(sMi3q_748hE+LKgxZ_V@ z%EsY}M|3DA-d6;?wykVyP1|S{V;vUb&r44X*LxtdkW1{MC;uCKf77%ZAWdsEKz{__ z_P0oVm7`q;XkrQzn}VCc>DOfVXEnrw8?$^ySfZS0S^9w)avH+%3EhtKZ!LLcYaWLmTbVI^hPshLR`TL}& zW>Tu^Ln4M9!V6`?zxH#D5zJqLdbOkN<{V&v8hzbz&T#hf za)YPk+Q^?BL%KlE<@hRO(yXC4P5l(dd{y(ycQ)K!+0{F(rgy4DQUfcEn1-SKOiuZ? zk2i-*k1NFKIAVp=d7)Y*sA~?{Ptj>^GuC3b&!kcf zDiE44(abBWg^Z<0hStVTH-#tWc=Om^Lny<-XB4$QBbi?Il0q~g#k2IxCUi{30!4c^ zRBrd?W2|7{x}gy%s!rii1TU9YYh^F3han2jXEFt!+J{`=f)^SyUy5kAPOd#u9WGL} zWAPy$k61{rRIW6wntV}cw$GvO+2`Y%)EiBrDsZV>*bs`Q3Jnn&|A?j&dwG0S1rM|gK@@)o*iG9`~S)ixJ7vJr4ww{ zuhhwvRIkGe#lO@pv0(i8@gs>@8Y+-`WeOBjs?{1YC+ws2QLCqtFyut*d!OkR-c7;k zUG&}ZXKG%8ms*D!!p?mgqAW=rK?~hkifOVckbEuhF#PF%pj&)dDMQyTgZWWsGWb#N zc#-t}g*qYWHb>vlbSOFT!gNMenKT3XsI1S_((p1ILKw?1Q1-yp>A!O;pje_vjr?&L7w=cDx?*NT*^ zi>LP4+-ZlE3%;x8?bo$05M)9bMQ%wPRrMdZi%12_9iZ(+{cuJRZ9kKBho_!_>n zwkzFDXb%8b>k#RAmMW1q*KLV1lqxN>SscB)1W#qw@}+#Oc()&J&)v!Y4y2=2KOOw!@biW-jJt!0uHQ6aj} z=?K|#0i|LM7@gO@!4eM)1ZCtgB-NbGXecT%di4N!vK6^rWDxWtb5mw5{pPKt+zjn& zj7|vsjRKTA`}jPd+(18|Ro&9cl{pvZ#S+MzIC#Mkls{LD*cXp;Jy1|)?_Hn=L{DRt zA&yUn3sdforf!^i;0=Bh5%8CqsY6OjYL>-GUy0grrT3&}AVlN4Syi(K+(@$JtGBbw zPpUxO?P~B8yDVnc_2Yy8U2f|Vh1S$j%l&8OS8R0{Ol2SD3$G3#ti>$DeN++5Kd_vi z30spM}yIA6Q za-G6T81D%lb8y%9kAD9@A28YwFD4o$jHu}HGm3p4Yhgum3%=K%eC`0-GdBHNeR&y} zc}(DKn#XHXz^)fxTv%&4nOlgHc{f*re?Rt-%xQom3Js7q^HA)i%I|7a@@WR>tA(#~ zS~%${ur2FbRJ{ATwEyp-QnR=BmrEnSi<}F)L@A(%SO@dUi7m}*H=Nwyx`HHBF4P#m zM*%4ViRI>Kj_%GEv?8gxVjpve=nIuWDPF@Ds=D^oFZ}eqp|o>EwQD!9Yt^@YUFyBP z>hq`GWCy8V4-KhN!tvW$_O7o7&gFk5T>F;ls)oXYpI#RRJS3{HIZL7H4ZFJ*OY8Tw zlJBv7{{NEOFE;PQ%{G}3U;P!VT&^SgkN&=jEksf;6YV& zmbt~nG*3&*;vxaJ*|x?Q^pq%Y-bctz2B9U`l?)E0<=-%YvRQ?uSRjOy>C4^#_MTZm zb#oq?J7(50zQgM1qiV9vuK)#@FNp5a5%^3RO`#WNP&^`Rc!~FOS8%&=y79P>9k42h z&{;FwW5ak*_ttn#l&Pbn5?G6cNomNAk}0$cgde0BdL$G?Rvu-(w1sU_EEPde0cof) z^lgwtO`Vrf+!pyGhL;S`5rg$s9? zWaFpRr)Cx!&DlqQe_{O*%WBWlw*l>|R2LLeFLdg(LIgxyX(!HGQ!_Ix&+qx7g~kSo zBmpV{jp<&aR$lN3%s$N~LNPvzrTVY{Y+CO|pB#I1wbs8>QNlg5H`O)9oULaqFqYC! zX97OThlG*zPRvz~$z+2-zyGKoo2^E_eH0#0Xw%dNr^=-gW%L54ONvzX*SHPIHNGi+ zOMT;hF*Z@S6TSBC?`Taw&?!$Fsx3Zuw3D>d3kN%Y93d{-V4JRA+HZqaabFxH$8Oa{ zB(5sx0lbNlPBaP~S#p#f{J7TN$U>i(C>+JiK&pp4C!cv6h8bHwJ>NV7z$Wci5&-BG zQw8oSySd>wxo-2E8uozPvc+P88G`$i%tK|Q*7e8dP+BN3d_xYRU&qjNA%aXzxXkx{ z`X=5swTwExAq6luK+QshSdhwVX$?+O>8GN$3 zef{b1QnCw_a(2zLMk-v^;6~h*$!c^)W*&yt{3`1YcGI!0-uUaOcDYN5`iucpl{hibv;i!jB*8>O`T+=dy80qx$2n)BUvlKOs zS2XA@NJaEO4M`&go~e%<gf^jFB-!47^6k1EN5*U9&3mqT67$;HO)^yMIW|qr)V;3n zGJq`|_}kwvE#hkT@eer>DT~*_j`>D?rkXl#Iy~{EU1C&6Gj*Lz4^B$tO4axXqSz*P@^QPrv3iq&(lALZ4hN*5 z>h2nf!pm6AJC!+pDC10gE%eHn8B9#AcvFjy?V<5=uvN zy9{OMxhW%scbXe$pBjO`b&!W>k^Vaf&G7qSRrjS1)B;XvDUzMt0-yofU-gibi^PG`@YHkz>}#Q$$WmCRVoqg1~^+exfv15v9g3o83&Ij)1TLn(1 z@gQ=YZ>S)p<8EPuGIC_CM$a-nF4}&_S-jqmF|^&MC?|_&z6e>piZzreDk5O08%VZY zL%c4E0F-f+gAkzJ*@p&-IA7R_r@Bv>CL`EY0+hJW((XQS%ozCf#Xrp+<@@tM&C6E? z%G$E-yP{DdPDLTo`H7lppqN$C?At1`W$JonCNObRYnH(7Q~Pj9xz2HoDMT==hqvtC zRoJUl#&@B)^|$6%7@Wk>q;#fjb_8JjEl5%mgXFgzxjo(mPF=#EBLe&C#XKirf>hc( z9#5wO;N+YfUW8|s>L1`_GxjE9p6F*LCX+;XnBA_W%b9%pv^4f;rrApkvWTI>85E|3 z3Ptcogi}j<8FzQ_WE#-J`>|W9Rb42_dg$X?8QfeqiPJgZRS!8C;1D9c#7{tj%xP%C zlG&7YqLv-lXX32vyQCG&u7H7oO@zh~gGUn^5B-mdgf?wq_6P}eVHx-Am_INPCZ?v8 z>?r&Dy)K$|JSZi-)bEqe6^s@nLvk=x|H z%M$BqwVJE(D15Zv<{;4^N(7eS;$uiYf6?e>e0If!sz3%)=1_qaCk2A@akyfa3H&S* z3I?c1h*nhG_LtPOGIl8*8+*X;pZ5m`Z=lluF}F)6TCtV`jl?5=u05)`#r|=>5!vjM zkzsako0+|ON#n0s_cfn4$5t;aGR}r;pqM&0ml8)$UiRF~5HBKn?f3XG(zpKBm?@rV zX)gf>Uz%Q*dyU)2Z zILDzShmpKS*1Z>mN&FSZW}`Pnj7i4Zu1b&ElPow_reE6G((0~-!B#frZ*28gK5Wm` z42?@dzUXDQbGba#D}?1Y(@I;3B zxkyxXoU28`|F$ZX?2;c1ueM*F@%hj5t?*oUs>U?0Yxrj%v}!kN4J39h z{tdY{%2(dTVKL+E(~;dB!S4O~ldZJrPWKJIsurWpb@giKpCGHmxLq{$<#5BlUx^Kw zTPCj3t}HK4bI@%9zCg zkKPLHe8p7BPrXctr-CP&i)(cG+ z&zb&Yq7AOd(M@3`A$?EI+u}M|Di=NdEV_T#w0lWqI6oy)W{vmjI--lfTLx1vAveK- zvZjZg|8-x~vBMQS-+3vaK)lA%zG~xq++n3-!E)APN=F`SP1=uX-|nm=IuDf^M(V9ve*qpbsCA#1cNaJdECO$u@;m3Y%9z5<{K9*p^LEK(?c(Ev9J~)a_22rY zBRHduw}VwhR$cYZ`r4=-7%Lxn*XtX>;65my976_Ko3zrZ5@@%{g#YQ!36RZDpeWC} z(sA2&U2ZEBoDtQ@Crr4tF`MP&E;a_oKQXf{v-0V0WM*_!jcBue8oRSvTHjSyfkM4s zul73mRoE zW|h+G>0Us%@_gebhIXD8D@HZnhUhnK(sp51%lQ73SG%4+2T?IWm?V?_@GFzyn*n;d z+jZ75?mlaeOe7*r?b=#dTmOX2)m2462Fv@z-42d?@&wHLfa~>GU#+ouN{G8wbhWZm zC7Bw@+V=3s!Gb%|+CU`+XRm}AuGmcf+uV~uDyhIG>*2R{`>8HiZHirKD(|#hR6Q5( z^LpgardWPEF*@4_4q|tzps~6{gGuckR!OOn^X0h7#Pm^#dp|p;^{)&+zCy5beVqP- z_th+^vtN6zHytsm$=mfTxV}b53m?tgH8Q6EWQjfBsg!umc056{Ef`qM@Oz2J-LI}< z<;xeByc>I(#*t0@08em}u|e<$)#v{5RvIVk8C1}~xf-#iKJ8zHyhYjUq7>_+87K$# zGDDl3EXhtjvG{B2d}r>js9s_Ud5Cr$$#wfyFTgd*`Pi;7%2=B~7Q>K>J>=3N(TKi4 zi{kTc+AVHMQU~fJ|52;Y+Yi&I2JqUHzY+OWkiWLpooJT+YMq;BQ=%T&!%hAt#Ioe? z0l2N_@wI+$SLn*nIsAa+b6P6{S|^eUN*@q?O>B2&&2};wNo_1w8i2KEFD+nGrOq5) zXpS6*Ywd(?sob&R_$f-*Y?5fqjJo-ki6iETam12SOGvD_B#IJM-%O79^Ut105k6UiU2tVqas z`5MGAc#xBqx7Oab@}yz9uKVN2QiIZ5j5;W*O3-2ZO28X8$O7$N`V%q;3%f9u+cnw1 z9)yz!8p5`saUs48b;uX**rTOA5&P_N^g}UgubsCo*66SQv&|`bU8W-RtM(}R-+%6> z{#?yaiIyRb@Vg3PvfutYBoD0WdI;5;$SGqLXQ7966?_Tete!tndxntA$A?NxWLux3 zDAPnkL@AJx!N2q6VQrp11}PPCi->!AL)SG>j@_(u(_xNx>j?C#4jZzJrW=u!Ly{iv z%sgG)K-PwQpTCKR0>ZGU;{cbtXWSqtfg+?0?vTY!R%>#>XR7x5%AAr(j^LRR9}u+l zYqkUPQTVPytXWFpSzQ?5>NvaFtFoXTky>wm>oAd6BJMhIec(iH0oIQNtBa*6m@p)< z0F~*qD`IfiE!4$2yB!OS0U3~5i54fiV}ulI2DX4+Y>~fpOB3N;I&?RSG!&^Pd`$x- zf5Ir4oKz_-a+Ih8IP3k2`PY^W(bqG7KNoPs>xyj46x=6=YoO8P4^VTG=L@lNVe{ZZaWOXfn*-p-~HGX9eLB~pJdUX^&Y^}%UZx8GHQTN5xe@ZrX z2RW!fu%zx>BG7;>O_O9wnt2teK#<5M8VM{do%%#ky@-defVTU|HozP?jf;F}{PzR` z^uL{uV^mC7}13gT11_?vIR&>Oz^#B<;=3V>$Y3xSh-HPN|O#6xdiV=P3uAwieM zufOfikn8QW>b3F_&hUQ9xcjX+g7893lx;{u?F3`%QYC5?(rE`+Jlf~`)d=fc7UOV!xVzhiJ$}?Em25@FU!Z zi%YIQss2aG*Z_{RXL?m#8&9d)gRC=55z4vG)H-Z#R>SbqEk=6PQkSJv2TJL08<|Ou z4AqH`#r_!Q{jvSbyf-tPs&E$SqnAnikEXy*3t}F|Cg6xv=8sryP=9PT?d5CFQCGhi zMA7b(Pp^~Z#G0#bJp6g=qPHa|aBjT4Z81bLuMP*O|F0~XF7zg#b_$ha%N~1d6P*V) zm62?u*~pAld&8rN`+M3&knMSkE*Ed|yMlzgbpGPAg8T{avt3Pvjx{@+{ z&+QW%w{`f%60~AXtBs4zZr_RKPx9Z(LS3l&AuQd>7$s=qsQ{U;GFxvWBNGf3h6?O~ z=AVRh8VTV`{8rhUBNXDl&4A9qWfNjtnLYE_8}|t{9&I95Y+I&g`Hq!Bq-oY-16J+d zeQ+~*Od&JYOU(+ZHm%g&&Wg|+#qc3!T`7*7eAlYk`en0osnUqh=&6z8-(e)sjaudO ztUMx}s%kknnxHb4Pl3U2_m;ZW*?8;-K3u9fA(O0xqyLdgW1qF2!b4kJ4-zwitQZhV zgjQ3*fl|c{RHf>MqEd)y3vh6Fqz|NrHzXYuz@^*a}z6T*CJ;-0R zSExf)2n+LCO|{b^Qf9u2KfP^Ye(=M|$b^dgQCVDCj(L`~l0TSL-4p3+_KnqH-5yEh zn|>*6zisDCXibIrfQw$vWYFcamzPJAs9v5oIi}L3jdvp;Zq0T&c?|=tPI)zH7+Fl2 zwaS!BeZSe^Wr&7=CD*DW!2oAbmR?0b7yO_vi&yKnpSiWiE+3k{N5*47ILBDQvB%$? z3TmbPe%h^5IC@#+2`#rjagDY+*`U8fw-#DpS=h{z2lGyES@jVsFdSQaQa~J{YEN(| z4>fUSWp$si=f1aL3TQ?=7s{K<$4INK)a@^40Muiq+qSbg5-Sy3uIXs&8Iuc){Zn(T6 zbr8pAlT#@r}9W&aBD7 zTd41r7kp=DJSOUdZPf9G8>(%0K;X_7z&xY>YI_ZkPVrbEO&N?NbMec8Sw@&ATzzp; zK+fDR0nNa~kvx0nQjqm1vZ@Qf z1|>&dQs9Dq>4DddU38+TtAgAKkayMR=0pv1fXhZE9bN(y?;MX$0C!C4s9Wm9$ z%{ZA$9^1&=eD$zg6sczw96dd6q;5z%Fv*bANOtGAjN5NXwjPEXprzHQN{j3XXr3B7 zM%k=v-koDnI#QAugl$Uy5jTl-T(J2M-;H5^jb}-hUF4wnrJKE`4iHi(Ex=0xnWS-H z1<*C1ma G_J06Utrx2R diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_search.imageset/img_search@2x.png deleted file mode 100644 index a26c3663ef0775a1925de8127bd4ceabb85f87b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18828 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

=(s5s)1Fs(#%(z>m{YeQKP)t7H(|u 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/Contents.json index 57eac8a2..43e43fa3 100644 --- a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/Contents.json +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/Contents.json @@ -1,17 +1,15 @@ { "images" : [ { - "filename" : "img_server_maintenance@1x.png", + "filename" : "img_server_maintenance.svg", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "img_server_maintenance@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "img_server_maintenance@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance.svg b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance.svg new file mode 100644 index 00000000..1006e586 --- /dev/null +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance@1x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_server_maintenance.imageset/img_server_maintenance@1x.png deleted file mode 100644 index b066926156119d6332d7bfa84d1b286d68c0091a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9610 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome@2x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome@2x.png deleted file mode 100644 index 7981ffdd2f809777df92d3854d1a2c953fb9d174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15116 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 diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome@3x.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/images/img_welcome.imageset/img_welcome@3x.png deleted file mode 100644 index 9f56775b78adb2a0b463bb843aa45fde0fa5488b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23775 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 TU#@NY=6^fetLH1u`6mAl#>}zX From b81e44656f11f1ccb36df564c2c7a7af2b7bda8c Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 06:52:00 +0900 Subject: [PATCH 059/153] =?UTF-8?q?[Add]=20#40=20-=20empty=20=EB=B7=B0=20t?= =?UTF-8?q?ype=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/EmptyCollectionViewCell.swift | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift index 49679bd4..ada3cc7e 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift @@ -62,26 +62,26 @@ final class EmptyCollectionViewCell: UICollectionViewCell { emptyLabel.snp.makeConstraints { $0.top.equalTo(emptyIcon.snp.bottom).offset(20) + $0.centerX.equalToSuperview() + switch emptyType { case .initialize, .noSearch: $0.centerY.equalToSuperview().inset(-33) case .noReview, .noBookMark: $0.centerY.equalToSuperview().inset(-22) } - $0.centerX.equalToSuperview() } } private func setUI() { emptyIcon.do { $0.contentMode = .scaleAspectFit - $0.image = .noSearchResultImage } emptyLabel.do { + $0.numberOfLines = 0 $0.textAlignment = .center - $0.partFontChange(targetString: "검색결과가 없어요", font: .pretendardMedium(15)) - $0.basic(text: "다른 키워드로 검색해보세요!", font: .pretendardBold(20), color: .gbbGray300!) + $0.basic(font: .pretendardBold(20), color: .gbbGray300!) } } @@ -89,5 +89,12 @@ final class EmptyCollectionViewCell: UICollectionViewCell { emptyType = type emptyIcon.image = type.icon emptyLabel.text = type.rawValue + + switch type { + case .initialize, .noBookMark, .noReview: + return emptyLabel.basic(text: emptyType.rawValue, font: .pretendardBold(20), color: .gbbGray300!) + case .noSearch: + return emptyLabel.partFontChange(targetString: "다른 키워드로 검색해보세요!", font: .pretendardMedium(15)) + } } } From 2755d2386e7266ee0c28284f3276f5b3c5686667 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 11:14:01 +0900 Subject: [PATCH 060/153] =?UTF-8?q?[Add]=20#40=20-=20empty=EB=B7=B0=20text?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Search/ViewControllers/EmptyCollectionViewCell.swift | 4 ++++ .../Search/ViewControllers/SearchViewController.swift | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift index ada3cc7e..ae18c79d 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift @@ -97,4 +97,8 @@ final class EmptyCollectionViewCell: UICollectionViewCell { return emptyLabel.partFontChange(targetString: "다른 키워드로 검색해보세요!", font: .pretendardMedium(15)) } } + + func getEmtyText(_ text: String) { + emptyLabel.text = text + } } diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift index fee09cf1..52182ae5 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift @@ -88,7 +88,7 @@ final class SearchViewController: BaseViewController { } private func setupDataSource() { - dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in + dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, _ in let section = self.dataSource?.snapshot().sectionIdentifiers[indexPath.section] switch section { case .initial: @@ -144,8 +144,10 @@ final class SearchViewController: BaseViewController { } private func normalSection() -> NSCollectionLayoutSection { - let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1))) - let group = NSCollectionLayoutGroup.vertical(layoutSize: .init(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1)), subitem: item, count: 1) + let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1))) + let group = NSCollectionLayoutGroup.vertical(layoutSize: .init(widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1)), subitem: item, count: 1) let section = NSCollectionLayoutSection(group: group) return section } From bfdc671d219e0797826a7efe3dbe2bdbbe6ca136 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 11:42:22 +0900 Subject: [PATCH 061/153] [Feat] #39 - filter common cell added --- .../FilterPurposeViewController.swift | 4 +- .../Views/FilterCollectionViewCell.swift | 104 ++++++++++++++++-- 2 files changed, 95 insertions(+), 13 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 47db915f..f82a3065 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -18,7 +18,9 @@ final class FilterPurposeViewController: BaseViewController { // MARK: - UI Property - + private let filterTitleLabel = UILabel() + private let filterSubtitleLabel = UILabel() + private let filterCollectionView = UICollectionView() // MARK: - Life Cycle diff --git a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift index c62ee4ee..e03fe549 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift @@ -14,26 +14,106 @@ final class FilterCollectionViewCell: UICollectionViewCell { // MARK: - Property - + enum FilterType { + case purpose + case breadType + case ingredient + } + + private var cellSize: CGSize { + switch filterType { + case .purpose, .ingredient: + return .init(width: CGFloat().convertByWidthRatio(327), + height: CGFloat().convertByHeightRatio(106)) + case .breadType: + return .init(width: CGFloat().convertByWidthRatio(153), + height: CGFloat().convertByHeightRatio(161)) + } + } + + private var labelSpacing: CGFloat { + switch filterType { + case .purpose: return 9 + case .breadType: return 24 + case .ingredient: return 0 + } + } + + override var isSelected: Bool { + didSet { + toggleSelection() + } + } + + var filterType: FilterType = .purpose { + didSet { + configureLayout() + configureUI() + } + } // MARK: - UI Property - - - // MARK: - Life Cycle - - + private let typeLabel = UILabel() + private let descriptionLabel = UILabel() + private lazy var labelStackView = UIStackView(arrangedSubviews: [typeLabel, descriptionLabel]) // MARK: - Setting - - - // MARK: - Action Helper - - + private func configureLayout() { + self.snp.makeConstraints { + $0.size.equalTo(cellSize) + } + + addSubview(typeLabel) + switch filterType { + case .purpose, .ingredient: + typeLabel.snp.makeConstraints { + $0.center.equalToSuperview() + } + case .breadType: + typeLabel.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.top.equalToSuperview().inset(46) + } + } + } + + private func configureUI() { + self.do { + $0.backgroundColor = .gbbBackground2 + $0.makeBorder(width: 1, color: .gbbGray300!) + } + + typeLabel.do { + $0.font = .title2 + $0.textColor = .gbbGray300 + } + + descriptionLabel.do { + $0.font = .bodyM1 + $0.textColor = .gbbGray300 + } + + labelStackView.do { + $0.axis = .vertical + $0.spacing = labelSpacing + $0.alignment = .center + } + } // MARK: - Custom Method - + private func toggleSelection() { + self.do { + $0.makeBorder(width: isSelected ? 2 : 1, color: isSelected ? .gbbMain1! : .gbbGray300!) + } + + [typeLabel, descriptionLabel].forEach { + $0.do { + $0.textColor = isSelected ? .gbbGray300 : .gbbMain1 + } + } + } } From f03bd4aaa3729e1b2ab1103387b2ddc8f2c61bd0 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 12:31:12 +0900 Subject: [PATCH 062/153] =?UTF-8?q?[Add]=20#42=20-=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EB=A6=AC=ED=84=B0=EB=9F=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 7dbc24c1..1e1f77aa 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -17,4 +17,9 @@ struct I18N { - 건빵은 건강한 빵집의 위치와 성분 정보를 제공하여 소비자의 선택을 돕는 용도의 서비스입니다. 건빵의 모든 정보는 제조사에서 제공한 정보입니다. 이는 소비자의 구매를 돕기 위한 참고 사항이며, 제공 정보의 오류에 대한 책임을 지지 않습니다. """ } + + /// MySavedBakery + struct MySavedBakery { + static let naviTitle = "저장 목록" + } } From 69523156fd8cd028fa61b0c334b65947dc4508d3 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 12:31:33 +0900 Subject: [PATCH 063/153] =?UTF-8?q?[Feat]=20#42=20-=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EB=84=A4=EB=B9=84=EB=B7=B0=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 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 20 +++++++++ .../MySavedBakeryViewController.swift | 42 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 7aa7adf1..064731ab 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -60,6 +60,7 @@ 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3EFB2A569E4A0063897A /* URLConstant.swift */; }; 09CA3F062A569EB30063897A /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F052A569EB30063897A /* API.swift */; }; 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; + 09FD47D92A5E5148002020BD /* MySavedBakeryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47D82A5E5148002020BD /* MySavedBakeryViewController.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; @@ -122,6 +123,7 @@ 09CA3EFB2A569E4A0063897A /* URLConstant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLConstant.swift; sourceTree = ""; }; 09CA3F052A569EB30063897A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; + 09FD47D82A5E5148002020BD /* MySavedBakeryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MySavedBakeryViewController.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; @@ -314,6 +316,7 @@ 0961C36A2A501EF60031A822 /* Presentation */ = { isa = PBXGroup; children = ( + 09FD47D62A5E511F002020BD /* MySavedBakery */, 093214032A5AE3C000875EF6 /* Search */, 09B13F492A593C5900C0C723 /* Home */, 09B13F4D2A593C7600C0C723 /* BakeryList */, @@ -476,6 +479,22 @@ path = Protocol; sourceTree = ""; }; + 09FD47D62A5E511F002020BD /* MySavedBakery */ = { + isa = PBXGroup; + children = ( + 09FD47D72A5E5132002020BD /* ViewControllers */, + ); + path = MySavedBakery; + sourceTree = ""; + }; + 09FD47D72A5E5132002020BD /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 09FD47D82A5E5148002020BD /* MySavedBakeryViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; 3E79B19B2A54523400D36A26 /* Button */ = { isa = PBXGroup; children = ( @@ -704,6 +723,7 @@ 090556252A51DB9600752067 /* UICollectionView+.swift in Sources */, 09B13F582A59433500C0C723 /* TabBarItem.swift in Sources */, 09B13F502A593CB800C0C723 /* BakeryListViewController.swift in Sources */, + 09FD47D92A5E5148002020BD /* MySavedBakeryViewController.swift in Sources */, 093214022A5AE27800875EF6 /* Utils.swift in Sources */, 090556452A51E79B00752067 /* UITextField+.swift in Sources */, 09CA3F062A569EB30063897A /* API.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift new file mode 100644 index 00000000..b221596c --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -0,0 +1,42 @@ +// +// MySavedBakeryViewController.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class MySavedBakeryViewController: BaseViewController { + + // MARK: - Property + + private lazy var safeArea = self.view.safeAreaLayoutGuide + + // MARK: - UI Property + + private let naviView = CustomNavigationBar() + + // MARK: - Setting + + override func setLayout() { + view.addSubview(naviView) + + naviView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.directionalHorizontalEdges.equalTo(safeArea) + } + } + + override func setUI() { + naviView.do { + $0.addBackButtonAction(UIAction { _ in + self.navigationController?.popToViewController(self, animated: true) + }) + $0.configureLeftTitle(to: I18N.MySavedBakery.naviTitle) + } + } +} From 9470e74e143b7ca8b4cefcf8871a102c22aee76e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 13:16:57 +0900 Subject: [PATCH 064/153] =?UTF-8?q?[Add]=20#43=20-=20MyReviews=20=EB=A6=AC?= =?UTF-8?q?=ED=84=B0=EB=9F=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 7dbc24c1..f7052453 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -17,4 +17,9 @@ struct I18N { - 건빵은 건강한 빵집의 위치와 성분 정보를 제공하여 소비자의 선택을 돕는 용도의 서비스입니다. 건빵의 모든 정보는 제조사에서 제공한 정보입니다. 이는 소비자의 구매를 돕기 위한 참고 사항이며, 제공 정보의 오류에 대한 책임을 지지 않습니다. """ } + + /// MyReviews + struct MyReviews { + static let naviTitle = "내가 쓴 리뷰" + } } From e9ed0e09d3ed7485f2a6e9fdd147a6dafbaa10a3 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 13:19:20 +0900 Subject: [PATCH 065/153] =?UTF-8?q?[Feat]=20#43=20-=20=EB=82=B4=EA=B0=80?= =?UTF-8?q?=20=EC=93=B4=20=EB=A6=AC=EB=B7=B0=20=EB=84=A4=EB=B9=84=EB=B7=B0?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyReviewsViewController.swift | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift new file mode 100644 index 00000000..094a5ed5 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift @@ -0,0 +1,42 @@ +// +// MyReviewsViewController.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class MyReviewsViewController: BaseViewController { + + // MARK: - Property + + private lazy var safeArea = self.view.safeAreaLayoutGuide + + // MARK: - UI Property + + private let naviView = CustomNavigationBar() + + // MARK: - Setting + + override func setLayout() { + view.addSubview(naviView) + + naviView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.directionalHorizontalEdges.equalTo(safeArea) + } + } + + override func setUI() { + naviView.do { + $0.addBackButtonAction(UIAction { _ in + self.navigationController?.popToViewController(self, animated: true) + }) + $0.configureLeftTitle(to: I18N.MyReviews.naviTitle) + } + } +} From b419e65c7dc5e873e4a00659c52bf4b93481de94 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Wed, 12 Jul 2023 13:19:44 +0900 Subject: [PATCH 066/153] =?UTF-8?q?[Feat]=20#43=20-=20=EB=82=B4=EA=B0=80?= =?UTF-8?q?=20=EC=93=B4=20=EB=A6=AC=EB=B7=B0=20header=EB=B7=B0=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 --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 24 ++++++++ .../ViewControllers/MyReviewsHeaderView.swift | 58 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsHeaderView.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 7aa7adf1..9f22eb02 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -60,6 +60,8 @@ 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3EFB2A569E4A0063897A /* URLConstant.swift */; }; 09CA3F062A569EB30063897A /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F052A569EB30063897A /* API.swift */; }; 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; + 09FD47DD2A5E57F2002020BD /* MyReviewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */; }; + 09FD47DF2A5E58D1002020BD /* MyReviewsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47DE2A5E58D1002020BD /* MyReviewsHeaderView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; @@ -122,6 +124,8 @@ 09CA3EFB2A569E4A0063897A /* URLConstant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLConstant.swift; sourceTree = ""; }; 09CA3F052A569EB30063897A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; + 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyReviewsViewController.swift; sourceTree = ""; }; + 09FD47DE2A5E58D1002020BD /* MyReviewsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyReviewsHeaderView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; @@ -314,6 +318,7 @@ 0961C36A2A501EF60031A822 /* Presentation */ = { isa = PBXGroup; children = ( + 09FD47DA2A5E57CC002020BD /* MyReviews */, 093214032A5AE3C000875EF6 /* Search */, 09B13F492A593C5900C0C723 /* Home */, 09B13F4D2A593C7600C0C723 /* BakeryList */, @@ -476,6 +481,23 @@ path = Protocol; sourceTree = ""; }; + 09FD47DA2A5E57CC002020BD /* MyReviews */ = { + isa = PBXGroup; + children = ( + 09FD47DB2A5E57E3002020BD /* ViewControllers */, + ); + path = MyReviews; + sourceTree = ""; + }; + 09FD47DB2A5E57E3002020BD /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */, + 09FD47DE2A5E58D1002020BD /* MyReviewsHeaderView.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; 3E79B19B2A54523400D36A26 /* Button */ = { isa = PBXGroup; children = ( @@ -696,6 +718,7 @@ 0905564B2A51E81D00752067 /* UIViewController+.swift in Sources */, 0915C1752A5C533900ACB8D4 /* HomeReviewCollectionViewCell.swift in Sources */, 097682DA2A5C829D0008F4FB /* GradientImageView.swift in Sources */, + 09FD47DD2A5E57F2002020BD /* MyReviewsViewController.swift in Sources */, 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */, 0987288D2A5BA1F000A29402 /* BookmarkButton.swift in Sources */, 090556202A51DB2C00752067 /* UIImage+.swift in Sources */, @@ -715,6 +738,7 @@ 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */, 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, + 09FD47DF2A5E58D1002020BD /* MyReviewsHeaderView.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */, ); diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsHeaderView.swift b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsHeaderView.swift new file mode 100644 index 00000000..3dead43d --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsHeaderView.swift @@ -0,0 +1,58 @@ +// +// MyReviewsHeaderView.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/12. +// + +import UIKit + +import SnapKit +import Then + +final class MyReviewsHeaderView: UICollectionReusableView { + + // MARK: - UI Property + + private let dateLabel = UILabel() + private lazy var dotButton = UIButton() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubviews(dateLabel, dotButton) + + dateLabel.snp.makeConstraints { + $0.leading.top.equalToSuperview() + } + dotButton.snp.makeConstraints { + $0.size.equalTo(24) + $0.top.equalToSuperview() + $0.trailing.equalToSuperview().offset(-19) + } + } + + private func setUI() { + + dateLabel.do { + $0.basic(font: .pretendardMedium(13), color: .gbbGray400!) + } + + dotButton.do { + $0.setImage(.dotdotdotIcon, for: .normal) + } + } +} From 3c26cb04e6485ded3b1e0855cf232ded5e6708e9 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 14:24:22 +0900 Subject: [PATCH 067/153] [Feat] #39 - pop action added --- GEON-PPANG-iOS/Global/Extensions/UI/String+.swift | 8 ++++++++ .../Global/Extensions/UI/UIViewController+.swift | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 GEON-PPANG-iOS/Global/Extensions/UI/String+.swift diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/String+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/String+.swift new file mode 100644 index 00000000..de589e13 --- /dev/null +++ b/GEON-PPANG-iOS/Global/Extensions/UI/String+.swift @@ -0,0 +1,8 @@ +// +// String+.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/12. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift index 5ffacf44..c6420a0c 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/UIViewController+.swift @@ -30,4 +30,11 @@ extension UIViewController { func convertByHeightRatio(_ convert: CGFloat) -> CGFloat { return (convert / 812) * getDeviceHeight() } + + func popViewControllerAction() -> UIAction { + let action = UIAction { [weak self] _ in + self?.navigationController?.popViewController(animated: true) + } + return action + } } From 6f9ee5aeec6ead62606f426686beaf679f7b895b Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 14:25:24 +0900 Subject: [PATCH 068/153] [Feat] #39 - string literal added --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 7dbc24c1..7f872670 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -17,4 +17,11 @@ struct I18N { - 건빵은 건강한 빵집의 위치와 성분 정보를 제공하여 소비자의 선택을 돕는 용도의 서비스입니다. 건빵의 모든 정보는 제조사에서 제공한 정보입니다. 이는 소비자의 구매를 돕기 위한 참고 사항이며, 제공 정보의 오류에 대한 책임을 지지 않습니다. """ } + + /// Filter Selection + struct Filter { + struct Purpose { + static let title = "반가워요 바이블님 :)\n건빵을 찾은 이유를 알려주세요!" + } + } } From f5008f0840842f15abd7e2fa85d707823ee06587 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 14:25:52 +0900 Subject: [PATCH 069/153] [Feat] #39 - insert text into string added --- GEON-PPANG-iOS/Global/Extensions/UI/String+.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/String+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/String+.swift index de589e13..8853f144 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/String+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/String+.swift @@ -6,3 +6,14 @@ // import Foundation + +extension String { + + func insertString(_ string: String, at index: Int) -> String { + var newString = self + let stringIndex = self.index(self.startIndex, offsetBy: index) + newString.insert(contentsOf: string, at: stringIndex) + return newString + } + +} From acf45f1a162d22b9e49ea1a975dbc464e9581018 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 14:26:31 +0900 Subject: [PATCH 070/153] [Feat] #39 - FilterPurposeViewController edited --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 + .../FilterPurposeViewController.swift | 79 ++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index c5ad5296..aed72bab 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -72,6 +72,7 @@ 3EDC05CA2A5DF26700EAD950 /* FilterPurposeDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */; }; 3EDC05CC2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */; }; 3EDC05CE2A5DF8A900EAD950 /* FilterIngredientDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */; }; + 3EDC05D02A5E4FF900EAD950 /* String+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CF2A5E4FF900EAD950 /* String+.swift */; }; DF959A612A539FBE00E75774 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */; }; DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; DF959A6C2A568C4600E75774 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DF959A6B2A568C4600E75774 /* Colors.xcassets */; }; @@ -141,6 +142,7 @@ 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterPurposeDTO.swift; sourceTree = ""; }; 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBreadTypeDTO.swift; sourceTree = ""; }; 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterIngredientDTO.swift; sourceTree = ""; }; + 3EDC05CF2A5E4FF900EAD950 /* String+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+.swift"; sourceTree = ""; }; DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; DF959A6B2A568C4600E75774 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; @@ -189,6 +191,7 @@ 0905562C2A51DBE700752067 /* UILabel+.swift */, 09B13F552A59410C00C0C723 /* CALayer+.swift */, 09B13F592A5946B700C0C723 /* TabBar+.swift */, + 3EDC05CF2A5E4FF900EAD950 /* String+.swift */, ); path = UI; sourceTree = ""; @@ -770,6 +773,7 @@ DF959A6E2A568C9400E75774 /* UIColor+.swift in Sources */, 09C626562A5B3572002C8110 /* HomeBestReviewResponseDTO.swift in Sources */, 090556472A51E7D900752067 /* UITextView+.swift in Sources */, + 3EDC05D02A5E4FF900EAD950 /* String+.swift in Sources */, 0905562B2A51DBCE00752067 /* UIStackView+.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index f82a3065..b9988a06 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -15,12 +15,17 @@ final class FilterPurposeViewController: BaseViewController { // MARK: - Property private var maxSteps: Int = 0 + private var userName: String = "Id" + private var filterTitleText: String = I18N.Filter.Purpose.title + private let filterCellTexts: [String] = FilterPurposeType.allCases.map { $0.description } // MARK: - UI Property + private let navigationBar = CustomNavigationBar() private let filterTitleLabel = UILabel() - private let filterSubtitleLabel = UILabel() - private let filterCollectionView = UICollectionView() + private let flowLayout = UICollectionViewFlowLayout() + private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) + private let nextButton = CommonButton() // MARK: - Life Cycle @@ -41,6 +46,56 @@ final class FilterPurposeViewController: BaseViewController { self.maxSteps = steps } + override func setLayout() { + view.addSubview(navigationBar) + navigationBar.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + } + + view.addSubview(filterTitleLabel) + filterTitleLabel.snp.makeConstraints { + $0.top.equalTo(navigationBar.snp.bottom) + $0.leading.equalToSuperview().inset(24) + } + + view.addSubview(filterCollectionView) + filterCollectionView.snp.makeConstraints { + $0.top.equalTo(filterTitleLabel.snp.bottom).offset(40) + $0.horizontalEdges.equalToSuperview().inset(24) + } + + view.addSubview(nextButton) + nextButton.snp.makeConstraints { + $0.bottom.equalToSuperview().inset(55) + } + } + + override func setUI() { + navigationBar.do { + $0.addBackButtonAction(popViewControllerAction()) + $0.configureRightCount(maxSteps - 2, by: maxSteps) + } + + filterTitleLabel.do { + $0.text = filterTitleText.insertString(userName, at: 5) + $0.font = .title1 + $0.textColor = .gbbGray700 + } + +// flowLayout.do { +// $0. +// } + + filterCollectionView.do { + $0.register(cell: FilterCollectionViewCell.self) + } + } + + override func setDelegate() { + filterCollectionView.delegate = self + filterCollectionView.dataSource = self + } + // MARK: - Action Helper @@ -50,3 +105,23 @@ final class FilterPurposeViewController: BaseViewController { } + +// MARK: - extension + +extension FilterPurposeViewController: UICollectionViewDelegate {} + +// MARK: - extension + +extension FilterPurposeViewController: UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return filterCellTexts.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: FilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.filterType = .purpose + return cell + } + +} From 1c90da727603d6c870042dd768edeab1ae2e2d63 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 20:10:38 +0900 Subject: [PATCH 071/153] [Fix] #31 - code restored --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 25 ++++++++----------- .../WriteReviewViewController.swift | 23 +++-------------- 2 files changed, 14 insertions(+), 34 deletions(-) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index c0c41577..93ab0c31 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -67,17 +67,16 @@ 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; 3E2EEF752A5C93010093BCA9 /* BottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E2EEF742A5C93010093BCA9 /* BottomView.swift */; }; - 3E7869BA2A5BCD5F0087F75B /* RegionStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E7869B92A5BCD5F0087F75B /* RegionStackView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; + 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */; }; 3E79B1AE2A56F14A00D36A26 /* BakeryOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1AD2A56F14A00D36A26 /* BakeryOverviewView.swift */; }; - 3E79B1B02A571B4B00D36A26 /* LineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1AF2A571B4B00D36A26 /* LineView.swift */; }; 3E79B1B22A571E1F00D36A26 /* OptionsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1B12A571E1F00D36A26 /* OptionsCollectionView.swift */; }; 3E79B1B52A571E7100D36A26 /* OptionsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1B42A571E7100D36A26 /* OptionsCollectionViewCell.swift */; }; - 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; - 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */; }; + 3EFA97862A5EBCA9002E70FA /* LineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EFA97852A5EBCA9002E70FA /* LineView.swift */; }; + 3EFA97882A5EBCED002E70FA /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EFA97872A5EBCED002E70FA /* CustomNavigationBar.swift */; }; DF959A612A539FBE00E75774 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */; }; DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; DF959A6C2A568C4600E75774 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DF959A6B2A568C4600E75774 /* Colors.xcassets */; }; @@ -141,18 +140,17 @@ 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewFlowLayout.swift; sourceTree = ""; }; 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewHeader.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; - 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3E2EEF742A5C93010093BCA9 /* BottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomView.swift; sourceTree = ""; }; - 3E7869B92A5BCD5F0087F75B /* RegionStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegionStackView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; + 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewViewController.swift; sourceTree = ""; }; 3E79B1AD2A56F14A00D36A26 /* BakeryOverviewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryOverviewView.swift; sourceTree = ""; }; - 3E79B1AF2A571B4B00D36A26 /* LineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LineView.swift; sourceTree = ""; }; 3E79B1B12A571E1F00D36A26 /* OptionsCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionView.swift; sourceTree = ""; }; 3E79B1B42A571E7100D36A26 /* OptionsCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewCell.swift; sourceTree = ""; }; 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; - 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeLiteral.swift; sourceTree = ""; }; + 3EFA97852A5EBCA9002E70FA /* LineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineView.swift; sourceTree = ""; }; + 3EFA97872A5EBCED002E70FA /* CustomNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; DF959A6B2A568C4600E75774 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; @@ -550,7 +548,7 @@ 3E2EEF722A5C928F0093BCA9 /* View */ = { isa = PBXGroup; children = ( - 3E79B1AF2A571B4B00D36A26 /* LineView.swift */, + 3EFA97852A5EBCA9002E70FA /* LineView.swift */, 3E2EEF742A5C93010093BCA9 /* BottomView.swift */, ); path = View; @@ -559,7 +557,7 @@ 3E2EEF732A5C92980093BCA9 /* NavigationBar */ = { isa = PBXGroup; children = ( - 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */, + 3EFA97872A5EBCED002E70FA /* CustomNavigationBar.swift */, ); path = NavigationBar; sourceTree = ""; @@ -615,9 +613,6 @@ 097682D82A5C828E0008F4FB /* ImageView */, 3E79B19B2A54523400D36A26 /* Button */, 3E2EEF732A5C92980093BCA9 /* NavigationBar */, - 3E79B1AA2A5677AA00D36A26 /* Region */, - 3E79B1AF2A571B4B00D36A26 /* LineView.swift */, - 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */, ); path = Common; sourceTree = ""; @@ -779,6 +774,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3EFA97882A5EBCED002E70FA /* CustomNavigationBar.swift in Sources */, 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, 3E16E4FC2A57D24900B813D0 /* LikeModel.swift in Sources */, 3E79B1AE2A56F14A00D36A26 /* BakeryOverviewView.swift in Sources */, @@ -787,7 +783,6 @@ 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, - 3E79B1B02A571B4B00D36A26 /* LineView.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, 097682DC2A5C83910008F4FB /* CGFloat+.swift in Sources */, 0924632F2A5BA0F200B6F65D /* HomeBakeryCollectionViewCell.swift in Sources */, @@ -817,6 +812,7 @@ 0915C1752A5C533900ACB8D4 /* HomeReviewCollectionViewCell.swift in Sources */, 097682DA2A5C829D0008F4FB /* GradientImageView.swift in Sources */, 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */, + 3EFA97862A5EBCA9002E70FA /* LineView.swift in Sources */, 0987288D2A5BA1F000A29402 /* BookmarkButton.swift in Sources */, 090556202A51DB2C00752067 /* UIImage+.swift in Sources */, 09B71BFC2A59CF3E00076AC2 /* Protocol.swift in Sources */, @@ -834,7 +830,6 @@ 0905562B2A51DBCE00752067 /* UIStackView+.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */, - 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 3E16E4FE2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift in Sources */, 3E79B1B22A571E1F00D36A26 /* OptionsCollectionView.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 3ef3f7d5..0f169175 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -22,7 +22,7 @@ final class WriteReviewViewController: BaseViewController { private let scrollView = UIScrollView() private let contentView = UIView() private let navigationBar = CustomNavigationBar() - private let bakeryOverviewView = BakeryOverviewView(bakeryImage: nil, regions: ["tset", "efqerqf"]) + private let bakeryOverviewView = BakeryOverviewView(bakeryImage: .actions, firstRegion: "tset", secondRegion: "efqerqf") private let lineView = LineView() private let likeCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() private let optionsCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() @@ -206,12 +206,12 @@ final class WriteReviewViewController: BaseViewController { } aboutReviewLabel.do { - $0.text = I18N.aboutReview + $0.text = I18N.WriteReview.aboutReview $0.font = .captionM2 $0.textColor = .gbbGray300 $0.textAlignment = .left $0.numberOfLines = 4 - $0.setLineHeight(by: 1.37, with: I18N.aboutReview) + $0.setLineHeight(by: 1.37, with: I18N.WriteReview.aboutReview) } bottomView.do { @@ -363,21 +363,6 @@ extension WriteReviewViewController: UICollectionViewDataSource { return cell } - func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - let header: OptionsCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) - - switch collectionView { - case likeCollectionView: - header.configureTitle(to: I18N.WriteReview.likeOptionTitle) - header.isEnabled.toggle() - case optionsCollectionView: - header.configureTitle(to: I18N.WriteReview.optionTitle) - default: - return UICollectionReusableView() - } - return header - } - } // MARK: - UITextViewDelegate @@ -395,7 +380,7 @@ extension WriteReviewViewController: UITextViewDelegate { } func textViewDidBeginEditing(_ textView: UITextView) { - if textView.text == I18N.likePlaceholder || textView.text == I18N.dislikePlaceholder { + if textView.text == I18N.WriteReview.likePlaceholder || textView.text == I18N.WriteReview.dislikePlaceholder { textView.text = nil textView.textColor = .black } From 167e3e84c97b11cc9a40965c01a2f0dc29437a7b Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 20:15:46 +0900 Subject: [PATCH 072/153] [Feat] #31 - edited some files --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 4 -- .../OptionsCollectionView.swift | 1 - .../OptionsCollectionViewHeader.swift | 64 ------------------- 3 files changed, 69 deletions(-) delete mode 100644 GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 93ab0c31..cfa7517f 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -64,7 +64,6 @@ 3E16E4FA2A57D1F400B813D0 /* RecommendationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */; }; 3E16E4FC2A57D24900B813D0 /* LikeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */; }; 3E16E4FE2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */; }; - 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; 3E2EEF752A5C93010093BCA9 /* BottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E2EEF742A5C93010093BCA9 /* BottomView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; @@ -138,7 +137,6 @@ 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendationModel.swift; sourceTree = ""; }; 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikeModel.swift; sourceTree = ""; }; 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewFlowLayout.swift; sourceTree = ""; }; - 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewHeader.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; 3E2EEF742A5C93010093BCA9 /* BottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; @@ -596,7 +594,6 @@ 3E79B1B12A571E1F00D36A26 /* OptionsCollectionView.swift */, 3E79B1B42A571E7100D36A26 /* OptionsCollectionViewCell.swift */, 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */, - 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */, ); path = OptionsCollection; sourceTree = ""; @@ -837,7 +834,6 @@ 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */, - 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */, 3E16E4F52A57CF3800B813D0 /* WriteReviewDTO.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift index 34c42080..8a8715d4 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionView.swift @@ -37,7 +37,6 @@ final class OptionsCollectionView: UICollectionView { private func setUI() { self.do { $0.register(cell: OptionsCollectionViewCell.self) - $0.register(header: OptionsCollectionViewHeader.self) $0.isScrollEnabled = false $0.backgroundColor = .clear } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift deleted file mode 100644 index 25fe968d..00000000 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewHeader.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// OptionsCollectionViewHeader.swift -// GEON-PPANG-iOS -// -// Created by 이성민 on 2023/07/07. -// - -import UIKit - -import SnapKit -import Then - -final class OptionsCollectionViewHeader: UICollectionReusableView { - - // MARK: - UI Property - - private let titleLabel = UILabel() - - // MARK: - Life Cycle - - override init(frame: CGRect) { - super.init(frame: frame) - - setLayout() - setUI() - } - - @available(*, unavailable) - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - // MARK: - Setting - - private func setLayout() { - addSubview(titleLabel) - titleLabel.snp.makeConstraints { - $0.edges.equalToSuperview() - } - } - - private func setUI() { - titleLabel.do { - $0.font = .bodyB1 - $0.textColor = .gbbGray300 - $0.textAlignment = .left - } - } - - // MARK: - Custom Method - - func configureHeaderTitle(to title: String) { - titleLabel.do { - $0.text = title - } - } - - func configureHeaderColor(to color: UIColor) { - titleLabel.do { - $0.textColor = color - } - } - -} From 7a08f66eefeb87440557ba568b49fd928cf55406 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 20:24:40 +0900 Subject: [PATCH 073/153] [Feat] #31 - check text length method added --- .../WriteReview/View/ReviewDetailTextView.swift | 6 ++++++ .../ViewController/WriteReviewViewController.swift | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift index ea6e9ed4..c579c22a 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/ReviewDetailTextView.swift @@ -132,4 +132,10 @@ final class ReviewDetailTextView: UIView { } } + func checkTextCount() { + if detailTextView.text.count < 10 { + configureTextView(to: .error) + } + } + } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index a098e8ed..6eb11dbf 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -318,6 +318,7 @@ extension WriteReviewViewController: UICollectionViewDelegate { let hasSelection = collectionView.indexPathsForSelectedItems != nil reviewDetailTextView.isUserInteractionEnabled = hasSelection reviewDetailTextView.configureTextView(to: hasSelection ? .activated : .deactivated) + reviewDetailTextView.checkTextCount() default: return @@ -371,7 +372,7 @@ extension WriteReviewViewController: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { let textCount = textView.text.count - if textCount <= 10 && 0 < textCount { + if textCount < 10 && 0 < textCount { reviewDetailTextView.configureTextView(to: .error) } else { reviewDetailTextView.configureTextView(to: .activated) From 0b6e33975cc239f72bdca6699480318cbf5d379a Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Wed, 12 Jul 2023 23:59:30 +0900 Subject: [PATCH 074/153] [Feat] #39 - filterPurposeCollectionView in progress --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 2 +- GEON-PPANG-iOS/Global/Utils/Utils.swift | 5 ++ .../Common/CustomNavigationBar.swift | 2 +- .../FilterPurposeViewController.swift | 53 ++++++++++++++----- .../Views/FilterCollectionViewCell.swift | 29 ++++++++-- 5 files changed, 73 insertions(+), 18 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 7f872670..c4f288f8 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -21,7 +21,7 @@ struct I18N { /// Filter Selection struct Filter { struct Purpose { - static let title = "반가워요 바이블님 :)\n건빵을 찾은 이유를 알려주세요!" + static let title = "반가워요 님 :)\n건빵을 찾은 이유를 알려주세요!" } } } diff --git a/GEON-PPANG-iOS/Global/Utils/Utils.swift b/GEON-PPANG-iOS/Global/Utils/Utils.swift index be4265da..0dde1925 100644 --- a/GEON-PPANG-iOS/Global/Utils/Utils.swift +++ b/GEON-PPANG-iOS/Global/Utils/Utils.swift @@ -21,4 +21,9 @@ final class Utils { modalViewController.modalPresentationStyle = modalStyle viewController.present(modalViewController, animated: false) } + + class func calculateCollectionViewSize(of collectionView: UICollectionView) -> CGSize { + let size = collectionView.collectionViewLayout.collectionViewContentSize + return size + } } diff --git a/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift b/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift index ea0d5845..837235f1 100644 --- a/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift +++ b/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift @@ -94,7 +94,7 @@ final class CustomNavigationBar: UIView { rightCountLabel.do { $0.text = "\(currentCount)/\(maxCount)" $0.font = .pretendardMedium(15) - $0.textColor = .gbbGray700 + $0.textColor = .gbbGray300 } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index b9988a06..239ef5ef 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -17,14 +17,14 @@ final class FilterPurposeViewController: BaseViewController { private var maxSteps: Int = 0 private var userName: String = "Id" private var filterTitleText: String = I18N.Filter.Purpose.title - private let filterCellTexts: [String] = FilterPurposeType.allCases.map { $0.description } + private let filterTypes: [String] = FilterPurposeType.allCases.map { $0.rawValue } + private let filterDescriptions: [String] = FilterPurposeType.allCases.map { $0.description } // MARK: - UI Property private let navigationBar = CustomNavigationBar() private let filterTitleLabel = UILabel() - private let flowLayout = UICollectionViewFlowLayout() - private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) + private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: createLayout()) private let nextButton = CommonButton() // MARK: - Life Cycle @@ -58,15 +58,19 @@ final class FilterPurposeViewController: BaseViewController { $0.leading.equalToSuperview().inset(24) } + view.addSubview(nextButton) + nextButton.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(24) + $0.bottom.equalToSuperview().inset(55) + $0.height.equalTo(56) + } + view.addSubview(filterCollectionView) filterCollectionView.snp.makeConstraints { $0.top.equalTo(filterTitleLabel.snp.bottom).offset(40) $0.horizontalEdges.equalToSuperview().inset(24) - } - - view.addSubview(nextButton) - nextButton.snp.makeConstraints { - $0.bottom.equalToSuperview().inset(55) +// $0.height.equalTo(0) + $0.bottom.equalTo(nextButton.snp.top) } } @@ -82,12 +86,14 @@ final class FilterPurposeViewController: BaseViewController { $0.textColor = .gbbGray700 } -// flowLayout.do { -// $0. -// } - filterCollectionView.do { $0.register(cell: FilterCollectionViewCell.self) + $0.isScrollEnabled = false + } + + nextButton.do { + $0.getButtonTitle(.next) + $0.getButtonUI(.gbbGray200!) } } @@ -102,7 +108,26 @@ final class FilterPurposeViewController: BaseViewController { // MARK: - Custom Method + private func updateCollectionViewHeight() { + print(Utils.calculateCollectionViewSize(of: filterCollectionView)) + filterCollectionView.snp.updateConstraints { + $0.height.equalTo(Utils.calculateCollectionViewSize(of: filterCollectionView).height) + } + } +} + +// MARK: - UICollectionLayoutListConfiguration setup + +extension FilterPurposeViewController { + + private func createLayout() -> UICollectionViewLayout { + var configuration = UICollectionLayoutListConfiguration(appearance: .plain) + configuration.headerMode = .none + configuration.showsSeparators = false + let layout = UICollectionViewCompositionalLayout.list(using: configuration) + return layout + } } @@ -115,12 +140,14 @@ extension FilterPurposeViewController: UICollectionViewDelegate {} extension FilterPurposeViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return filterCellTexts.count + return FilterPurposeType.allCases.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: FilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.filterType = .purpose + cell.typeLabelText = filterTypes[indexPath.item] + cell.descriptionLabelText = filterDescriptions[indexPath.item] return cell } diff --git a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift index e03fe549..7edc137f 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift @@ -10,7 +10,7 @@ import UIKit import SnapKit import Then -final class FilterCollectionViewCell: UICollectionViewCell { +final class FilterCollectionViewCell: UICollectionViewListCell { // MARK: - Property @@ -52,13 +52,25 @@ final class FilterCollectionViewCell: UICollectionViewCell { } } + var typeLabelText: String = "" { + willSet { + configureLabelText(type: newValue) + } + } + + var descriptionLabelText: String = "" { + willSet { + configureLabelText(description: newValue) + } + } + // MARK: - UI Property private let typeLabel = UILabel() private let descriptionLabel = UILabel() private lazy var labelStackView = UIStackView(arrangedSubviews: [typeLabel, descriptionLabel]) - // MARK: - Setting + // MARK: - Custom Method private func configureLayout() { self.snp.makeConstraints { @@ -83,6 +95,7 @@ final class FilterCollectionViewCell: UICollectionViewCell { self.do { $0.backgroundColor = .gbbBackground2 $0.makeBorder(width: 1, color: .gbbGray300!) + $0.makeCornerRound(radius: 10) } typeLabel.do { @@ -102,7 +115,17 @@ final class FilterCollectionViewCell: UICollectionViewCell { } } - // MARK: - Custom Method + private func configureLabelText(type typeText: String) { + typeLabel.do { + $0.text = typeText + } + } + + private func configureLabelText(description descriptionText: String) { + descriptionLabel.do { + $0.text = descriptionText + } + } private func toggleSelection() { self.do { From 57c631383d4ed73b720f621b18a507d7098376b9 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 00:47:02 +0900 Subject: [PATCH 075/153] =?UTF-8?q?[Fix]=20#36=20-=20sectionInset=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OptionsCollection/OptionsCollectionViewFlowLayout.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift index 4f3d7aaa..b92f4deb 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift @@ -13,7 +13,7 @@ class OptionsCollectionViewFlowLayout: UICollectionViewFlowLayout { super.init() self.estimatedItemSize = UICollectionViewFlowLayout.automaticSize self.minimumLineSpacing = 12.0 - self.sectionInset = UIEdgeInsets(top: 18.0, left: 0.0, bottom: 0.0, right: 0.0) + self.sectionInset = .zero } required init?(coder: NSCoder) { From d66254824b78642f1124d1658192dc68351d44d3 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 00:47:58 +0900 Subject: [PATCH 076/153] =?UTF-8?q?[Add]=20#36=20-=20header=20edgeInsets?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewController/WriteReviewViewController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 0e7efe57..b001d961 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -198,6 +198,10 @@ extension WriteReviewViewController: UICollectionViewDataSource { return header } + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: 18, left: 0, bottom: 0, right: 0) + } + } // MARK: - UICollectionViewDelegateFlowLayout From 7f26c521b0b52fcd3905057b8eccb107d218b58e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 00:48:52 +0900 Subject: [PATCH 077/153] =?UTF-8?q?[Fix]=20=20#36=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 2 +- .../Model/BakeryListResponseDTO.swift | 13 ++++++++++--- GEON-PPANG-iOS/Presentation/Common/LineView.swift | 3 +-- .../Common/StackView/MarkStackView.swift | 6 +++--- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index bc8b00b9..c776ccc3 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -73,12 +73,12 @@ 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; + 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */; }; 3E79B1AE2A56F14A00D36A26 /* BakeryOverviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1AD2A56F14A00D36A26 /* BakeryOverviewView.swift */; }; 3E79B1B02A571B4B00D36A26 /* LineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1AF2A571B4B00D36A26 /* LineView.swift */; }; 3E79B1B22A571E1F00D36A26 /* OptionsCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1B12A571E1F00D36A26 /* OptionsCollectionView.swift */; }; 3E79B1B52A571E7100D36A26 /* OptionsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1B42A571E7100D36A26 /* OptionsCollectionViewCell.swift */; }; - 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */; }; diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index 46aface9..fad727b5 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -32,7 +32,14 @@ struct BreadType: Hashable { } extension BakeryListResponseDTO { - static let item: [BakeryListResponseDTO] = [BakeryListResponseDTO(bakeryID: 1, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: false, isVegan: true, isNonGMO: false, breadType: breadItem, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7), - BakeryListResponseDTO(bakeryID: 2, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: false, isNonGMO: true, breadType: breadItem, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7)] - static let breadItem: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: false, isNutFree: false, isSugarFree: false) + static let item: [BakeryListResponseDTO] = [BakeryListResponseDTO(bakeryID: 1, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem1, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7), + BakeryListResponseDTO(bakeryID: 2, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem2, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7), + BakeryListResponseDTO(bakeryID: 3, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem3, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7) + ] +} +extension BreadType { + static let breadItem1: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: true, isSugarFree: true) + static let breadItem2: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: false, isNutFree: false, isSugarFree: true) + static let breadItem3: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: true, isSugarFree: true) + } diff --git a/GEON-PPANG-iOS/Presentation/Common/LineView.swift b/GEON-PPANG-iOS/Presentation/Common/LineView.swift index 6edbcfd4..6c1d344f 100644 --- a/GEON-PPANG-iOS/Presentation/Common/LineView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/LineView.swift @@ -31,6 +31,5 @@ final class LineView: UIView { $0.backgroundColor = .gbbGray200 } } - - + } diff --git a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift index b7ec1dda..7fdc8018 100644 --- a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift @@ -11,7 +11,7 @@ import SnapKit import Then final class MarkStackView: UIStackView { - + // MARK: - UI Property private lazy var hccpMarkIconView = UIImageView() @@ -36,7 +36,7 @@ final class MarkStackView: UIStackView { private func setUI() { self.do { $0.addArrangedSubviews(hccpMarkIconView, veganIconView, gmoIconView) - $0.spacing = -9 + $0.spacing = -8 $0.axis = .horizontal } @@ -56,7 +56,7 @@ final class MarkStackView: UIStackView { private func setLayout() { [hccpMarkIconView, veganIconView, gmoIconView].forEach { $0.snp.makeConstraints { - $0.size.equalTo(28) + $0.size.equalTo(24) } } } From e7a8a2b382739fa1911d7183459dfff8f3067568 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 00:50:07 +0900 Subject: [PATCH 078/153] =?UTF-8?q?[Add]=20#36=20-=20=EB=B9=B5=EC=A7=91=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EC=85=80=EC=97=90=20=EC=84=B1?= =?UTF-8?q?=EB=B6=84=20=EC=BB=AC=EB=A0=89=EC=85=98=EB=B7=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListCollectionViewCell.swift | 85 +++++++++++++++++-- 1 file changed, 77 insertions(+), 8 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 7ce345d4..ea70692a 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -17,21 +17,26 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { // MARK: - Property var index = 0 + var breadTypeCount: Int = 0 var updateData: ((Bool, Int) -> Void)? + var title: String = "" + private var tips: [String] = ["", "", "", ""] + private var ingredientList: [BakeryListResponseDTO] = BakeryListResponseDTO.item private var bakeryViewType: BakeryViewType? = .defaultType { didSet { configure() } } - + // MARK: - UI Property - + private let markStackView = MarkStackView() private let bakeryImage = UIImageView() private let bakeryTitle = UILabel() private let regionStackView = RegionStackView() private lazy var bookMarkButton = BookmarkButton(configuration: .plain()) private lazy var arrowButton = UIButton() + private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: OptionsCollectionViewFlowLayout()) // MARK: - Life Cycle @@ -40,6 +45,8 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { contentView.backgroundColor = .white setLayout() setUI() + + setRegister() } required init?(coder: NSCoder) { @@ -53,37 +60,50 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { $0.backgroundColor = .darkGray $0.makeCornerRound(radius: 5) } - markStackView.do { $0.getIconImage(.smallHACCPMark, .smallVeganMark, .smallGMOMark) } - bakeryTitle.do { $0.basic(font: .pretendardBold(20), color: .gbbGray700!) } + collectionView.do { + $0.isScrollEnabled = false + $0.backgroundColor = .clear + $0.delegate = self + $0.dataSource = self + } } private func setLayout() { - contentView.addSubviews(bakeryImage, bakeryTitle, regionStackView) + contentView.addSubviews(bakeryImage, bakeryTitle, collectionView, regionStackView) bakeryImage.addSubview(markStackView) bakeryImage.snp.makeConstraints { $0.size.equalTo(90) $0.top.leading.equalToSuperview().offset(24) - $0.bottom.equalToSuperview().offset(-24) +// $0.bottom.equalToSuperview().offset(-24) } markStackView.snp.makeConstraints { $0.top.leading.equalToSuperview().offset(8) + $0.width.equalTo(55) $0.height.equalTo(22) } - + bakeryTitle.snp.makeConstraints { $0.top.equalToSuperview().offset(24) $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) } + collectionView.snp.makeConstraints { + $0.height.equalTo(25) + $0.top.equalTo(bakeryTitle.snp.bottom).offset(16) + $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) + $0.trailing.equalToSuperview().offset(-70) + } + regionStackView.snp.makeConstraints { + $0.top.equalTo(collectionView.snp.bottom).offset(16) $0.height.equalTo(29) $0.leading.equalTo(bakeryImage.snp.trailing).offset(24) $0.bottom.equalToSuperview().offset(-24) @@ -104,6 +124,23 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { regionStackView.removeSecondRegion() } regionStackView.getRegionName(data.firstNearStation, data.secondNearStation ?? "") + + if self.ingredientList[index].breadType.isGlutenFree { + self.tips[breadTypeCount] = "글루텐프리" + breadTypeCount += 1 + } + if self.ingredientList[index].breadType.isNutFree { + self.tips[breadTypeCount] = "넛프리" + breadTypeCount += 1 + } + if self.ingredientList[index].breadType.isVegan { + self.tips[breadTypeCount] = "비건빵" + breadTypeCount += 1 + } + if self.ingredientList[index].breadType.isSugarFree { + self.tips[breadTypeCount] = "저당, 무설탕" + breadTypeCount += 1 + } } func getViewType(_ type: BakeryViewType) { @@ -154,7 +191,39 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { case .reviewType: reviewViewButton() case .none: - return + return } } } + +// MARK: - CollectionView Register + +extension BakeryListCollectionViewCell { + private func setRegister() { + collectionView.register(cell: DescriptionCollectionViewCell.self) + } +} + +// MARK: - UICollectionViewDataSource + +extension BakeryListCollectionViewCell: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return breadTypeCount + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.configureTagTitle(self.tips[indexPath.item]) + return cell + } +} + +// MARK: - UICollectionViewDelegateFlowLayout + +extension BakeryListCollectionViewCell: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let tagTitle = self.tips[indexPath.item] + let itemSize = tagTitle.size(withAttributes: [NSAttributedString.Key.font: UIFont.pretendardMedium(13)]) + return CGSize(width: itemSize.width + 12, height: itemSize.height + 8) + } +} From 254d2ec2aa046147c28a15cdd7f1f86044b78290 Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Thu, 13 Jul 2023 02:11:14 +0900 Subject: [PATCH 079/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=817?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 씬델리는 건들지 맙시다 --- GEON-PPANG-iOS/Application/SceneDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Application/SceneDelegate.swift b/GEON-PPANG-iOS/Application/SceneDelegate.swift index 8bf33263..5a66dd4c 100644 --- a/GEON-PPANG-iOS/Application/SceneDelegate.swift +++ b/GEON-PPANG-iOS/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let window = UIWindow(windowScene: windowScene) window.overrideUserInterfaceStyle = UIUserInterfaceStyle.light - let rootViewController = OnboardingViewController() + let rootViewController = TabBarController() let navigationController = UINavigationController(rootViewController: rootViewController) navigationController.isNavigationBarHidden = true window.rootViewController = navigationController From 718611b9ed2a7ece927d95cff62ff26458ecfe8c Mon Sep 17 00:00:00 2001 From: ckkim817 Date: Thu, 13 Jul 2023 02:21:02 +0900 Subject: [PATCH 080/153] =?UTF-8?q?[Fix]=20#34=20-=20=EC=82=AC=EB=9D=BC?= =?UTF-8?q?=EC=A1=8C=EB=8D=98=20Launch=20Screen=20=EB=8B=A4=EC=8B=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base.lproj/LaunchScreen.storyboard | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard index ede2d031..015b1476 100644 --- a/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard +++ b/GEON-PPANG-iOS/Resource/Storyboard/Base.lproj/LaunchScreen.storyboard @@ -14,10 +14,23 @@ - + - + + + + + + + + + + + + + + From 6f16845f30e7b2b2d4de7d6b6f7f3f6d26f743a9 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 05:59:30 +0900 Subject: [PATCH 081/153] =?UTF-8?q?[Add]=20#36=20-=20=EB=B6=84=EA=B8=B0?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/Common/StackView/MarkStackView.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift index 7fdc8018..f58fb534 100644 --- a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift @@ -68,14 +68,21 @@ final class MarkStackView: UIStackView { } func getMarkStatus(_ isHACCP: Bool, _ isVegan: Bool, _ isNONGMO: Bool) { + // else 안적었더니 초기화 실패 if !isHACCP { hccpMarkIconView.isHidden = true + } else { + hccpMarkIconView.isHidden = false } if !isVegan { veganIconView.isHidden = true + } else { + veganIconView.isHidden = false } if !isNONGMO { gmoIconView.isHidden = true + } else { + gmoIconView.isHidden = false } } } From 76b6682ce414055229aa9d43a579566ae294b4c9 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 05:59:50 +0900 Subject: [PATCH 082/153] =?UTF-8?q?[Fix]=20#36=20-=20minimumLineSpacing=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 --- .../OptionsCollection/OptionsCollectionViewFlowLayout.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift index b92f4deb..15418477 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift @@ -12,7 +12,7 @@ class OptionsCollectionViewFlowLayout: UICollectionViewFlowLayout { override init() { super.init() self.estimatedItemSize = UICollectionViewFlowLayout.automaticSize - self.minimumLineSpacing = 12.0 + self.minimumLineSpacing = 10.0 self.sectionInset = .zero } From f025f536377d540ea12a7c0e4c859a43493b481f Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 06:05:50 +0900 Subject: [PATCH 083/153] =?UTF-8?q?[Add]=20#36=20-=20=EB=B9=B5=EC=A7=91=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=A6=AC=ED=84=B0=EB=9F=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index f10c45ab..fd823373 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -43,5 +43,9 @@ struct I18N { /// BakeryList struct BakeryList { static let bakeryTitle = "건빵집 리스트" + static let glutenfree = "글리텐프리" + static let nutfree = "넛프리" + static let vegan = "비건빵" + static let sugar = "저당, 무설탕" } } From b39ca2412247095a40967c69bb10391b4e04b938 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 06:09:00 +0900 Subject: [PATCH 084/153] =?UTF-8?q?[Add]=20#36=20-=20=EB=B9=B5=EC=A7=91=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=8F=99=EC=A0=81=20=EB=86=92?= =?UTF-8?q?=EC=9D=B4=20=EA=B5=AC=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListCollectionViewCell.swift | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index ea70692a..275e3948 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -19,7 +19,6 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { var index = 0 var breadTypeCount: Int = 0 var updateData: ((Bool, Int) -> Void)? - var title: String = "" private var tips: [String] = ["", "", "", ""] private var ingredientList: [BakeryListResponseDTO] = BakeryListResponseDTO.item private var bakeryViewType: BakeryViewType? = .defaultType { @@ -81,7 +80,6 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { bakeryImage.snp.makeConstraints { $0.size.equalTo(90) $0.top.leading.equalToSuperview().offset(24) -// $0.bottom.equalToSuperview().offset(-24) } markStackView.snp.makeConstraints { @@ -105,7 +103,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { regionStackView.snp.makeConstraints { $0.top.equalTo(collectionView.snp.bottom).offset(16) $0.height.equalTo(29) - $0.leading.equalTo(bakeryImage.snp.trailing).offset(24) + $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) $0.bottom.equalToSuperview().offset(-24) } } @@ -126,21 +124,28 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { regionStackView.getRegionName(data.firstNearStation, data.secondNearStation ?? "") if self.ingredientList[index].breadType.isGlutenFree { - self.tips[breadTypeCount] = "글루텐프리" + self.tips[breadTypeCount] = I18N.BakeryList.glutenfree breadTypeCount += 1 } if self.ingredientList[index].breadType.isNutFree { - self.tips[breadTypeCount] = "넛프리" + self.tips[breadTypeCount] = I18N.BakeryList.nutfree breadTypeCount += 1 } if self.ingredientList[index].breadType.isVegan { - self.tips[breadTypeCount] = "비건빵" + self.tips[breadTypeCount] = I18N.BakeryList.vegan breadTypeCount += 1 } if self.ingredientList[index].breadType.isSugarFree { - self.tips[breadTypeCount] = "저당, 무설탕" + self.tips[breadTypeCount] = I18N.BakeryList.sugar breadTypeCount += 1 } + + collectionView.snp.remakeConstraints { + $0.height.equalTo(getHeight(self.tips)) + $0.top.equalTo(bakeryTitle.snp.bottom).offset(10) + $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) + $0.trailing.equalToSuperview().offset(-70) + } } func getViewType(_ type: BakeryViewType) { @@ -166,6 +171,16 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { } } + func getHeight(_ list: [String]) -> CGFloat { + var width: CGFloat = 0 + list.forEach { + width += $0.size(withAttributes: [NSAttributedString.Key.font: UIFont.pretendardMedium(13)]).width + 4 + } + width -= 4 + + return width < (UIScreen.main.bounds.width - 206) ? 25 : 60 + } + func reviewViewButton() { addSubview(arrowButton) From ac654d87a3327eaa4c28856ac603efb97004582e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 06:09:42 +0900 Subject: [PATCH 085/153] =?UTF-8?q?[Add]=20#36=20-=20=EB=B9=B5=EC=A7=91?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=B4=88=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/ViewControllers/HomeBakeryCollectionViewCell.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift index 16e5f253..2827a036 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift @@ -25,12 +25,14 @@ final class HomeBakeryCollectionViewCell: UICollectionViewCell { private let bakeryReview = UILabel() private let regionStackView = RegionStackView() private lazy var bookMarkButton = BookmarkButton(configuration: .plain()) - + // MARK: - Life Cycle override func prepareForReuse() { super.prepareForReuse() markStackView.getMarkStatus(false, false, false) + markStackView.getIconImage(.bigHACCPMark, .bigVeganMark, .bigGMOMark) + bookMarkButton.getCount(0) } override init(frame: CGRect) { super.init(frame: .zero) From 875ce6f1bd1fd7087fe83561ea7a61391c954dbf Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 11:56:32 +0900 Subject: [PATCH 086/153] [Feat] #39 - FilterPurposeVC completed --- .../FilterPurposeViewController.swift | 41 +++++++++---------- .../Views/FilterCollectionViewCell.swift | 24 +++++------ 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 239ef5ef..4b0befd5 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -17,6 +17,7 @@ final class FilterPurposeViewController: BaseViewController { private var maxSteps: Int = 0 private var userName: String = "Id" private var filterTitleText: String = I18N.Filter.Purpose.title + private let filterTypes: [String] = FilterPurposeType.allCases.map { $0.rawValue } private let filterDescriptions: [String] = FilterPurposeType.allCases.map { $0.description } @@ -24,7 +25,8 @@ final class FilterPurposeViewController: BaseViewController { private let navigationBar = CustomNavigationBar() private let filterTitleLabel = UILabel() - private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: createLayout()) + private let filterCollectionViewFlowLayout = UICollectionViewFlowLayout() + private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: filterCollectionViewFlowLayout) private let nextButton = CommonButton() // MARK: - Life Cycle @@ -69,8 +71,7 @@ final class FilterPurposeViewController: BaseViewController { filterCollectionView.snp.makeConstraints { $0.top.equalTo(filterTitleLabel.snp.bottom).offset(40) $0.horizontalEdges.equalToSuperview().inset(24) -// $0.height.equalTo(0) - $0.bottom.equalTo(nextButton.snp.top) + $0.bottom.equalTo(nextButton.snp.top).offset(-40) } } @@ -86,8 +87,13 @@ final class FilterPurposeViewController: BaseViewController { $0.textColor = .gbbGray700 } + filterCollectionViewFlowLayout.do { + $0.scrollDirection = .vertical + } + filterCollectionView.do { $0.register(cell: FilterCollectionViewCell.self) + $0.backgroundColor = .clear $0.isScrollEnabled = false } @@ -117,30 +123,15 @@ final class FilterPurposeViewController: BaseViewController { } -// MARK: - UICollectionLayoutListConfiguration setup - -extension FilterPurposeViewController { - - private func createLayout() -> UICollectionViewLayout { - var configuration = UICollectionLayoutListConfiguration(appearance: .plain) - configuration.headerMode = .none - configuration.showsSeparators = false - let layout = UICollectionViewCompositionalLayout.list(using: configuration) - return layout - } - -} - -// MARK: - extension +// MARK: - UICollectionViewDelegate extension extension FilterPurposeViewController: UICollectionViewDelegate {} -// MARK: - extension +// MARK: - UICollectionViewDataSource extension extension FilterPurposeViewController: UICollectionViewDataSource { - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return FilterPurposeType.allCases.count + return filterTypes.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { @@ -150,5 +141,11 @@ extension FilterPurposeViewController: UICollectionViewDataSource { cell.descriptionLabelText = filterDescriptions[indexPath.item] return cell } - +} + +extension FilterPurposeViewController: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let cell: FilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + return cell.cellSize + } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift index 7edc137f..1e7d14e4 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift @@ -10,7 +10,7 @@ import UIKit import SnapKit import Then -final class FilterCollectionViewCell: UICollectionViewListCell { +final class FilterCollectionViewCell: UICollectionViewCell { // MARK: - Property @@ -20,7 +20,7 @@ final class FilterCollectionViewCell: UICollectionViewListCell { case ingredient } - private var cellSize: CGSize { + var cellSize: CGSize { switch filterType { case .purpose, .ingredient: return .init(width: CGFloat().convertByWidthRatio(327), @@ -73,18 +73,14 @@ final class FilterCollectionViewCell: UICollectionViewListCell { // MARK: - Custom Method private func configureLayout() { - self.snp.makeConstraints { - $0.size.equalTo(cellSize) - } - - addSubview(typeLabel) + contentView.addSubview(labelStackView) switch filterType { case .purpose, .ingredient: - typeLabel.snp.makeConstraints { + labelStackView.snp.makeConstraints { $0.center.equalToSuperview() } case .breadType: - typeLabel.snp.makeConstraints { + labelStackView.snp.makeConstraints { $0.centerX.equalToSuperview() $0.top.equalToSuperview().inset(46) } @@ -132,10 +128,12 @@ final class FilterCollectionViewCell: UICollectionViewListCell { $0.makeBorder(width: isSelected ? 2 : 1, color: isSelected ? .gbbMain1! : .gbbGray300!) } - [typeLabel, descriptionLabel].forEach { - $0.do { - $0.textColor = isSelected ? .gbbGray300 : .gbbMain1 - } + typeLabel.do { + $0.textColor = isSelected ? .gbbMain1 : .gbbGray300 + } + + descriptionLabel.do { + $0.textColor = isSelected ? .gbbMain1 : .gbbGray300 } } From d2287057d3b81abcd8cc7221b716ea8686966f6c Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 12:49:26 +0900 Subject: [PATCH 087/153] [Feat] #39 - FilterPurposeVC layout completed --- .../FilterPurposeViewController.swift | 1 + .../Views/FilterCollectionViewCell.swift | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 4b0befd5..3681c9b8 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -85,6 +85,7 @@ final class FilterPurposeViewController: BaseViewController { $0.text = filterTitleText.insertString(userName, at: 5) $0.font = .title1 $0.textColor = .gbbGray700 + $0.numberOfLines = 2 } filterCollectionViewFlowLayout.do { diff --git a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift index 1e7d14e4..d07ab6f9 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift @@ -124,16 +124,22 @@ final class FilterCollectionViewCell: UICollectionViewCell { } private func toggleSelection() { - self.do { - $0.makeBorder(width: isSelected ? 2 : 1, color: isSelected ? .gbbMain1! : .gbbGray300!) + UIView.animate(withDuration: 0.2) { + self.do { + $0.makeBorder(width: self.isSelected ? 2 : 1, color: self.isSelected ? .gbbMain1! : .gbbGray300!) + } } - typeLabel.do { - $0.textColor = isSelected ? .gbbMain1 : .gbbGray300 + UIView.transition(with: typeLabel, duration: 0.2, options: .transitionCrossDissolve) { + self.typeLabel.do { + $0.textColor = self.isSelected ? .gbbMain1 : .gbbGray300 + } } - descriptionLabel.do { - $0.textColor = isSelected ? .gbbMain1 : .gbbGray300 + UIView.transition(with: descriptionLabel, duration: 0.2, options: .transitionCrossDissolve) { + self.descriptionLabel.do { + $0.textColor = self.isSelected ? .gbbMain1 : .gbbGray300 + } } } From 3e643b3637f1a8990ebfc0763f31f780b25b0451 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 12:52:17 +0900 Subject: [PATCH 088/153] =?UTF-8?q?[Fix]=20#47=20-=20=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98=EB=B7=B0=20section=20inset=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OptionsCollection/OptionsCollectionViewFlowLayout.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift index 4f3d7aaa..45c45bcf 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewFlowLayout.swift @@ -13,7 +13,7 @@ class OptionsCollectionViewFlowLayout: UICollectionViewFlowLayout { super.init() self.estimatedItemSize = UICollectionViewFlowLayout.automaticSize self.minimumLineSpacing = 12.0 - self.sectionInset = UIEdgeInsets(top: 18.0, left: 0.0, bottom: 0.0, right: 0.0) + self.sectionInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0) } required init?(coder: NSCoder) { From 4d148bd2234a351102064d6709dc31acdba15d94 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 12:53:20 +0900 Subject: [PATCH 089/153] =?UTF-8?q?[Fix]=20#47=20-=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common/StackView/RegionStackView.swift | 14 +++++----- .../HomeBakeryCollectionViewCell.swift | 28 ++++++++++--------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift b/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift index 0adea678..8be1647e 100644 --- a/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift @@ -15,7 +15,7 @@ final class RegionStackView: UIStackView { // MARK: - UI Property private lazy var regionFirstTag = PaddingLabel() - private lazy var regionSeconodTag = PaddingLabel() + private lazy var regionSecondTag = PaddingLabel() // MARK: - Life Cycle @@ -33,13 +33,13 @@ final class RegionStackView: UIStackView { private func setUI() { self.do { - $0.addArrangedSubviews(regionFirstTag, regionSeconodTag) + $0.addArrangedSubviews(regionFirstTag, regionSecondTag) $0.axis = .horizontal $0.spacing = 5 $0.distribution = .fillProportionally } - [regionFirstTag, regionSeconodTag] .forEach { + [regionFirstTag, regionSecondTag].forEach { $0.makeCornerRound(radius: 14.5) $0.font = .pretendardMedium(13) $0.backgroundColor = .gbbMain3 @@ -49,17 +49,17 @@ final class RegionStackView: UIStackView { func getRegionName(_ first: String, _ second: String) { regionFirstTag.text = first - regionSeconodTag.text = second + regionSecondTag.text = second } func getBackgroundColor(_ color: UIColor) { - [regionFirstTag, regionSeconodTag] .forEach { + [regionFirstTag, regionSecondTag] .forEach { $0.backgroundColor = color } } func removeSecondRegion() { - self.removeArrangedSubview(regionSeconodTag) - regionSeconodTag.removeFromSuperview() + self.removeArrangedSubview(regionSecondTag) + regionSecondTag.removeFromSuperview() } } diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift index 2837e565..9425d4a1 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBakeryCollectionViewCell.swift @@ -62,11 +62,18 @@ final class HomeBakeryCollectionViewCell: UICollectionViewCell { $0.backgroundColor = .gbbPoint1 } + bakeryTitle.do { + $0.basic(font: .bodyB2!, color: .gbbGray700!) + } + + bakeryReview.do { + $0.basic(font: .pretendardBold(13), color: .gbbGray700!) + } + [bakeryTitle, bakeryReview].forEach { $0.do { $0.numberOfLines = 1 $0.textAlignment = .left - $0.basic(font: .pretendardBold(14), color: .gbbGray700!) } } } @@ -74,11 +81,7 @@ final class HomeBakeryCollectionViewCell: UICollectionViewCell { private func setLayout() { contentView.addSubviews(bakeryImage, bookMarkButton, bakeryTitle, bakeryReview, regionStackView) bakeryImage.addSubview(markStackView) - - let availableHeight = contentView.bounds.height - let buttonHeight: CGFloat = 60 - let buttonTopOffset = (availableHeight - buttonHeight) / 2 - + bakeryImage.snp.makeConstraints { $0.top.directionalHorizontalEdges.equalToSuperview() $0.height.equalTo(118) @@ -91,26 +94,25 @@ final class HomeBakeryCollectionViewCell: UICollectionViewCell { bookMarkButton.snp.makeConstraints { $0.trailing.equalToSuperview().inset(16) - $0.top.equalTo(bakeryReview.snp.bottom).offset(buttonTopOffset) + $0.top.equalTo(bakeryImage.snp.bottom).offset(29) $0.size.equalTo(CGSize(width: 34, height: 60)) } bakeryTitle.snp.makeConstraints { - $0.top.equalTo(bakeryImage.snp.bottom).offset(18) - $0.leading.equalToSuperview().offset(13) + $0.top.equalTo(bakeryImage.snp.bottom).offset(15) + $0.leading.equalToSuperview().offset(16) $0.trailing.equalTo(bookMarkButton.snp.leading).offset(-14) } bakeryReview.snp.makeConstraints { - $0.top.equalTo(bakeryTitle.snp.bottom).offset(10) + $0.top.equalTo(bakeryTitle.snp.bottom).offset(6) $0.leading.equalTo(bakeryTitle.snp.leading) - $0.trailing.equalTo(bookMarkButton.snp.leading).offset(-20) } regionStackView.snp.makeConstraints { - $0.top.equalTo(bakeryReview.snp.bottom).offset(10) + $0.top.equalTo(bakeryReview.snp.bottom).offset(14) $0.leading.equalTo(bakeryTitle.snp.leading) - $0.bottom.equalToSuperview().offset(-19) + $0.bottom.equalToSuperview().inset(16) } } From 00599c0961af30e2d2db8700cd04dfa8bf7cbf0a Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 12:53:51 +0900 Subject: [PATCH 090/153] =?UTF-8?q?[Add]=20#47=20-=20=ED=99=88=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HomeReviewCollectionViewCell.swift | 95 ++++++++++++++++--- 1 file changed, 82 insertions(+), 13 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift index c5f8a6bd..e313fb35 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift @@ -16,6 +16,9 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { var updateData: ((Bool, Int) -> Void)? var index = 0 + private var keywords = ["", ""] + private var keywordsCount: Int = 0 + private var reviewList: [HomeBestReviewResponseDTO] = HomeBestReviewResponseDTO.item // MARK: - UI Property @@ -24,6 +27,7 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { private let bakeryTitle = UILabel() private let bakeryReview = UILabel() private lazy var bookMarkButton = BookmarkButton(configuration: .plain()) + private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: OptionsCollectionViewFlowLayout()) // MARK: - Life Cycle @@ -32,6 +36,8 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { setLayout() setUI() + + setRegister() } required init?(coder: NSCoder) { @@ -58,24 +64,40 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { } reviewTitle.do { - $0.basic(font: .pretendardBold(14), color: .white) + $0.basic(font: .bodyB2!, color: .white) $0.numberOfLines = 2 } + collectionView.do { + $0.isScrollEnabled = false + $0.backgroundColor = .clear + $0.delegate = self + $0.dataSource = self + } + + bakeryTitle.do { + $0.basic(font: .bodyB2!, color: .gbbGray700!) + } + + bakeryReview.do { + $0.basic(font: .pretendardBold(13), color: .gbbGray700!) + } + [bakeryTitle, bakeryReview].forEach { - $0.numberOfLines = 1 - $0.textAlignment = .left - $0.basic(font: .pretendardBold(14), color: .gbbGray700!) + $0.do { + $0.numberOfLines = 1 + $0.textAlignment = .left + } } } private func setLayout() { - contentView.addSubviews(bakeryImage, bookMarkButton, bakeryReview, bakeryTitle) + contentView.addSubviews(bakeryImage, bookMarkButton, collectionView, bakeryTitle, bakeryReview) bakeryImage.addSubview(reviewTitle) bakeryImage.snp.makeConstraints { $0.top.directionalHorizontalEdges.equalToSuperview() - $0.height.equalTo(CGFloat().convertByHeightRatio(170)) + $0.height.equalTo(130) } bookMarkButton.snp.makeConstraints { @@ -85,17 +107,24 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { } reviewTitle.snp.makeConstraints { + $0.bottom.equalTo(bakeryImage.snp.bottom).inset(13) $0.directionalHorizontalEdges.equalToSuperview().inset(15) - $0.bottom.equalToSuperview().offset(-13) } - bakeryReview.snp.makeConstraints { - $0.bottom.equalToSuperview().offset(-18) - $0.leading.equalToSuperview().offset(15) + + collectionView.snp.makeConstraints { + $0.top.equalTo(bakeryImage.snp.bottom).offset(16) + $0.directionalHorizontalEdges.equalToSuperview().inset(16) + $0.height.equalTo(25) } bakeryTitle.snp.makeConstraints { - $0.bottom.equalTo(bakeryReview.snp.top).offset(-4) - $0.leading.equalToSuperview().offset(15) + $0.top.equalTo(collectionView.snp.bottom).offset(6) + $0.leading.equalToSuperview().offset(16) + } + + bakeryReview.snp.makeConstraints { + $0.top.equalTo(bakeryTitle.snp.bottom).offset(6) + $0.bottom.leading.equalToSuperview().inset(16) } } @@ -110,7 +139,47 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { guard let self = self else { return } self.updateData?(status, self.index) } - bookMarkButton.isSelected = data.isBooked ? true: false + bookMarkButton.isSelected = data.isBooked + + if !self.reviewList[index].firstMaxRecommendKeyword.isEmpty { + self.keywords[keywordsCount] = data.firstMaxRecommendKeyword + keywordsCount += 1 + } + if !self.reviewList[index].secondMaxRecommendKeyword.isEmpty { + self.keywords[keywordsCount] = data.secondMaxRecommendKeyword + keywordsCount += 1 + } + } +} + +// MARK: - CollectionView Register + +extension HomeReviewCollectionViewCell { + private func setRegister() { + collectionView.register(cell: DescriptionCollectionViewCell.self) + } +} + +// MARK: - UICollectionViewDataSource + +extension HomeReviewCollectionViewCell: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return keywordsCount + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.configureTagTitle(self.keywords[indexPath.item]) + return cell + } +} + +// MARK: - UICollectionViewDelegateFlowLayout +extension HomeReviewCollectionViewCell: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let keywordsTitle = self.keywords[indexPath.item] + let itemSize = keywordsTitle.size(withAttributes: [NSAttributedString.Key.font: UIFont.pretendardMedium(13)]) + return CGSize(width: itemSize.width + 12, height: itemSize.height + 8) } } From 2fedee4f284705eff63a1ca9cdb291ada1219bca Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 13:20:42 +0900 Subject: [PATCH 091/153] [Feat] #39 - FilterPurposeVC completed --- .../FilterPurposeViewController.swift | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 3681c9b8..faf0a270 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -16,8 +16,9 @@ final class FilterPurposeViewController: BaseViewController { private var maxSteps: Int = 0 private var userName: String = "Id" - private var filterTitleText: String = I18N.Filter.Purpose.title + private var selectedFilter: String! + private var filterTitleText: String = I18N.Filter.Purpose.title private let filterTypes: [String] = FilterPurposeType.allCases.map { $0.rawValue } private let filterDescriptions: [String] = FilterPurposeType.allCases.map { $0.description } @@ -42,6 +43,12 @@ final class FilterPurposeViewController: BaseViewController { fatalError("init(coder:) has not been implemented") } + override func viewDidLoad() { + super.viewDidLoad() + + setNextButtonAction() + } + // MARK: - Setting private func setMaxSteps(to steps: Int) { @@ -101,6 +108,7 @@ final class FilterPurposeViewController: BaseViewController { nextButton.do { $0.getButtonTitle(.next) $0.getButtonUI(.gbbGray200!) + $0.isUserInteractionEnabled = false } } @@ -109,9 +117,13 @@ final class FilterPurposeViewController: BaseViewController { filterCollectionView.dataSource = self } - // MARK: - Action Helper - - + private func setNextButtonAction() { + let action = UIAction { [weak self] _ in + // TODO: to next filter selection + print(self?.selectedFilter) + } + nextButton.addAction(action, for: .touchUpInside) + } // MARK: - Custom Method @@ -126,7 +138,19 @@ final class FilterPurposeViewController: BaseViewController { // MARK: - UICollectionViewDelegate extension -extension FilterPurposeViewController: UICollectionViewDelegate {} +extension FilterPurposeViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + selectedFilter = filterTypes[indexPath.item] + UIView.animate(withDuration: 0.2) { + self.nextButton.do { + $0.getButtonUI(.gbbMain2!) + $0.isUserInteractionEnabled = true + } + } + } + +} // MARK: - UICollectionViewDataSource extension From 91149359907653cf2f0892aabfa008f88f9a9ab5 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 15:51:21 +0900 Subject: [PATCH 092/153] [Feat] #39 - FilterBreadTypeVC inprogress --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 20 +-- GEON-PPANG-iOS/Global/Enum/FilterEnum.swift | 70 ++++++++ GEON-PPANG-iOS/Global/Literals/Strings.swift | 8 +- .../Filter/Model/FilterBreadTypeDTO.swift | 29 --- .../Presentation/Filter/Model/FilterDTO.swift | 27 +++ .../Filter/Model/FilterIngredientDTO.swift | 19 -- .../Filter/Model/FilterPurposeDTO.swift | 26 --- .../FilterBreadTypeViewController.swift | 166 +++++++++++++++++- .../FilterPurposeViewController.swift | 15 +- .../Views/FilterCollectionViewCell.swift | 27 +-- 10 files changed, 276 insertions(+), 131 deletions(-) create mode 100644 GEON-PPANG-iOS/Global/Enum/FilterEnum.swift delete mode 100644 GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift create mode 100644 GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift delete mode 100644 GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift delete mode 100644 GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index aed72bab..7677197c 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -65,13 +65,12 @@ 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */; }; + 3ED40DF92A5FCF3800C7D5DA /* FilterEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DF82A5FCF3800C7D5DA /* FilterEnum.swift */; }; + 3ED40DFB2A5FD26200C7D5DA /* FilterDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DFA2A5FD26200C7D5DA /* FilterDTO.swift */; }; 3EDC05BE2A5DED4400EAD950 /* FilterPurposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */; }; 3EDC05C02A5DED9200EAD950 /* FilterBreadTypeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */; }; 3EDC05C22A5DED9D00EAD950 /* FilterIngredientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */; }; 3EDC05C42A5DEE3600EAD950 /* FilterCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C32A5DEE3600EAD950 /* FilterCollectionViewCell.swift */; }; - 3EDC05CA2A5DF26700EAD950 /* FilterPurposeDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */; }; - 3EDC05CC2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */; }; - 3EDC05CE2A5DF8A900EAD950 /* FilterIngredientDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */; }; 3EDC05D02A5E4FF900EAD950 /* String+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05CF2A5E4FF900EAD950 /* String+.swift */; }; DF959A612A539FBE00E75774 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */; }; DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; @@ -135,13 +134,12 @@ 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeLiteral.swift; sourceTree = ""; }; + 3ED40DF82A5FCF3800C7D5DA /* FilterEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterEnum.swift; sourceTree = ""; }; + 3ED40DFA2A5FD26200C7D5DA /* FilterDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterDTO.swift; sourceTree = ""; }; 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterPurposeViewController.swift; sourceTree = ""; }; 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBreadTypeViewController.swift; sourceTree = ""; }; 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterIngredientViewController.swift; sourceTree = ""; }; 3EDC05C32A5DEE3600EAD950 /* FilterCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterCollectionViewCell.swift; sourceTree = ""; }; - 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterPurposeDTO.swift; sourceTree = ""; }; - 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBreadTypeDTO.swift; sourceTree = ""; }; - 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterIngredientDTO.swift; sourceTree = ""; }; 3EDC05CF2A5E4FF900EAD950 /* String+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+.swift"; sourceTree = ""; }; DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; @@ -566,9 +564,7 @@ 3EDC05C82A5DF25900EAD950 /* Model */ = { isa = PBXGroup; children = ( - 3EDC05C92A5DF26700EAD950 /* FilterPurposeDTO.swift */, - 3EDC05CB2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift */, - 3EDC05CD2A5DF8A900EAD950 /* FilterIngredientDTO.swift */, + 3ED40DFA2A5FD26200C7D5DA /* FilterDTO.swift */, ); path = Model; sourceTree = ""; @@ -578,6 +574,7 @@ children = ( 09C6264D2A5B29F8002C8110 /* SearchEnum.swift */, 09B13F572A59433500C0C723 /* TabBarItem.swift */, + 3ED40DF82A5FCF3800C7D5DA /* FilterEnum.swift */, ); path = Enum; sourceTree = ""; @@ -723,11 +720,13 @@ buildActionMask = 2147483647; files = ( 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, + 3ED40DFB2A5FD26200C7D5DA /* FilterDTO.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, 3EDC05C02A5DED9200EAD950 /* FilterBreadTypeViewController.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, 097682DC2A5C83910008F4FB /* CGFloat+.swift in Sources */, + 3ED40DF92A5FCF3800C7D5DA /* FilterEnum.swift in Sources */, 0924632F2A5BA0F200B6F65D /* HomeBakeryCollectionViewCell.swift in Sources */, 09B13F5A2A5946B700C0C723 /* TabBar+.swift in Sources */, 09B71C002A59D50900076AC2 /* HomeTopView.swift in Sources */, @@ -738,7 +737,6 @@ 093214082A5AE40900875EF6 /* SearchViewController.swift in Sources */, 09B13F542A593CD300C0C723 /* MyPageViewController.swift in Sources */, 3EDC05C42A5DEE3600EAD950 /* FilterCollectionViewCell.swift in Sources */, - 3EDC05CE2A5DF8A900EAD950 /* FilterIngredientDTO.swift in Sources */, 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */, 09CA3EF82A5676AA0063897A /* CommonButton.swift in Sources */, 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */, @@ -747,10 +745,8 @@ 090556222A51DB3300752067 /* UIFont+.swift in Sources */, 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */, 3EDC05BE2A5DED4400EAD950 /* FilterPurposeViewController.swift in Sources */, - 3EDC05CA2A5DF26700EAD950 /* FilterPurposeDTO.swift in Sources */, 3EDC05C22A5DED9D00EAD950 /* FilterIngredientViewController.swift in Sources */, 09C6264E2A5B29F8002C8110 /* SearchEnum.swift in Sources */, - 3EDC05CC2A5DF3A400EAD950 /* FilterBreadTypeDTO.swift in Sources */, 0915C16A2A5BFC5900ACB8D4 /* HomeBottomCollectionViewCell.swift in Sources */, 09CA3F082A569EBA0063897A /* Service.swift in Sources */, 09B13F4C2A593C6F00C0C723 /* HomeViewController.swift in Sources */, diff --git a/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift b/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift new file mode 100644 index 00000000..1ca981c4 --- /dev/null +++ b/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift @@ -0,0 +1,70 @@ +// +// FilterEnum.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/13. +// + +import Foundation + +enum FilterType { + case purpose + case breadType + case ingredient + + var cellSize: CGSize { + switch self { + case .purpose, .ingredient: + return .init(width: CGFloat().convertByWidthRatio(327), + height: CGFloat().convertByHeightRatio(106)) + case .breadType: + return .init(width: CGFloat().convertByWidthRatio(153), + height: CGFloat().convertByHeightRatio(161)) + } + } + + var labelSpacing: CGFloat { + switch self { + case .purpose: return 9 + case .breadType: return 24 + case .ingredient: return 0 + } + } +} + +enum FilterPurposeType: String, CaseIterable { + case health = "건강 · 체질" + case taste = "맛 · 다이어트" + case vegan = "비건 · 채식지향" + + var description: String { + switch self { + case .health: return "아토피 , 알레르기 , 암 , 당뇨 , 소화문제" + case .taste: return "그냥 맛있어서! 식이 관리를 위해" + case .vegan: return "종교 , 환경 , 동물 , 노동권을 위한 비거니즘" + } + } +} + +enum FilterBreadType: String, CaseIterable { + case isGlutenFree = "글루텐프리" + case isVegan = "비건빵" + case isNutFree = "넛프리" + case isSugarless = "저당, 무설탕" + + var description: String { + switch self { + case .isGlutenFree: return "NO 글루텐 포함\n밀 , 곡물류" + case .isVegan: return "NO 동물성재료\n(유제품, 계란)" + case .isNutFree: return "NO 견과류" + case .isSugarless: return "대체당 사용" + } + } +} + +enum FilterIngredientType: String, CaseIterable { + case isNutrientOpen = "영양성분 공개" + case isIngredientOpen = "원재료 공개" + case isNotOpen = "비공개" +} + diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index c4f288f8..c614c089 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -20,8 +20,10 @@ struct I18N { /// Filter Selection struct Filter { - struct Purpose { - static let title = "반가워요 님 :)\n건빵을 찾은 이유를 알려주세요!" - } + static let purposeTitle = "반가워요 님 :)\n건빵을 찾은 이유를 알려주세요!" + static let breadTypeTitle = "어떤 빵을 원하시나요?" + static let breadTypeSubtitle = "중복선택이 가능해요!" + static let ingredientTitle = "어떤 성분을 원하시나요?" + static let ingredientSubtitle = "중복선택이 가능해요!" } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift deleted file mode 100644 index 4d60a79b..00000000 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterBreadTypeDTO.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// FilterBreadTypeDTO.swift -// GEON-PPANG-iOS -// -// Created by 이성민 on 2023/07/12. -// - -import Foundation - -enum FilterBreadType: String, CaseIterable { - case isGlutenFree = "글루텐프리" - case isVegan = "비건빵" - case isNutFree = "넛프리" - case isSugarless = "저당, 무설탕" - - var description: String { - switch self { - case .isGlutenFree: return "NO 글루텐 포함\n밀 , 곡물류" - case .isVegan: return "NO 동물성재료\n(유제품, 계란)" - case .isNutFree: return "NO 견과류" - case .isSugarless: return "대체당 사용" - } - } -} - -struct FilterBreadTypeDTO { - let type: FilterBreadType - let isSelected: Bool -} diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift new file mode 100644 index 00000000..525f80a0 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift @@ -0,0 +1,27 @@ +// +// FilterDTO.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/13. +// + +import Foundation + +struct FilterRequestDTO { + let mainPurpose: String + let breadType: BreadType + let nutrientType: NutrientType +} + +struct BreadType { + var isGlutenFree: Bool + var isVegan: Bool + var isNutFree: Bool + var isSugarFree: Bool +} + +struct NutrientType { + var isNutrientOpen: Bool + var isIngredientOpen: Bool + var isNotOpen: Bool +} diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift deleted file mode 100644 index 4880c71a..00000000 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterIngredientDTO.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// FilterIngredientDTO.swift -// GEON-PPANG-iOS -// -// Created by 이성민 on 2023/07/12. -// - -import Foundation - -enum FilterIngredientType: String, CaseIterable { - case isNutrientOpen = "영양성분 공개" - case isIngredientOpen = "원재료 공개" - case isNotOpen = "비공개" -} - -struct FilterIngredientDTO { - let type: FilterIngredientType - let isSeleted: Bool -} diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift deleted file mode 100644 index 1a7dacd2..00000000 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterPurposeDTO.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// FilterPurposeModel.swift -// GEON-PPANG-iOS -// -// Created by 이성민 on 2023/07/12. -// - -import Foundation - -enum FilterPurposeType: String, CaseIterable { - case health = "건강 · 체질" - case taste = "맛 · 다이어트" - case vegan = "비건 · 채식지향" - - var description: String { - switch self { - case .health: return "아토피 , 알레르기 , 암 , 당뇨 , 소화문제" - case .taste: return "그냥 맛있어서! 식이 관리를 위해" - case .vegan: return "종교 , 환경 , 동물 , 노동권을 위한 비거니즘" - } - } -} - -struct FilterPurposeDTO { - let type: FilterPurposeType -} diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index 9f8ef6bf..81091bf8 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -14,26 +14,184 @@ final class FilterBreadTypeViewController: BaseViewController { // MARK: - Property + private var maxSteps: Int = 0 + private var filterType: FilterType = .breadType + private var filterTitleText: String = I18N.Filter.breadTypeTitle + private let filterTypes: [String] = FilterBreadType.allCases.map { $0.rawValue } + private let filterDescriptions: [String] = FilterBreadType.allCases.map { $0.description } - // MARK: - UI Property + private var filterData: BreadType = .init(isGlutenFree: false, isVegan: false, isNutFree: false, isSugarFree: false) + // MARK: - UI Property + private let navigationBar = CustomNavigationBar() + private let filterTitleLabel = UILabel() + private let filterSubtitleLabel = UILabel() + private let filterCollectionViewFlowLayout = UICollectionViewFlowLayout() + private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: filterCollectionViewFlowLayout) + private let nextButton = CommonButton() // MARK: - Life Cycle + init(maxSteps: Int) { + super.init(nibName: nil, bundle: nil) + + setMaxSteps(to: maxSteps) + } + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } - // MARK: - Setting + override func viewDidLoad() { + super.viewDidLoad() + + setNextButtonAction() + } + // MARK: - Setting + private func setMaxSteps(to steps: Int) { + self.maxSteps = steps + } + + override func setLayout() { + view.addSubview(navigationBar) + navigationBar.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + } + + view.addSubview(filterTitleLabel) + filterTitleLabel.snp.makeConstraints { + $0.top.equalTo(navigationBar.snp.bottom) + $0.leading.equalToSuperview().inset(24) + } + + view.addSubview(filterSubtitleLabel) + filterSubtitleLabel.snp.makeConstraints { + $0.top.equalTo(filterTitleLabel.snp.bottom).offset(12) + $0.leading.equalToSuperview().inset(24) + } + + view.addSubview(nextButton) + nextButton.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(24) + $0.bottom.equalToSuperview().inset(55) + $0.height.equalTo(56) + } + + view.addSubview(filterCollectionView) + filterCollectionView.snp.makeConstraints { + $0.top.equalTo(filterSubtitleLabel.snp.bottom).offset(40) + $0.horizontalEdges.equalToSuperview().inset(24) + $0.bottom.equalTo(nextButton.snp.top).offset(-40) + } + } + + override func setUI() { + navigationBar.do { + $0.addBackButtonAction(popViewControllerAction()) + $0.configureRightCount(maxSteps - 2, by: maxSteps) + } + + filterTitleLabel.do { + $0.text = I18N.Filter.breadTypeTitle + $0.font = .title1 + $0.textColor = .gbbGray700 + $0.numberOfLines = 1 + } + + filterSubtitleLabel.do { + $0.text = I18N.Filter.breadTypeSubtitle + $0.font = .subHead + $0.textColor = .gbbGray400 + } + + filterCollectionViewFlowLayout.do { + $0.scrollDirection = .vertical + } + + filterCollectionView.do { + $0.register(cell: FilterCollectionViewCell.self) + $0.backgroundColor = .clear + $0.isScrollEnabled = false + $0.allowsMultipleSelection = true + } + + nextButton.do { + $0.getButtonTitle(.next) + $0.getButtonUI(.gbbGray200!) + $0.isUserInteractionEnabled = false + } + } + + override func setDelegate() { + filterCollectionView.delegate = self + filterCollectionView.dataSource = self + } + + private func setNextButtonAction() { + let action = UIAction { [weak self] _ in + // TODO: to next filter selection +// print(self?.selectedFilter) + } + nextButton.addAction(action, for: .touchUpInside) + } - // MARK: - Action Helper +} + +// MARK: - UICollectionViewDelegate extension + +extension FilterBreadTypeViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + switch indexPath.item { + case 0: filterData.isGlutenFree = true + case 1: filterData.isVegan = true + case 2: filterData.isNutFree = true + case 3: filterData.isSugarFree = true + default: return + } + dump(filterData) + } + + func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { + switch indexPath.item { + case 0: filterData.isGlutenFree = false + case 1: filterData.isVegan = false + case 2: filterData.isNutFree = false + case 3: filterData.isSugarFree = false + default: return + } + dump(filterData) + } +} + +// MARK: - UICollectionViewDataSource extension + +extension FilterBreadTypeViewController: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return filterTypes.count + } - // MARK: - Custom Method + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: FilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.filterType = .breadType + cell.typeLabelText = filterTypes[indexPath.item] + cell.descriptionLabelText = filterDescriptions[indexPath.item] + return cell + } +} + +extension FilterBreadTypeViewController: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return filterType.cellSize + } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index faf0a270..d005c56c 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -18,7 +18,8 @@ final class FilterPurposeViewController: BaseViewController { private var userName: String = "Id" private var selectedFilter: String! - private var filterTitleText: String = I18N.Filter.Purpose.title + private var filterType: FilterType = .purpose + private var filterTitleText: String = I18N.Filter.purposeTitle private let filterTypes: [String] = FilterPurposeType.allCases.map { $0.rawValue } private let filterDescriptions: [String] = FilterPurposeType.allCases.map { $0.description } @@ -125,15 +126,6 @@ final class FilterPurposeViewController: BaseViewController { nextButton.addAction(action, for: .touchUpInside) } - // MARK: - Custom Method - - private func updateCollectionViewHeight() { - print(Utils.calculateCollectionViewSize(of: filterCollectionView)) - filterCollectionView.snp.updateConstraints { - $0.height.equalTo(Utils.calculateCollectionViewSize(of: filterCollectionView).height) - } - } - } // MARK: - UICollectionViewDelegate extension @@ -170,7 +162,6 @@ extension FilterPurposeViewController: UICollectionViewDataSource { extension FilterPurposeViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - let cell: FilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) - return cell.cellSize + return filterType.cellSize } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift index d07ab6f9..806f75e4 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift @@ -14,31 +14,6 @@ final class FilterCollectionViewCell: UICollectionViewCell { // MARK: - Property - enum FilterType { - case purpose - case breadType - case ingredient - } - - var cellSize: CGSize { - switch filterType { - case .purpose, .ingredient: - return .init(width: CGFloat().convertByWidthRatio(327), - height: CGFloat().convertByHeightRatio(106)) - case .breadType: - return .init(width: CGFloat().convertByWidthRatio(153), - height: CGFloat().convertByHeightRatio(161)) - } - } - - private var labelSpacing: CGFloat { - switch filterType { - case .purpose: return 9 - case .breadType: return 24 - case .ingredient: return 0 - } - } - override var isSelected: Bool { didSet { toggleSelection() @@ -106,7 +81,7 @@ final class FilterCollectionViewCell: UICollectionViewCell { labelStackView.do { $0.axis = .vertical - $0.spacing = labelSpacing + $0.spacing = filterType.labelSpacing $0.alignment = .center } } From 8333f77d45c90684ef94c95b3e8c52983b74877c Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 17:15:53 +0900 Subject: [PATCH 093/153] [Feat] #39 - FilterBreadTypeVC completed --- .../Presentation/Filter/Model/FilterDTO.swift | 8 +++++++ .../FilterBreadTypeViewController.swift | 22 ++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift index 525f80a0..857d9cef 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift @@ -18,6 +18,14 @@ struct BreadType { var isVegan: Bool var isNutFree: Bool var isSugarFree: Bool + + func isNoneSelected() -> Bool { + if isGlutenFree == false && isVegan == false && isNutFree == false && isSugarFree == false { + return true + } else { + return false + } + } } struct NutrientType { diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index 81091bf8..e5704479 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -135,11 +135,27 @@ final class FilterBreadTypeViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in // TODO: to next filter selection -// print(self?.selectedFilter) + dump(self?.filterData) } nextButton.addAction(action, for: .touchUpInside) } + // MARK: - Custom Method + + private func checkNextButtonStatus() { + if filterData.isNoneSelected() { + nextButton.isUserInteractionEnabled = false + UIView.animate(withDuration: 0.2) { + self.nextButton.getButtonUI(.gbbGray300!) + } + } else { + nextButton.isUserInteractionEnabled = true + UIView.animate(withDuration: 0.2) { + self.nextButton.getButtonUI(.gbbMain2!) + } + } + } + } // MARK: - UICollectionViewDelegate extension @@ -154,7 +170,7 @@ extension FilterBreadTypeViewController: UICollectionViewDelegate { case 3: filterData.isSugarFree = true default: return } - dump(filterData) + checkNextButtonStatus() } func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { @@ -165,7 +181,7 @@ extension FilterBreadTypeViewController: UICollectionViewDelegate { case 3: filterData.isSugarFree = false default: return } - dump(filterData) + checkNextButtonStatus() } } From b67dad870959ebf915821007c96d3b45f9de1cf0 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 17:31:54 +0900 Subject: [PATCH 094/153] [Feat] #39 - FilterIngredientVC completed --- .../Presentation/Filter/Model/FilterDTO.swift | 8 + .../FilterBreadTypeViewController.swift | 5 +- .../FilterIngredientViewController.swift | 177 +++++++++++++++++- 3 files changed, 181 insertions(+), 9 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift index 857d9cef..6ae3c29a 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift @@ -32,4 +32,12 @@ struct NutrientType { var isNutrientOpen: Bool var isIngredientOpen: Bool var isNotOpen: Bool + + func isNoneSelected() -> Bool { + if isNutrientOpen == false && isIngredientOpen == false && isNotOpen == false { + return true + } else { + return false + } + } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index e5704479..4df12b46 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -15,9 +15,8 @@ final class FilterBreadTypeViewController: BaseViewController { // MARK: - Property private var maxSteps: Int = 0 - private var filterType: FilterType = .breadType - private var filterTitleText: String = I18N.Filter.breadTypeTitle + private let filterTypes: [String] = FilterBreadType.allCases.map { $0.rawValue } private let filterDescriptions: [String] = FilterBreadType.allCases.map { $0.description } @@ -196,7 +195,7 @@ extension FilterBreadTypeViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: FilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) - cell.filterType = .breadType + cell.filterType = self.filterType cell.typeLabelText = filterTypes[indexPath.item] cell.descriptionLabelText = filterDescriptions[indexPath.item] return cell diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index 12036559..4c02af72 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -14,26 +14,191 @@ final class FilterIngredientViewController: BaseViewController { // MARK: - Property + private var maxSteps: Int = 0 + private let filterType: FilterType = .ingredient + private let filterTypes: [String] = FilterIngredientType.allCases.map { $0.rawValue } - // MARK: - UI Property + private var filterData: NutrientType = .init(isNutrientOpen: false, isIngredientOpen: false, isNotOpen: false) + // MARK: - UI Property + private let navigationBar = CustomNavigationBar() + private let filterTitleLabel = UILabel() + private let filterSubtitleLabel = UILabel() + private let filterCollectionViewFlowLayout = UICollectionViewFlowLayout() + private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: filterCollectionViewFlowLayout) + private let nextButton = CommonButton() // MARK: - Life Cycle + init(maxSteps: Int) { + super.init(nibName: nil, bundle: nil) + + setMaxSteps(to: maxSteps) + } + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } - // MARK: - Setting - - - - // MARK: - Action Helper + override func viewDidLoad() { + super.viewDidLoad() + + setNextButtonAction() + } + // MARK: - Setting + private func setMaxSteps(to steps: Int) { + self.maxSteps = steps + } + + override func setLayout() { + view.addSubview(navigationBar) + navigationBar.snp.makeConstraints { + $0.top.horizontalEdges.equalToSuperview() + } + + view.addSubview(filterTitleLabel) + filterTitleLabel.snp.makeConstraints { + $0.top.equalTo(navigationBar.snp.bottom) + $0.leading.equalToSuperview().inset(24) + } + + view.addSubview(filterSubtitleLabel) + filterSubtitleLabel.snp.makeConstraints { + $0.top.equalTo(filterTitleLabel.snp.bottom).offset(12) + $0.leading.equalToSuperview().inset(24) + } + + view.addSubview(nextButton) + nextButton.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(24) + $0.bottom.equalToSuperview().inset(55) + $0.height.equalTo(56) + } + + view.addSubview(filterCollectionView) + filterCollectionView.snp.makeConstraints { + $0.top.equalTo(filterSubtitleLabel.snp.bottom).offset(40) + $0.horizontalEdges.equalToSuperview().inset(24) + $0.bottom.equalTo(nextButton.snp.top).offset(-40) + } + } + + override func setUI() { + navigationBar.do { + $0.addBackButtonAction(popViewControllerAction()) + $0.configureRightCount(maxSteps - 2, by: maxSteps) + } + + filterTitleLabel.do { + $0.text = I18N.Filter.ingredientTitle + $0.font = .title1 + $0.textColor = .gbbGray700 + $0.numberOfLines = 2 + } + + filterSubtitleLabel.do { + $0.text = I18N.Filter.ingredientSubtitle + $0.font = .subHead + $0.textColor = .gbbGray400 + } + + filterCollectionViewFlowLayout.do { + $0.scrollDirection = .vertical + } + + filterCollectionView.do { + $0.register(cell: FilterCollectionViewCell.self) + $0.backgroundColor = .clear + $0.isScrollEnabled = false + $0.allowsMultipleSelection = true + } + + nextButton.do { + $0.getButtonTitle(.next) + $0.getButtonUI(.gbbGray200!) + $0.isUserInteractionEnabled = false + } + } + + override func setDelegate() { + filterCollectionView.delegate = self + filterCollectionView.dataSource = self + } + + private func setNextButtonAction() { + let action = UIAction { [weak self] _ in + // TODO: to next filter selection + dump(self?.filterData) + } + nextButton.addAction(action, for: .touchUpInside) + } // MARK: - Custom Method + private func checkNextButtonStatus() { + if filterData.isNoneSelected() { + nextButton.isUserInteractionEnabled = false + UIView.animate(withDuration: 0.2) { + self.nextButton.getButtonUI(.gbbGray300!) + } + } else { + nextButton.isUserInteractionEnabled = true + UIView.animate(withDuration: 0.2) { + self.nextButton.getButtonUI(.gbbMain2!) + } + } + } +} + +// MARK: - UICollectionViewDelegate extension + +extension FilterIngredientViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + switch indexPath.item { + case 0: filterData.isNutrientOpen = true + case 1: filterData.isIngredientOpen = true + case 2: filterData.isNotOpen = true + default: return + } + checkNextButtonStatus() + } + + func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { + switch indexPath.item { + case 0: filterData.isNutrientOpen = false + case 1: filterData.isIngredientOpen = false + case 2: filterData.isNotOpen = false + default: return + } + checkNextButtonStatus() + } } + +// MARK: - UICollectionViewDataSource extension + +extension FilterIngredientViewController: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return filterTypes.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: FilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.filterType = self.filterType + cell.typeLabelText = filterTypes[indexPath.item] + return cell + } +} + +extension FilterIngredientViewController: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return filterType.cellSize + } +} From 599839c89ee39af50d738c6a3b2cdac3e01597d5 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 17:55:39 +0900 Subject: [PATCH 095/153] [Feat] #39 - Filter selection flow connected --- .../Application/SceneDelegate.swift | 2 +- GEON-PPANG-iOS/Global/Enum/FilterEnum.swift | 8 ++++ .../FilterBreadTypeViewController.swift | 4 +- .../FilterIngredientViewController.swift | 2 +- .../FilterPurposeViewController.swift | 39 ++++++++++++------- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/GEON-PPANG-iOS/Application/SceneDelegate.swift b/GEON-PPANG-iOS/Application/SceneDelegate.swift index 5a66dd4c..619ca26f 100644 --- a/GEON-PPANG-iOS/Application/SceneDelegate.swift +++ b/GEON-PPANG-iOS/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let window = UIWindow(windowScene: windowScene) window.overrideUserInterfaceStyle = UIUserInterfaceStyle.light - let rootViewController = TabBarController() + let rootViewController = FilterPurposeViewController(maxSteps: 6, username: "Id") let navigationController = UINavigationController(rootViewController: rootViewController) navigationController.isNavigationBarHidden = true window.rootViewController = navigationController diff --git a/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift b/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift index 1ca981c4..b3a27ba9 100644 --- a/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift +++ b/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift @@ -44,6 +44,14 @@ enum FilterPurposeType: String, CaseIterable { case .vegan: return "종교 , 환경 , 동물 , 노동권을 위한 비거니즘" } } + + var data: String { + switch self { + case .health: return "HEALTH" + case .taste: return "TASTE" + case .vegan: return "VEGAN" + } + } } enum FilterBreadType: String, CaseIterable { diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index 4df12b46..6d37abdd 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -92,7 +92,7 @@ final class FilterBreadTypeViewController: BaseViewController { override func setUI() { navigationBar.do { $0.addBackButtonAction(popViewControllerAction()) - $0.configureRightCount(maxSteps - 2, by: maxSteps) + $0.configureRightCount(maxSteps - 1, by: maxSteps) } filterTitleLabel.do { @@ -133,7 +133,7 @@ final class FilterBreadTypeViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in - // TODO: to next filter selection + Utils.push(self?.navigationController, FilterIngredientViewController(maxSteps: 6)) dump(self?.filterData) } nextButton.addAction(action, for: .touchUpInside) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index 4c02af72..7a703f2c 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -91,7 +91,7 @@ final class FilterIngredientViewController: BaseViewController { override func setUI() { navigationBar.do { $0.addBackButtonAction(popViewControllerAction()) - $0.configureRightCount(maxSteps - 2, by: maxSteps) + $0.configureRightCount(maxSteps, by: maxSteps) } filterTitleLabel.do { diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index d005c56c..7b092456 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -16,12 +16,14 @@ final class FilterPurposeViewController: BaseViewController { private var maxSteps: Int = 0 private var userName: String = "Id" - private var selectedFilter: String! private var filterType: FilterType = .purpose - private var filterTitleText: String = I18N.Filter.purposeTitle + private let filterTypes: [String] = FilterPurposeType.allCases.map { $0.rawValue } private let filterDescriptions: [String] = FilterPurposeType.allCases.map { $0.description } + private let filterDatas: [String] = FilterPurposeType.allCases.map { $0.data } + + private var filterData: String! // MARK: - UI Property @@ -33,10 +35,11 @@ final class FilterPurposeViewController: BaseViewController { // MARK: - Life Cycle - init(maxSteps: Int) { + init(maxSteps: Int, username: String) { super.init(nibName: nil, bundle: nil) setMaxSteps(to: maxSteps) + setUsername(to: username) } @available(*, unavailable) @@ -56,6 +59,10 @@ final class FilterPurposeViewController: BaseViewController { self.maxSteps = steps } + private func setUsername(to name: String) { + self.userName = name + } + override func setLayout() { view.addSubview(navigationBar) navigationBar.snp.makeConstraints { @@ -90,7 +97,7 @@ final class FilterPurposeViewController: BaseViewController { } filterTitleLabel.do { - $0.text = filterTitleText.insertString(userName, at: 5) + $0.text = I18N.Filter.purposeTitle.insertString(userName, at: 5) $0.font = .title1 $0.textColor = .gbbGray700 $0.numberOfLines = 2 @@ -120,20 +127,15 @@ final class FilterPurposeViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in - // TODO: to next filter selection - print(self?.selectedFilter) + Utils.push(self?.navigationController, FilterBreadTypeViewController(maxSteps: 6)) + print(self?.filterData) } nextButton.addAction(action, for: .touchUpInside) } -} - -// MARK: - UICollectionViewDelegate extension - -extension FilterPurposeViewController: UICollectionViewDelegate { + // MARK: - Custom Method - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - selectedFilter = filterTypes[indexPath.item] + private func enableNextButton() { UIView.animate(withDuration: 0.2) { self.nextButton.do { $0.getButtonUI(.gbbMain2!) @@ -144,6 +146,17 @@ extension FilterPurposeViewController: UICollectionViewDelegate { } +// MARK: - UICollectionViewDelegate extension + +extension FilterPurposeViewController: UICollectionViewDelegate { + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + filterData = filterDatas[indexPath.item] + enableNextButton() + } + +} + // MARK: - UICollectionViewDataSource extension extension FilterPurposeViewController: UICollectionViewDataSource { From 4505f9cbbf6faadede2bd8da3bfdd4b7965d49aa Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 18:00:10 +0900 Subject: [PATCH 096/153] =?UTF-8?q?[Fix]=20#47=20-=20keywords=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HomeReviewCollectionViewCell.swift | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift index e313fb35..724e0740 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift @@ -16,8 +16,7 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { var updateData: ((Bool, Int) -> Void)? var index = 0 - private var keywords = ["", ""] - private var keywordsCount: Int = 0 + private var keywords: [String] = [] private var reviewList: [HomeBestReviewResponseDTO] = HomeBestReviewResponseDTO.item // MARK: - UI Property @@ -142,12 +141,10 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { bookMarkButton.isSelected = data.isBooked if !self.reviewList[index].firstMaxRecommendKeyword.isEmpty { - self.keywords[keywordsCount] = data.firstMaxRecommendKeyword - keywordsCount += 1 + self.keywords.append(data.firstMaxRecommendKeyword) } if !self.reviewList[index].secondMaxRecommendKeyword.isEmpty { - self.keywords[keywordsCount] = data.secondMaxRecommendKeyword - keywordsCount += 1 + self.keywords.append(data.secondMaxRecommendKeyword) } } } @@ -164,7 +161,7 @@ extension HomeReviewCollectionViewCell { extension HomeReviewCollectionViewCell: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return keywordsCount + return keywords.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { From c3eddffb3e230846096267b4f95910b939984c47 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 18:09:33 +0900 Subject: [PATCH 097/153] =?UTF-8?q?[Fix]=20#36=20-=20breadTypeTag=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListCollectionViewCell.swift | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 275e3948..7519341e 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -17,9 +17,8 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { // MARK: - Property var index = 0 - var breadTypeCount: Int = 0 var updateData: ((Bool, Int) -> Void)? - private var tips: [String] = ["", "", "", ""] + private var breadTypeTag: [String] = [] private var ingredientList: [BakeryListResponseDTO] = BakeryListResponseDTO.item private var bakeryViewType: BakeryViewType? = .defaultType { didSet { @@ -124,24 +123,23 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { regionStackView.getRegionName(data.firstNearStation, data.secondNearStation ?? "") if self.ingredientList[index].breadType.isGlutenFree { - self.tips[breadTypeCount] = I18N.BakeryList.glutenfree - breadTypeCount += 1 + self.breadTypeTag.append(I18N.BakeryList.glutenfree) } + if self.ingredientList[index].breadType.isNutFree { - self.tips[breadTypeCount] = I18N.BakeryList.nutfree - breadTypeCount += 1 + self.breadTypeTag.append(I18N.BakeryList.nutfree) } + if self.ingredientList[index].breadType.isVegan { - self.tips[breadTypeCount] = I18N.BakeryList.vegan - breadTypeCount += 1 + self.breadTypeTag.append(I18N.BakeryList.vegan) } + if self.ingredientList[index].breadType.isSugarFree { - self.tips[breadTypeCount] = I18N.BakeryList.sugar - breadTypeCount += 1 + self.breadTypeTag.append(I18N.BakeryList.sugar) } collectionView.snp.remakeConstraints { - $0.height.equalTo(getHeight(self.tips)) + $0.height.equalTo(getHeight(self.breadTypeTag)) $0.top.equalTo(bakeryTitle.snp.bottom).offset(10) $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) $0.trailing.equalToSuperview().offset(-70) @@ -223,12 +221,12 @@ extension BakeryListCollectionViewCell { extension BakeryListCollectionViewCell: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return breadTypeCount + return breadTypeTag.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) - cell.configureTagTitle(self.tips[indexPath.item]) + cell.configureTagTitle(self.breadTypeTag[indexPath.item]) return cell } } @@ -237,7 +235,7 @@ extension BakeryListCollectionViewCell: UICollectionViewDataSource { extension BakeryListCollectionViewCell: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - let tagTitle = self.tips[indexPath.item] + let tagTitle = self.breadTypeTag[indexPath.item] let itemSize = tagTitle.size(withAttributes: [NSAttributedString.Key.font: UIFont.pretendardMedium(13)]) return CGSize(width: itemSize.width + 12, height: itemSize.height + 8) } From e438703814dd1a0c83aa8f3d482f0af0ae4a9763 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 18:11:31 +0900 Subject: [PATCH 098/153] [Feat] #39 - filter selection data connected --- .../Presentation/Filter/Model/FilterDTO.swift | 19 +++++++++++++--- .../FilterBreadTypeViewController.swift | 22 +++++++++---------- .../FilterIngredientViewController.swift | 18 +++++++-------- .../FilterPurposeViewController.swift | 6 ++--- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift index 6ae3c29a..6b83f6f7 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift @@ -8,9 +8,22 @@ import Foundation struct FilterRequestDTO { - let mainPurpose: String - let breadType: BreadType - let nutrientType: NutrientType + var mainPurpose: String + var breadType: BreadType + var nutrientType: NutrientType + + static var sharedData = FilterRequestDTO() + + private init() { + self.mainPurpose = "" + self.breadType = .init(isGlutenFree: false, + isVegan: false, + isNutFree: false, + isSugarFree: false) + self.nutrientType = .init(isNutrientOpen: false, + isIngredientOpen: false, + isNotOpen: false) + } } struct BreadType { diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index 6d37abdd..5c820396 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -20,8 +20,6 @@ final class FilterBreadTypeViewController: BaseViewController { private let filterTypes: [String] = FilterBreadType.allCases.map { $0.rawValue } private let filterDescriptions: [String] = FilterBreadType.allCases.map { $0.description } - private var filterData: BreadType = .init(isGlutenFree: false, isVegan: false, isNutFree: false, isSugarFree: false) - // MARK: - UI Property private let navigationBar = CustomNavigationBar() @@ -134,7 +132,7 @@ final class FilterBreadTypeViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in Utils.push(self?.navigationController, FilterIngredientViewController(maxSteps: 6)) - dump(self?.filterData) + dump(FilterRequestDTO.sharedData) } nextButton.addAction(action, for: .touchUpInside) } @@ -142,7 +140,7 @@ final class FilterBreadTypeViewController: BaseViewController { // MARK: - Custom Method private func checkNextButtonStatus() { - if filterData.isNoneSelected() { + if FilterRequestDTO.sharedData.breadType.isNoneSelected() { nextButton.isUserInteractionEnabled = false UIView.animate(withDuration: 0.2) { self.nextButton.getButtonUI(.gbbGray300!) @@ -163,10 +161,10 @@ extension FilterBreadTypeViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { switch indexPath.item { - case 0: filterData.isGlutenFree = true - case 1: filterData.isVegan = true - case 2: filterData.isNutFree = true - case 3: filterData.isSugarFree = true + case 0: FilterRequestDTO.sharedData.breadType.isGlutenFree = true + case 1: FilterRequestDTO.sharedData.breadType.isVegan = true + case 2: FilterRequestDTO.sharedData.breadType.isNutFree = true + case 3: FilterRequestDTO.sharedData.breadType.isSugarFree = true default: return } checkNextButtonStatus() @@ -174,10 +172,10 @@ extension FilterBreadTypeViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { switch indexPath.item { - case 0: filterData.isGlutenFree = false - case 1: filterData.isVegan = false - case 2: filterData.isNutFree = false - case 3: filterData.isSugarFree = false + case 0: FilterRequestDTO.sharedData.breadType.isGlutenFree = false + case 1: FilterRequestDTO.sharedData.breadType.isVegan = false + case 2: FilterRequestDTO.sharedData.breadType.isNutFree = false + case 3: FilterRequestDTO.sharedData.breadType.isSugarFree = false default: return } checkNextButtonStatus() diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index 7a703f2c..87f7f8dd 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -19,8 +19,6 @@ final class FilterIngredientViewController: BaseViewController { private let filterTypes: [String] = FilterIngredientType.allCases.map { $0.rawValue } - private var filterData: NutrientType = .init(isNutrientOpen: false, isIngredientOpen: false, isNotOpen: false) - // MARK: - UI Property private let navigationBar = CustomNavigationBar() @@ -133,7 +131,7 @@ final class FilterIngredientViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in // TODO: to next filter selection - dump(self?.filterData) + dump(FilterRequestDTO.sharedData) } nextButton.addAction(action, for: .touchUpInside) } @@ -141,7 +139,7 @@ final class FilterIngredientViewController: BaseViewController { // MARK: - Custom Method private func checkNextButtonStatus() { - if filterData.isNoneSelected() { + if FilterRequestDTO.sharedData.nutrientType.isNoneSelected() { nextButton.isUserInteractionEnabled = false UIView.animate(withDuration: 0.2) { self.nextButton.getButtonUI(.gbbGray300!) @@ -162,9 +160,9 @@ extension FilterIngredientViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { switch indexPath.item { - case 0: filterData.isNutrientOpen = true - case 1: filterData.isIngredientOpen = true - case 2: filterData.isNotOpen = true + case 0: FilterRequestDTO.sharedData.nutrientType.isNutrientOpen = true + case 1: FilterRequestDTO.sharedData.nutrientType.isIngredientOpen = true + case 2: FilterRequestDTO.sharedData.nutrientType.isNotOpen = true default: return } checkNextButtonStatus() @@ -172,9 +170,9 @@ extension FilterIngredientViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { switch indexPath.item { - case 0: filterData.isNutrientOpen = false - case 1: filterData.isIngredientOpen = false - case 2: filterData.isNotOpen = false + case 0: FilterRequestDTO.sharedData.nutrientType.isNutrientOpen = false + case 1: FilterRequestDTO.sharedData.nutrientType.isIngredientOpen = false + case 2: FilterRequestDTO.sharedData.nutrientType.isNotOpen = false default: return } checkNextButtonStatus() diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 7b092456..9f32c0cb 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -23,8 +23,6 @@ final class FilterPurposeViewController: BaseViewController { private let filterDescriptions: [String] = FilterPurposeType.allCases.map { $0.description } private let filterDatas: [String] = FilterPurposeType.allCases.map { $0.data } - private var filterData: String! - // MARK: - UI Property private let navigationBar = CustomNavigationBar() @@ -128,7 +126,7 @@ final class FilterPurposeViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in Utils.push(self?.navigationController, FilterBreadTypeViewController(maxSteps: 6)) - print(self?.filterData) + dump(FilterRequestDTO.sharedData) } nextButton.addAction(action, for: .touchUpInside) } @@ -151,7 +149,7 @@ final class FilterPurposeViewController: BaseViewController { extension FilterPurposeViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - filterData = filterDatas[indexPath.item] + FilterRequestDTO.sharedData.mainPurpose = filterDatas[indexPath.item] enableNextButton() } From f5bf41bd1c924d944f080395f5aac904070d5777 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 18:24:56 +0900 Subject: [PATCH 099/153] =?UTF-8?q?[Fix]=20#36=20-=20=EB=B9=B5=EC=A7=91=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=85=80=20UI=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryFilterCollectionViewCell.swift | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift index 7912e742..49ebe8cb 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift @@ -13,8 +13,12 @@ import Then final class BakeryFilterCollectionViewCell: UICollectionViewCell { // MARK: - Property - - var isTapped: Bool = true + + private var isTapped: Bool = true { + didSet { + updateUI(isTapped) + } + } // MARK: - UI Property @@ -70,9 +74,13 @@ final class BakeryFilterCollectionViewCell: UICollectionViewCell { func bind(item: BakeryFilterItems, index: Int) { iconView.image = item.leftIcon filterTitle.text = item.filter.title - filterTitle.textColor = (item.status == .off) ? .black : .gbbBackground2 - contentView.backgroundColor = (item.status == .off) ? .gbbGray100 : .gbbMain3 - contentView.makeBorder(width: 1, color: (item.status == .off) ? .gbbGray200! : .gbbMain2!) + isTapped = item.status == .on ? false : true + } + + func updateUI(_ isTapped: Bool) { + filterTitle.textColor = isTapped ? .black : .gbbBackground2 + contentView.backgroundColor = isTapped ? .gbbGray100 : .gbbMain3 + contentView.makeBorder(width: 1, color: isTapped ? .gbbGray200! : .gbbMain2!) } func getSize() { From 08437bb146b64ee69421fa7e8dd27f2c2568b5a3 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 18:30:20 +0900 Subject: [PATCH 100/153] [Feat] #39 - changed backbutton action --- .../FilterBreadTypeViewController.swift | 19 +++++++++++++++++-- .../FilterIngredientViewController.swift | 18 ++++++++++++++++-- .../FilterPurposeViewController.swift | 12 +++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index 5c820396..d196dcaf 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -89,7 +89,7 @@ final class FilterBreadTypeViewController: BaseViewController { override func setUI() { navigationBar.do { - $0.addBackButtonAction(popViewControllerAction()) + $0.addBackButtonAction(popFilterViewController()) $0.configureRightCount(maxSteps - 1, by: maxSteps) } @@ -137,13 +137,28 @@ final class FilterBreadTypeViewController: BaseViewController { nextButton.addAction(action, for: .touchUpInside) } + // MARK: - Action Helper + + private func popFilterViewController() -> UIAction { + let action = UIAction { [weak self] _ in + FilterRequestDTO.sharedData.breadType = .init( + isGlutenFree: false, + isVegan: false, + isNutFree: false, + isSugarFree: false + ) + self?.navigationController?.popViewController(animated: true) + } + return action + } + // MARK: - Custom Method private func checkNextButtonStatus() { if FilterRequestDTO.sharedData.breadType.isNoneSelected() { nextButton.isUserInteractionEnabled = false UIView.animate(withDuration: 0.2) { - self.nextButton.getButtonUI(.gbbGray300!) + self.nextButton.getButtonUI(.gbbGray200!) } } else { nextButton.isUserInteractionEnabled = true diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index 87f7f8dd..c7d81629 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -88,7 +88,7 @@ final class FilterIngredientViewController: BaseViewController { override func setUI() { navigationBar.do { - $0.addBackButtonAction(popViewControllerAction()) + $0.addBackButtonAction(popFilterViewController()) $0.configureRightCount(maxSteps, by: maxSteps) } @@ -136,13 +136,27 @@ final class FilterIngredientViewController: BaseViewController { nextButton.addAction(action, for: .touchUpInside) } + // MARK: - Action Helper + + private func popFilterViewController() -> UIAction { + let action = UIAction { [weak self] _ in + FilterRequestDTO.sharedData.nutrientType = .init( + isNutrientOpen: false, + isIngredientOpen: false, + isNotOpen: false + ) + self?.navigationController?.popViewController(animated: true) + } + return action + } + // MARK: - Custom Method private func checkNextButtonStatus() { if FilterRequestDTO.sharedData.nutrientType.isNoneSelected() { nextButton.isUserInteractionEnabled = false UIView.animate(withDuration: 0.2) { - self.nextButton.getButtonUI(.gbbGray300!) + self.nextButton.getButtonUI(.gbbGray200!) } } else { nextButton.isUserInteractionEnabled = true diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 9f32c0cb..261f8fdf 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -90,7 +90,7 @@ final class FilterPurposeViewController: BaseViewController { override func setUI() { navigationBar.do { - $0.addBackButtonAction(popViewControllerAction()) + $0.addBackButtonAction(popFilterViewController()) $0.configureRightCount(maxSteps - 2, by: maxSteps) } @@ -131,6 +131,16 @@ final class FilterPurposeViewController: BaseViewController { nextButton.addAction(action, for: .touchUpInside) } + // MARK: - Action Helper + + private func popFilterViewController() -> UIAction { + let action = UIAction { [weak self] _ in + FilterRequestDTO.sharedData.mainPurpose = "" + self?.navigationController?.popViewController(animated: true) + } + return action + } + // MARK: - Custom Method private func enableNextButton() { From d81a8cb412b33ed0103b9a40f58d94dcf24154d3 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 18:36:56 +0900 Subject: [PATCH 101/153] [Feat] #39 - edited layout details --- .../Filter/ViewControllers/FilterBreadTypeViewController.swift | 2 ++ .../Filter/ViewControllers/FilterIngredientViewController.swift | 1 + .../Filter/ViewControllers/FilterPurposeViewController.swift | 1 + 3 files changed, 4 insertions(+) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index d196dcaf..c31df914 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -108,6 +108,8 @@ final class FilterBreadTypeViewController: BaseViewController { filterCollectionViewFlowLayout.do { $0.scrollDirection = .vertical + $0.minimumLineSpacing = CGFloat().convertByWidthRatio(21) + $0.minimumInteritemSpacing = CGFloat().convertByHeightRatio(20) } filterCollectionView.do { diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index c7d81629..60eebe75 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -107,6 +107,7 @@ final class FilterIngredientViewController: BaseViewController { filterCollectionViewFlowLayout.do { $0.scrollDirection = .vertical + $0.minimumLineSpacing = 20 } filterCollectionView.do { diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 261f8fdf..4836bde8 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -103,6 +103,7 @@ final class FilterPurposeViewController: BaseViewController { filterCollectionViewFlowLayout.do { $0.scrollDirection = .vertical + $0.minimumLineSpacing = 20 } filterCollectionView.do { From e0151b320ea10fafbd05c64e712ec373608456f3 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 18:47:20 +0900 Subject: [PATCH 102/153] =?UTF-8?q?[Fix]=20#40=20-=20snapShot=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchViewController.swift | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift index 52182ae5..b00590b4 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift @@ -22,6 +22,7 @@ final class SearchViewController: BaseViewController { typealias DataSource = UICollectionViewDiffableDataSource private var dataSource: DataSource? private let bakeryList: [HomeBestBakeryResponseDTO] = HomeBestBakeryResponseDTO.item + private var currentSection: [Section] = [.initial] // MARK: - UI Property @@ -114,13 +115,17 @@ final class SearchViewController: BaseViewController { } private func setDataSource(data: [HomeBestBakeryResponseDTO]) { - guard var snapshot = dataSource?.snapshot() else { return} + guard var snapshot = dataSource?.snapshot() else { return } if data.count == 0 { + snapshot.deleteSections(currentSection) snapshot.appendItems([0], toSection: .empty) + currentSection = [.empty] dataSource?.apply(snapshot) } else { - snapshot.deleteSections([.initial]) + snapshot.deleteSections(currentSection) snapshot.appendItems(bakeryList, toSection: .main) + currentSection = [.main] + dataSource?.apply(snapshot) } } @@ -144,10 +149,18 @@ final class SearchViewController: BaseViewController { } private func normalSection() -> NSCollectionLayoutSection { - let item = NSCollectionLayoutItem(layoutSize: .init(widthDimension: .fractionalWidth(1), - heightDimension: .fractionalHeight(1))) - let group = NSCollectionLayoutGroup.vertical(layoutSize: .init(widthDimension: .fractionalWidth(1), - heightDimension: .fractionalHeight(1)), subitem: item, count: 1) + let item = NSCollectionLayoutItem(layoutSize: .init( + widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1)) + ) + let group = NSCollectionLayoutGroup.vertical( + layoutSize: .init( + widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1) + ), + subitem: item, + count: 1 + ) let section = NSCollectionLayoutSection(group: group) return section } From d91669a01d299bab2a83cf579e55c3f739c8a0b8 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 18:49:40 +0900 Subject: [PATCH 103/153] =?UTF-8?q?[Fix]=20#47=20-=20=ED=99=88=20header=20?= =?UTF-8?q?UI=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/HomeViewController.swift | 4 +-- .../Home/Views/HomeHeaderView.swift | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift index 8884cd6f..7e0fb53e 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift @@ -132,9 +132,7 @@ final class HomeViewController: BaseViewController { dataSource?.supplementaryViewProvider = { (collectionView, _, indexPath) in let header: HomeHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) - Sections.allCases.forEach { - header.setctionHeaderTitle($0.title) - } + switch indexPath.section { case 0: header.setctionHeaderTitle(Sections.bakery.title) diff --git a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift index 0c4d6c1d..1362ddc4 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift @@ -19,7 +19,6 @@ final class HomeHeaderView: UICollectionReusableView { override init(frame: CGRect) { super.init(frame: .zero) - setUI() setLayout() } @@ -30,13 +29,6 @@ final class HomeHeaderView: UICollectionReusableView { // MAKR: - Setting - private func setUI() { - headerLabel.do { - $0.basic(font: .pretendardBold(20), color: .gbbGray700!) - - } - } - private func setLayout() { addSubview(headerLabel) @@ -47,6 +39,22 @@ final class HomeHeaderView: UICollectionReusableView { } func setctionHeaderTitle(_ section: String) { - headerLabel.text = section + var attributedString = NSMutableAttributedString ( + string: section, + attributes: [ + .font: UIFont.pretendardBold(20), + .foregroundColor: UIColor.gbbGray700! + ] + ) + + attributedString.addAttributes( + [.foregroundColor: UIColor.gbbPoint1!], + range: NSRange( + location: section.count - 8, + length: 8 + ) + ) + headerLabel.attributedText = attributedString + } } From 33594f5813e7c7e8ad2ef71594b4b258eb8f1ed6 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 18:51:58 +0900 Subject: [PATCH 104/153] [Feat] #39 - edited offsets for different devices --- .../FilterBreadTypeViewController.swift | 2 +- .../FilterIngredientViewController.swift | 2 +- .../FilterPurposeViewController.swift | 2 +- .../Filter/Views/FilterCollectionViewCell.swift | 12 ++---------- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index c31df914..a35e7496 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -83,7 +83,7 @@ final class FilterBreadTypeViewController: BaseViewController { filterCollectionView.snp.makeConstraints { $0.top.equalTo(filterSubtitleLabel.snp.bottom).offset(40) $0.horizontalEdges.equalToSuperview().inset(24) - $0.bottom.equalTo(nextButton.snp.top).offset(-40) + $0.bottom.equalTo(nextButton.snp.top).offset(-10) } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index 60eebe75..d585f5cd 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -82,7 +82,7 @@ final class FilterIngredientViewController: BaseViewController { filterCollectionView.snp.makeConstraints { $0.top.equalTo(filterSubtitleLabel.snp.bottom).offset(40) $0.horizontalEdges.equalToSuperview().inset(24) - $0.bottom.equalTo(nextButton.snp.top).offset(-40) + $0.bottom.equalTo(nextButton.snp.top).offset(-10) } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index 4836bde8..e1e6603b 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -84,7 +84,7 @@ final class FilterPurposeViewController: BaseViewController { filterCollectionView.snp.makeConstraints { $0.top.equalTo(filterTitleLabel.snp.bottom).offset(40) $0.horizontalEdges.equalToSuperview().inset(24) - $0.bottom.equalTo(nextButton.snp.top).offset(-40) + $0.bottom.equalTo(nextButton.snp.top).offset(-10) } } diff --git a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift index 806f75e4..9bd82e1b 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Views/FilterCollectionViewCell.swift @@ -49,16 +49,8 @@ final class FilterCollectionViewCell: UICollectionViewCell { private func configureLayout() { contentView.addSubview(labelStackView) - switch filterType { - case .purpose, .ingredient: - labelStackView.snp.makeConstraints { - $0.center.equalToSuperview() - } - case .breadType: - labelStackView.snp.makeConstraints { - $0.centerX.equalToSuperview() - $0.top.equalToSuperview().inset(46) - } + labelStackView.snp.makeConstraints { + $0.center.equalToSuperview() } } From 4e2305ea05488d4a8ac52960cb2477711006c388 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 21:38:36 +0900 Subject: [PATCH 105/153] =?UTF-8?q?[Fix]=20#36=20-=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryFilterCollectionViewCell.swift | 4 +-- .../BakeryListCollectionViewCell.swift | 10 +++++--- .../BakeryListViewController.swift | 4 +-- .../Model/BakeryFilterItems.swift | 4 +-- .../BakeryList/Views/BakeryFilterView.swift | 25 +++++++++++-------- .../BakeryList/Views/BakeryListTopView.swift | 9 ++++--- .../Common/StackView/MarkStackView.swift | 1 - .../ViewControllers/HomeViewController.swift | 4 +-- .../MyPageViewController.swift | 2 ++ 9 files changed, 36 insertions(+), 27 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift index 49ebe8cb..f0c1d986 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift @@ -13,7 +13,7 @@ import Then final class BakeryFilterCollectionViewCell: UICollectionViewCell { // MARK: - Property - + private var isTapped: Bool = true { didSet { updateUI(isTapped) @@ -24,7 +24,7 @@ final class BakeryFilterCollectionViewCell: UICollectionViewCell { private let hStackView = UIStackView() private let iconView = UIImageView() - var filterTitle = UILabel() + var filterTitle = UILabel() // MARK: - Life Cycle diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 7519341e..59e593e0 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -40,11 +40,10 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { override init(frame: CGRect) { super.init(frame: .zero) - contentView.backgroundColor = .white + setLayout() setUI() - - setRegister() + setRegistration() } required init?(coder: NSCoder) { @@ -54,6 +53,9 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { // MARK: - Setting private func setUI() { + self.do { + $0.contentView.backgroundColor = .white + } bakeryImage.do { $0.backgroundColor = .darkGray $0.makeCornerRound(radius: 5) @@ -212,7 +214,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { // MARK: - CollectionView Register extension BakeryListCollectionViewCell { - private func setRegister() { + private func setRegistration() { collectionView.register(cell: DescriptionCollectionViewCell.self) } } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index 57d262ee..4e1baf1c 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -33,7 +33,7 @@ final class BakeryListViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - setRegister() + setRegistration() setupDataSource() setReloadData() @@ -67,7 +67,7 @@ final class BakeryListViewController: BaseViewController { } } - private func setRegister() { + private func setRegistration() { bakeryListCollectionView.register(cell: BakeryListCollectionViewCell.self) } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryFilterItems.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryFilterItems.swift index f1e115f7..ba17ac8a 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryFilterItems.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryFilterItems.swift @@ -45,9 +45,9 @@ struct BakeryFilterItems: Hashable { case .HARD: return BakeryFilterItems(filter: filter, status: status, leftIcon: .disabledHardIcon) case .DESSERT: - return BakeryFilterItems(filter: .DESSERT, status: .off, leftIcon: .disabledCakeIcon) + return BakeryFilterItems(filter: filter, status: .off, leftIcon: .disabledCakeIcon) case .BRUNCH: - return BakeryFilterItems(filter: .BRUNCH, status: .off, leftIcon: .disabledSandwichIcon) + return BakeryFilterItems(filter: filter, status: .off, leftIcon: .disabledSandwichIcon) } case .on: diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift index 82da45e8..5622a2a9 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift @@ -24,21 +24,23 @@ final class BakeryFilterView: UIView { // MARK: - UI Property - private lazy var filterCollectionview = UICollectionView(frame: .zero, collectionViewLayout: layout()) + private lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) private lazy var filterButton = UIButton(configuration: .plain()) private let topView = UIView() private let lineView = UIView() private let bottomView = UIView() + // MARK: - Life Cycle + override init(frame: CGRect) { super.init(frame: .zero) setLayout() setUI() - setRegister() - setupDataSource() + setRegistration() + setDataSource() setReloadData() } @@ -46,9 +48,10 @@ final class BakeryFilterView: UIView { fatalError("init(coder:) has not been implemented") } + // MARK: - Setting + private func setUI() { - - filterCollectionview.do { + filterCollectionView.do { $0.delegate = self $0.showsHorizontalScrollIndicator = false } @@ -76,7 +79,7 @@ final class BakeryFilterView: UIView { } private func setLayout() { - addSubviews(topView, filterButton, lineView, filterCollectionview, bottomView) + addSubviews(topView, filterButton, lineView, filterCollectionView, bottomView) topView.snp.makeConstraints { $0.top.directionalHorizontalEdges.equalToSuperview() @@ -95,7 +98,7 @@ final class BakeryFilterView: UIView { $0.directionalVerticalEdges.equalToSuperview().inset(15) } - filterCollectionview.snp.makeConstraints { + filterCollectionView.snp.makeConstraints { $0.leading.equalTo(lineView.snp.trailing) $0.centerY.trailing.equalToSuperview() $0.height.equalTo(42) @@ -115,12 +118,12 @@ final class BakeryFilterView: UIView { return layout } - private func setRegister() { - filterCollectionview.register(cell: BakeryFilterCollectionViewCell.self) + private func setRegistration() { + filterCollectionView.register(cell: BakeryFilterCollectionViewCell.self) } - private func setupDataSource() { - dataSource = DataSource(collectionView: filterCollectionview, cellProvider: { collectionView, indexPath, item in + private func setDataSource() { + dataSource = DataSource(collectionView: filterCollectionView, cellProvider: { collectionView, indexPath, item in let cell: BakeryFilterCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.bind(item: item, index: indexPath.item) return cell diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift index def4399c..290b3cee 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift @@ -11,9 +11,7 @@ import SnapKit import Then final class BakeryListTopView: UIView { - - // MARK: - Property - + // MARK: - UI Property private let hStackView = UIStackView() @@ -21,6 +19,9 @@ final class BakeryListTopView: UIView { private let bakeryIcon = UIImageView() private let searchButton = UIButton() + + // MARK: - Life Cycle + override init(frame: CGRect) { super.init(frame: .zero) @@ -32,6 +33,8 @@ final class BakeryListTopView: UIView { fatalError("init(coder:) has not been implemented") } + // MARK: - Setting + private func setUI() { hStackView.do { $0.axis = .horizontal diff --git a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift index f58fb534..387325c1 100644 --- a/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/StackView/MarkStackView.swift @@ -68,7 +68,6 @@ final class MarkStackView: UIStackView { } func getMarkStatus(_ isHACCP: Bool, _ isVegan: Bool, _ isNONGMO: Bool) { - // else 안적었더니 초기화 실패 if !isHACCP { hccpMarkIconView.isHidden = true } else { diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift index 8884cd6f..e7449287 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift @@ -42,7 +42,7 @@ final class HomeViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - setRegister() + setRegistration() setDataSource() setReloadData() } @@ -85,7 +85,7 @@ final class HomeViewController: BaseViewController { // MARK: - Setting - private func setRegister() { + private func setRegistration() { collectionView.register(cell: HomeBakeryCollectionViewCell.self) collectionView.register(cell: HomeReviewCollectionViewCell.self) collectionView.register(cell: HomeBottomCollectionViewCell.self) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index df7ef2a7..f8bf70c2 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -9,6 +9,8 @@ import UIKit final class MyPageViewController: UIViewController { + + private let safeArea = view.safeAreaLayoutGuide override func viewDidLoad() { super.viewDidLoad() From c15d71399b17250060c90446ea6d1dffb9933887 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 21:42:57 +0900 Subject: [PATCH 106/153] [Feat] #39 - hasNotch extension added --- GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift | 4 ++++ GEON-PPANG-iOS/Global/Extensions/UI/UIScreen+.swift | 2 +- GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift index 5b54075e..6966b21f 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift @@ -21,6 +21,10 @@ extension CGFloat { return UIScreen.main.hasNotch ? hasNotch : noNotch } + func heightConsideringNotch(_ height: CGFloat) -> CGFloat { + return UIScreen.main.hasNotch ? height : height - 24 + } + /// 아이폰 13 미니(width 375)를 기준으로 레이아웃을 잡고, 기기의 width 사이즈를 곱해 대응 값을 구할 때 사용 func convertByWidthRatio(_ convert: CGFloat) -> CGFloat { return (convert / 375) * getDeviceWidth() diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/UIScreen+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/UIScreen+.swift index 0f34efec..495e321e 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/UIScreen+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/UIScreen+.swift @@ -9,6 +9,6 @@ import UIKit extension UIScreen { var hasNotch: Bool { - return !( (UIScreen.main.bounds.width / UIScreen.main.bounds.height) > 0.5 ) + return (UIScreen.main.bounds.width / UIScreen.main.bounds.height) < 0.5 } } diff --git a/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift b/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift index 837235f1..734a5851 100644 --- a/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift +++ b/GEON-PPANG-iOS/Presentation/Common/CustomNavigationBar.swift @@ -44,7 +44,7 @@ final class CustomNavigationBar: UIView { private func setLayout() { self.snp.makeConstraints { - $0.height.equalTo(118) + $0.height.equalTo(CGFloat().heightConsideringNotch(118)) } addSubview(backButton) From e758c3a92bbd812e54973126ee5b32bed7cca0cd Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 21:51:45 +0900 Subject: [PATCH 107/153] [Feat] #39 - heightConsideringBottomSafeArea method added --- GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift | 4 ++++ .../ViewControllers/FilterBreadTypeViewController.swift | 2 +- .../ViewControllers/FilterIngredientViewController.swift | 2 +- .../Filter/ViewControllers/FilterPurposeViewController.swift | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift b/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift index 6966b21f..490df32a 100644 --- a/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/UI/CGFloat+.swift @@ -25,6 +25,10 @@ extension CGFloat { return UIScreen.main.hasNotch ? height : height - 24 } + func heightConsideringBottomSafeArea(_ height: CGFloat) -> CGFloat { + return UIScreen.main.hasNotch ? height : height - 34 + } + /// 아이폰 13 미니(width 375)를 기준으로 레이아웃을 잡고, 기기의 width 사이즈를 곱해 대응 값을 구할 때 사용 func convertByWidthRatio(_ convert: CGFloat) -> CGFloat { return (convert / 375) * getDeviceWidth() diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index a35e7496..6387db91 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -75,7 +75,7 @@ final class FilterBreadTypeViewController: BaseViewController { view.addSubview(nextButton) nextButton.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(24) - $0.bottom.equalToSuperview().inset(55) + $0.bottom.equalToSuperview().inset(CGFloat().heightConsideringBottomSafeArea(55)) $0.height.equalTo(56) } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index d585f5cd..7a1d6ce3 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -74,7 +74,7 @@ final class FilterIngredientViewController: BaseViewController { view.addSubview(nextButton) nextButton.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(24) - $0.bottom.equalToSuperview().inset(55) + $0.bottom.equalToSuperview().inset(CGFloat().heightConsideringBottomSafeArea(55)) $0.height.equalTo(56) } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index e1e6603b..ac12ebc9 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -76,7 +76,7 @@ final class FilterPurposeViewController: BaseViewController { view.addSubview(nextButton) nextButton.snp.makeConstraints { $0.horizontalEdges.equalToSuperview().inset(24) - $0.bottom.equalToSuperview().inset(55) + $0.bottom.equalToSuperview().inset(CGFloat().heightConsideringBottomSafeArea(55)) $0.height.equalTo(56) } From a0c170204269fc538007358faf3dc717ed37d1f7 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Thu, 13 Jul 2023 22:19:30 +0900 Subject: [PATCH 108/153] =?UTF-8?q?[Fix]=20#36=20-=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 4 ++-- .../ViewControllers/BakeryFilterCollectionViewCell.swift | 4 ++-- .../ViewControllers/BakeryListCollectionViewCell.swift | 2 +- .../Presentation/BakeryList/Views/BakeryListTopView.swift | 2 +- .../Presentation/Common/StackView/RegionStackView.swift | 2 +- GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift | 3 +-- .../MyPage/ViewControllers/MyPageViewController.swift | 2 -- 7 files changed, 8 insertions(+), 11 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index fd823373..0850d14b 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -43,9 +43,9 @@ struct I18N { /// BakeryList struct BakeryList { static let bakeryTitle = "건빵집 리스트" - static let glutenfree = "글리텐프리" + static let glutenfree = "글루텐프리" static let nutfree = "넛프리" static let vegan = "비건빵" - static let sugar = "저당, 무설탕" + static let noSugar = "저당, 무설탕" } } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift index f0c1d986..c479a620 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryFilterCollectionViewCell.swift @@ -53,7 +53,7 @@ final class BakeryFilterCollectionViewCell: UICollectionViewCell { $0.distribution = .fillProportionally } filterTitle.do { - $0.font = .pretendardMedium(13) + $0.font = .captionM1 $0.sizeToFit() } } @@ -78,7 +78,7 @@ final class BakeryFilterCollectionViewCell: UICollectionViewCell { } func updateUI(_ isTapped: Bool) { - filterTitle.textColor = isTapped ? .black : .gbbBackground2 + filterTitle.textColor = isTapped ? .gbbGray700 : .gbbBackground2 contentView.backgroundColor = isTapped ? .gbbGray100 : .gbbMain3 contentView.makeBorder(width: 1, color: isTapped ? .gbbGray200! : .gbbMain2!) } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 59e593e0..b67344eb 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -137,7 +137,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { } if self.ingredientList[index].breadType.isSugarFree { - self.breadTypeTag.append(I18N.BakeryList.sugar) + self.breadTypeTag.append(I18N.BakeryList.noSugar) } collectionView.snp.remakeConstraints { diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift index 290b3cee..fc622b9b 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift @@ -44,7 +44,7 @@ final class BakeryListTopView: UIView { bakeryTitle.do { $0.basic(text: I18N.BakeryList.bakeryTitle, - font: .pretendardBold(26), + font: .title1!, color: .gbbGray700!) } diff --git a/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift b/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift index e225f65c..2fcbdf38 100644 --- a/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/StackView/RegionStackView.swift @@ -41,7 +41,7 @@ final class RegionStackView: UIStackView { [regionFirstTag, regionSeconodTag] .forEach { $0.makeCornerRound(radius: 14.5) - $0.font = .pretendardMedium(13) + $0.font = .captionM1 $0.backgroundColor = .gbbMain3 $0.textColor = .gbbGray100 } diff --git a/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift b/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift index 26c7013d..49693010 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift @@ -42,8 +42,7 @@ final class HomeTopView: UIView { titleLabel.do { $0.numberOfLines = 2 $0.textAlignment = .left - $0.font = .pretendardBold(26) - $0.basic(font: .pretendardBold(26), + $0.basic(font: .title1!, color: .gbbGray700!) } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index f8bf70c2..df7ef2a7 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -9,8 +9,6 @@ import UIKit final class MyPageViewController: UIViewController { - - private let safeArea = view.safeAreaLayoutGuide override func viewDidLoad() { super.viewDidLoad() From f65151ba80229e29437b2fb523ba0ba9734e17a5 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 22:29:00 +0900 Subject: [PATCH 109/153] [Fix] #31 - review applied - 1 --- GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift index a8a1394f..d42391f0 100644 --- a/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift +++ b/GEON-PPANG-iOS/Presentation/Common/View/BottomView.swift @@ -27,10 +27,7 @@ final class BottomView: UIView { } // MARK: - Setting - // 16 - // 56 - // 16 -> 32 - // 24 + private func setLayout() { self.snp.makeConstraints { $0.height.equalTo(128) From 49cb684697518cd6eda902b86a76a4eb79a19aba Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 22:30:24 +0900 Subject: [PATCH 110/153] [Feat] #31 - review applied - 2 --- .../OptionsCollectionViewCell.swift | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift index 13031e7c..54d7dd36 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/View/OptionsCollection/OptionsCollectionViewCell.swift @@ -113,16 +113,4 @@ final class OptionsCollectionViewCell: UICollectionViewCell { } } -// func toggleCellSelection() { -// self.status = isSelected ? .selected : .deselected -// configureCell(to: self.status) -// } - -// func toggleCellInteraction() { -// self.status = isEnabled ? .deselected : .disabled -// self.isUserInteractionEnabled = isEnabled ? true : false -// self.isUserInteractionEnabled.toggle() -// configureCell(to: status) -// } - } From 12695e7e33e46a083eca4dc1abac02dec1936675 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Thu, 13 Jul 2023 22:32:36 +0900 Subject: [PATCH 111/153] [Feat] #31 - review applied - 3 --- .../ViewController/WriteReviewViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 6eb11dbf..938bc6ce 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -174,13 +174,13 @@ final class WriteReviewViewController: BaseViewController { } likeCollectionViewHeaderLabel.do { - $0.text = "건빵집은 어떠셨나요?" + $0.text = I18N.WriteReview.likeOptionTitle $0.font = .bodyB1 $0.textColor = .black } optionsCollectionViewHeaderLabel.do { - $0.text = "어떤것을 추천하나요?" + $0.text = I18N.WriteReview.optionTitle $0.font = .bodyB1 $0.textColor = .gbbGray300 } From 5987d45b1beb67a57ab1392b579b9ade22b41dba Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 13:15:17 +0900 Subject: [PATCH 112/153] =?UTF-8?q?[Fix]=20#40=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HomeBottomCollectionViewCell.swift | 2 +- .../EmptyCollectionViewCell.swift | 6 +-- .../SearchViewController.swift | 44 ++++++++++++++----- .../Search/Views/SearchResultView.swift | 4 +- 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift index 2c3da14e..735a494e 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift @@ -42,7 +42,7 @@ final class HomeBottomCollectionViewCell: UICollectionViewCell { $0.textAlignment = .left $0.numberOfLines = 0 $0.basic(text: I18N.Home.bottomSectionTitle, - font: .pretendardMedium(11), + font: .captionM2!, color: .gbbGray300!) } diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift index ae18c79d..636d07b4 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift @@ -81,7 +81,7 @@ final class EmptyCollectionViewCell: UICollectionViewCell { emptyLabel.do { $0.numberOfLines = 0 $0.textAlignment = .center - $0.basic(font: .pretendardBold(20), color: .gbbGray300!) + $0.basic(font: .title2!, color: .gbbGray300!) } } @@ -92,9 +92,9 @@ final class EmptyCollectionViewCell: UICollectionViewCell { switch type { case .initialize, .noBookMark, .noReview: - return emptyLabel.basic(text: emptyType.rawValue, font: .pretendardBold(20), color: .gbbGray300!) + return emptyLabel.basic(text: emptyType.rawValue, font: .title2!, color: .gbbGray300!) case .noSearch: - return emptyLabel.partFontChange(targetString: "다른 키워드로 검색해보세요!", font: .pretendardMedium(15)) + return emptyLabel.partFontChange(targetString: "다른 키워드로 검색해보세요!", font: .subHead!) } } diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift index b00590b4..af5b0c00 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift @@ -21,7 +21,8 @@ final class SearchViewController: BaseViewController { typealias Item = AnyHashable typealias DataSource = UICollectionViewDiffableDataSource private var dataSource: DataSource? - private let bakeryList: [HomeBestBakeryResponseDTO] = HomeBestBakeryResponseDTO.item + private var searchList: [SearchResponseDTO] = SearchResponseDTO.item + private var searchBakeryList: [SearchBakeryList] = SearchBakeryList.searchBakeryItem private var currentSection: [Section] = [.initial] // MARK: - UI Property @@ -30,16 +31,18 @@ final class SearchViewController: BaseViewController { private let searchResultView = SearchResultView() private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) - // MARK: - Setting + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - setRegister() - setupDataSource() + setRegistration() + setDataSource() setReloadData() } + // MARK: - Setting + override func touchesBegan(_ touches: Set, with event: UIEvent?) { self.view.endEditing(true) @@ -83,13 +86,13 @@ final class SearchViewController: BaseViewController { } } - private func setRegister() { + private func setRegistration() { collectionView.register(cell: EmptyCollectionViewCell.self) - collectionView.register(cell: SearchCollectionViewCell.self) + collectionView.register(cell: BakeryListCollectionViewCell.self) } - private func setupDataSource() { - dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, _ in + private func setDataSource() { + dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in let section = self.dataSource?.snapshot().sectionIdentifiers[indexPath.section] switch section { case .initial: @@ -101,7 +104,22 @@ final class SearchViewController: BaseViewController { cell.getViewType(.noSearch) return cell case .main, .none: - let cell: SearchCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.defaultType) + if let searchBakeryItem = item as? SearchBakeryList { + let bakeryListProtocols = BakeryListProtocols( + bakeryName: searchBakeryItem.bakeryName, + bookmarkCount: searchBakeryItem.bookmarkCount, + isBooked: searchBakeryItem.isBooked, + isHACCP: searchBakeryItem.isHACCP, + isVegan: searchBakeryItem.isVegan, + isNonGMO: searchBakeryItem.isNonGMO, + firstNearStation: searchBakeryItem.firstNearStation, + secondNearStation: searchBakeryItem.secondNearStation ?? "", + breadType: searchBakeryItem.breadType + ) + cell.updateUI(data: bakeryListProtocols, index: indexPath.item) + } return cell } }) @@ -114,16 +132,18 @@ final class SearchViewController: BaseViewController { snapshot.appendItems([0]) } - private func setDataSource(data: [HomeBestBakeryResponseDTO]) { + private func updateDataSource(data: SearchResponseDTO) { guard var snapshot = dataSource?.snapshot() else { return } - if data.count == 0 { + if data.resultCount == 0 { + searchResultView.isHidden = true snapshot.deleteSections(currentSection) snapshot.appendItems([0], toSection: .empty) currentSection = [.empty] dataSource?.apply(snapshot) } else { + searchResultView.isHidden = false snapshot.deleteSections(currentSection) - snapshot.appendItems(bakeryList, toSection: .main) + snapshot.appendItems(searchBakeryList, toSection: .main) currentSection = [.main] dataSource?.apply(snapshot) } diff --git a/GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift b/GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift index d11fe828..1f32a154 100644 --- a/GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift +++ b/GEON-PPANG-iOS/Presentation/Search/Views/SearchResultView.swift @@ -11,9 +11,7 @@ import SnapKit import Then final class SearchResultView: UIView { - - // MARK: - Property - + // MARK: - UI Property private let resultLabel = UILabel() From c8bfe20455a9b848df2bc2772b4932a306ecf3c1 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 13:22:44 +0900 Subject: [PATCH 113/153] =?UTF-8?q?[Remove]=20#40=20-=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Protocol/Protocol.swift | 8 -------- .../SearchCollectionViewCell.swift | 15 --------------- 2 files changed, 23 deletions(-) delete mode 100644 GEON-PPANG-iOS/Global/Protocol/Protocol.swift delete mode 100644 GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift diff --git a/GEON-PPANG-iOS/Global/Protocol/Protocol.swift b/GEON-PPANG-iOS/Global/Protocol/Protocol.swift deleted file mode 100644 index 924a7429..00000000 --- a/GEON-PPANG-iOS/Global/Protocol/Protocol.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// Protocol.swift -// GEON-PPANG-iOS -// -// Created by JEONGEUN KIM on 2023/07/09. -// - -import Foundation diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift deleted file mode 100644 index ec492c88..00000000 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchCollectionViewCell.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// SearchCollectionViewCell.swift -// GEON-PPANG-iOS -// -// Created by JEONGEUN KIM on 2023/07/12. -// - -import UIKit - -import SnapKit -import Then - -final class SearchCollectionViewCell: UICollectionViewCell { - -} From 9d36d8fd165ee62ff68f06ebc36d1e8efa0f6fc0 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 13:25:50 +0900 Subject: [PATCH 114/153] =?UTF-8?q?[Feat]=20#40=20-=20search=20=EB=8D=94?= =?UTF-8?q?=EB=AF=B8=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Search/Model/SearchResponseDTO.swift | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift diff --git a/GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift b/GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift new file mode 100644 index 00000000..9651fd88 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift @@ -0,0 +1,43 @@ +// +// SearchResponseDTO.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/14. +// + +import Foundation + +// MARK: - SearchResponseDTO + +struct SearchResponseDTO: Hashable { + let resultCount: Int + let bakeryList: [SearchBakeryList] +} + +// MARK: - SearchBakeryList + +struct SearchBakeryList: Hashable, BakeryListProtocol { + let bakeryID: Int + let bakeryName: String + let isHACCP: Bool + let isVegan: Bool + let isNonGMO: Bool + var breadType: BreadType + let firstNearStation: String + var secondNearStation: String? + let isBooked: Bool + let bookmarkCount: Int + let bakeryPicture: String +} + +extension SearchResponseDTO { + static let item: [SearchResponseDTO] = [SearchResponseDTO(resultCount: 0, bakeryList: SearchBakeryList.searchBakeryItem)] +} + +extension SearchBakeryList { + static let searchBakeryItem: [SearchBakeryList] = [SearchBakeryList(bakeryID: 1, bakeryName: "히히히히", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .searchBreadType, firstNearStation: "헤헤", secondNearStation: "두번째역", isBooked: true, bookmarkCount: 5, bakeryPicture: "")] +} + +extension BreadType { + static let searchBreadType: BreadType = BreadType(breadTypeID: 3, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: false, isSugarFree: true) +} From 7ec30c1b7424c14d41bda058a8f5834291537cb0 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 13:26:10 +0900 Subject: [PATCH 115/153] =?UTF-8?q?[Add]=20#40=20-=20=EB=A6=AC=ED=84=B0?= =?UTF-8?q?=EB=9F=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Literals/Strings.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 0850d14b..852cf0eb 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -47,5 +47,6 @@ struct I18N { static let nutfree = "넛프리" static let vegan = "비건빵" static let noSugar = "저당, 무설탕" + static let defaultFilter = "기본순" } } From b7439103c6d782f7cbba639633ee40defba01b1e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 13:27:14 +0900 Subject: [PATCH 116/153] =?UTF-8?q?[Feat]=20#40=20-=20bakeryType=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=86=A0=EC=BD=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 54 +++++++++++-------- .../Global/Protocol/BakeryTypeProtocol.swift | 46 ++++++++++++++++ 2 files changed, 77 insertions(+), 23 deletions(-) create mode 100644 GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index eadbba19..ceffe8cc 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -44,6 +44,8 @@ 097682E72A5CF0080008F4FB /* BakeryFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */; }; 097682E92A5D0B6B0008F4FB /* BakeryListTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */; }; 097682EB2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */; }; + 098716B42A6061F500538D05 /* SearchResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 098716B32A6061F500538D05 /* SearchResponseDTO.swift */; }; + 098716B62A60F52200538D05 /* BakeryTypeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 098716B52A60F52200538D05 /* BakeryTypeProtocol.swift */; }; 0987288D2A5BA1F000A29402 /* BookmarkButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */; }; 098F32EA2A4200FE0092D09A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 098F32E92A4200FE0092D09A /* Assets.xcassets */; }; 098F32ED2A4200FE0092D09A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 098F32EB2A4200FE0092D09A /* LaunchScreen.storyboard */; }; @@ -55,7 +57,6 @@ 09B13F562A59410C00C0C723 /* CALayer+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B13F552A59410C00C0C723 /* CALayer+.swift */; }; 09B13F582A59433500C0C723 /* TabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B13F572A59433500C0C723 /* TabBarItem.swift */; }; 09B13F5A2A5946B700C0C723 /* TabBar+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B13F592A5946B700C0C723 /* TabBar+.swift */; }; - 09B71BFC2A59CF3E00076AC2 /* Protocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B71BFB2A59CF3E00076AC2 /* Protocol.swift */; }; 09B71C002A59D50900076AC2 /* HomeTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B71BFF2A59D50900076AC2 /* HomeTopView.swift */; }; 09B71C022A59D99200076AC2 /* SearchTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09B71C012A59D99200076AC2 /* SearchTextField.swift */; }; 09C6264E2A5B29F8002C8110 /* SearchEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09C6264D2A5B29F8002C8110 /* SearchEnum.swift */; }; @@ -66,16 +67,15 @@ 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3EFB2A569E4A0063897A /* URLConstant.swift */; }; 09CA3F062A569EB30063897A /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F052A569EB30063897A /* API.swift */; }; 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; + 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */; }; + 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C92A5DD38D002020BD /* SearchResultView.swift */; }; + 09FD47D22A5DF892002020BD /* EmptyCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */; }; 3E16E4F52A57CF3800B813D0 /* WriteReviewDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */; }; 3E16E4FA2A57D1F400B813D0 /* RecommendationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */; }; 3E16E4FC2A57D24900B813D0 /* LikeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */; }; 3E16E4FE2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */; }; 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; - 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */; }; - 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47C92A5DD38D002020BD /* SearchResultView.swift */; }; - 09FD47D02A5DEE9E002020BD /* SearchCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47CF2A5DEE9E002020BD /* SearchCollectionViewCell.swift */; }; - 09FD47D22A5DF892002020BD /* EmptyCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */; }; @@ -125,6 +125,8 @@ 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterView.swift; sourceTree = ""; }; 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListTopView.swift; sourceTree = ""; }; 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListCollectionViewCell.swift; sourceTree = ""; }; + 098716B32A6061F500538D05 /* SearchResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResponseDTO.swift; sourceTree = ""; }; + 098716B52A60F52200538D05 /* BakeryTypeProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryTypeProtocol.swift; sourceTree = ""; }; 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkButton.swift; sourceTree = ""; }; 098F32DD2A4200FD0092D09A /* GEON-PPANG-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GEON-PPANG-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 098F32E02A4200FD0092D09A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -140,7 +142,6 @@ 09B13F552A59410C00C0C723 /* CALayer+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CALayer+.swift"; sourceTree = ""; }; 09B13F572A59433500C0C723 /* TabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarItem.swift; sourceTree = ""; }; 09B13F592A5946B700C0C723 /* TabBar+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TabBar+.swift"; sourceTree = ""; }; - 09B71BFB2A59CF3E00076AC2 /* Protocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Protocol.swift; sourceTree = ""; }; 09B71BFF2A59D50900076AC2 /* HomeTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTopView.swift; sourceTree = ""; }; 09B71C012A59D99200076AC2 /* SearchTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTextField.swift; sourceTree = ""; }; 09C6264D2A5B29F8002C8110 /* SearchEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchEnum.swift; sourceTree = ""; }; @@ -151,16 +152,15 @@ 09CA3EFB2A569E4A0063897A /* URLConstant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLConstant.swift; sourceTree = ""; }; 09CA3F052A569EB30063897A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; + 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; + 09FD47C92A5DD38D002020BD /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; + 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCollectionViewCell.swift; sourceTree = ""; }; 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewDTO.swift; sourceTree = ""; }; 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendationModel.swift; sourceTree = ""; }; 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikeModel.swift; sourceTree = ""; }; 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewFlowLayout.swift; sourceTree = ""; }; 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewHeader.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; - 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; - 09FD47C92A5DD38D002020BD /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; - 09FD47CF2A5DEE9E002020BD /* SearchCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCollectionViewCell.swift; sourceTree = ""; }; - 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCollectionViewCell.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewViewController.swift; sourceTree = ""; }; @@ -270,6 +270,7 @@ 093214032A5AE3C000875EF6 /* Search */ = { isa = PBXGroup; children = ( + 098716B22A603A8500538D05 /* Model */, 09FD47C62A5DC97E002020BD /* Views */, 093214052A5AE3D600875EF6 /* ViewControllers */, ); @@ -280,7 +281,6 @@ isa = PBXGroup; children = ( 093214072A5AE40900875EF6 /* SearchViewController.swift */, - 09FD47CF2A5DEE9E002020BD /* SearchCollectionViewCell.swift */, 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */, ); path = ViewControllers; @@ -440,6 +440,14 @@ path = Views; sourceTree = ""; }; + 098716B22A603A8500538D05 /* Model */ = { + isa = PBXGroup; + children = ( + 098716B32A6061F500538D05 /* SearchResponseDTO.swift */, + ); + path = Model; + sourceTree = ""; + }; 098F32D42A4200FD0092D09A = { isa = PBXGroup; children = ( @@ -545,11 +553,20 @@ 09CA3EF62A56738A0063897A /* Protocol */ = { isa = PBXGroup; children = ( - 09B71BFB2A59CF3E00076AC2 /* Protocol.swift */, + 098716B52A60F52200538D05 /* BakeryTypeProtocol.swift */, ); path = Protocol; sourceTree = ""; }; + 09FD47C62A5DC97E002020BD /* Views */ = { + isa = PBXGroup; + children = ( + 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */, + 09FD47C92A5DD38D002020BD /* SearchResultView.swift */, + ); + path = Views; + sourceTree = ""; + }; 3E16E4F22A57CE2B00B813D0 /* Model */ = { isa = PBXGroup; children = ( @@ -593,15 +610,6 @@ path = Model; sourceTree = ""; }; - 09FD47C62A5DC97E002020BD /* Views */ = { - isa = PBXGroup; - children = ( - 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */, - 09FD47C92A5DD38D002020BD /* SearchResultView.swift */, - ); - path = Views; - sourceTree = ""; - }; 3E79B19B2A54523400D36A26 /* Button */ = { isa = PBXGroup; children = ( @@ -868,9 +876,9 @@ 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */, 0987288D2A5BA1F000A29402 /* BookmarkButton.swift in Sources */, 090556202A51DB2C00752067 /* UIImage+.swift in Sources */, - 09B71BFC2A59CF3E00076AC2 /* Protocol.swift in Sources */, 0905562D2A51DBE700752067 /* UILabel+.swift in Sources */, 090556252A51DB9600752067 /* UICollectionView+.swift in Sources */, + 098716B62A60F52200538D05 /* BakeryTypeProtocol.swift in Sources */, 09B13F582A59433500C0C723 /* TabBarItem.swift in Sources */, 09B13F502A593CB800C0C723 /* BakeryListViewController.swift in Sources */, 093214022A5AE27800875EF6 /* Utils.swift in Sources */, @@ -892,12 +900,12 @@ 3E79B1B52A571E7100D36A26 /* OptionsCollectionViewCell.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 097682E52A5C99340008F4FB /* BakeryFilterItems.swift in Sources */, + 098716B42A6061F500538D05 /* SearchResponseDTO.swift in Sources */, 09FD47D22A5DF892002020BD /* EmptyCollectionViewCell.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */, 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */, 3E16E4F52A57CF3800B813D0 /* WriteReviewDTO.swift in Sources */, - 09FD47D02A5DEE9E002020BD /* SearchCollectionViewCell.swift in Sources */, 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift new file mode 100644 index 00000000..8182d7e8 --- /dev/null +++ b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift @@ -0,0 +1,46 @@ +// +// BakeryTypeProtocol.swift +// GEON-PPANG-iOS +// +// Created by JEONGEUN KIM on 2023/07/14. +// + +import Foundation + +protocol BakeryTypeProtocol { + var isGlutenFree: Bool { get } + var isNutFree: Bool { get } + var isVegan: Bool { get } + var isSugarFree: Bool { get } +} + +protocol BakeryListProtocol { + var bakeryName: String { get } + var bookmarkCount: Int { get } + var isBooked: Bool { get } + + var isHACCP: Bool { get } + var isVegan: Bool { get } + var isNonGMO: Bool { get } + + var firstNearStation: String { get } + var secondNearStation: String? { get } + + var breadType: BreadType { get } +} + +struct BakeryListProtocols: BakeryListProtocol { + var bakeryName: String + var bookmarkCount: Int + var isBooked: Bool + + var isHACCP: Bool + var isVegan: Bool + var isNonGMO: Bool + + var firstNearStation: String + var secondNearStation: String? = "" + + var breadType: BreadType + +} From aa7e69f3a076c51329305d26e8ec1e88cf84a15d Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 13:28:01 +0900 Subject: [PATCH 117/153] =?UTF-8?q?[Fix]=20#40=20-=20BakeryList=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20UI=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BakeryListCollectionViewCell.swift | 50 +++++++++---------- .../BakeryListViewController.swift | 17 ++++++- .../Model/BakeryListResponseDTO.swift | 3 +- 3 files changed, 42 insertions(+), 28 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index b67344eb..7781fb25 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -109,12 +109,12 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { } } - func updateUI(data: BakeryListResponseDTO, index: Int) { + func updateUI(data: T, index: Int) { self.index = index bakeryTitle.text = data.bakeryName bookMarkButton.getCount(data.bookmarkCount) bookMarkButton.updateData = { [weak self] status in - guard let self = self else { return } + guard let self = self else { return } self.updateData?(status, self.index) } bookMarkButton.isSelected = data.isBooked @@ -123,38 +123,38 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { regionStackView.removeSecondRegion() } regionStackView.getRegionName(data.firstNearStation, data.secondNearStation ?? "") - - if self.ingredientList[index].breadType.isGlutenFree { - self.breadTypeTag.append(I18N.BakeryList.glutenfree) + + if data.breadType.isGlutenFree { + breadTypeTag.append(I18N.BakeryList.glutenfree) } - - if self.ingredientList[index].breadType.isNutFree { - self.breadTypeTag.append(I18N.BakeryList.nutfree) + + if data.breadType.isNutFree { + breadTypeTag.append(I18N.BakeryList.nutfree) } - - if self.ingredientList[index].breadType.isVegan { - self.breadTypeTag.append(I18N.BakeryList.vegan) + + if data.breadType.isVegan { + breadTypeTag.append(I18N.BakeryList.vegan) } - - if self.ingredientList[index].breadType.isSugarFree { - self.breadTypeTag.append(I18N.BakeryList.noSugar) + + if data.breadType.isSugarFree { + breadTypeTag.append(I18N.BakeryList.noSugar) } - + collectionView.snp.remakeConstraints { - $0.height.equalTo(getHeight(self.breadTypeTag)) + $0.height.equalTo(getHeight(breadTypeTag)) $0.top.equalTo(bakeryTitle.snp.bottom).offset(10) $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) $0.trailing.equalToSuperview().offset(-70) } } - + func getViewType(_ type: BakeryViewType) { bakeryViewType = type } - + func defaultViewButton() { addSubview(bookMarkButton) - + bookMarkButton.do { $0.configuration?.imagePlacement = NSDirectionalRectEdge.top $0.configuration?.imagePadding = 4 @@ -163,27 +163,27 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { print("default") }, for: .touchUpInside) } - + bookMarkButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.trailing.equalToSuperview().offset(-24) $0.size.equalTo(34) } } - + func getHeight(_ list: [String]) -> CGFloat { var width: CGFloat = 0 list.forEach { width += $0.size(withAttributes: [NSAttributedString.Key.font: UIFont.pretendardMedium(13)]).width + 4 } width -= 4 - + return width < (UIScreen.main.bounds.width - 206) ? 25 : 60 } - + func reviewViewButton() { addSubview(arrowButton) - + regionStackView.getBackgroundColor(.gbbGray700!) arrowButton.do { $0.setImage(.rightArrowIcon, for: .normal) @@ -191,7 +191,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { print("review") }, for: .touchUpInside) } - + arrowButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.trailing.equalToSuperview().offset(-12) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index 4e1baf1c..42b091b4 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -75,7 +75,7 @@ final class BakeryListViewController: BaseViewController { var config = UICollectionLayoutListConfiguration(appearance: .plain) config.backgroundColor = .clear config.showsSeparators = true - + let layout = UICollectionViewCompositionalLayout.list(using: config) return layout } @@ -84,7 +84,20 @@ final class BakeryListViewController: BaseViewController { dataSource = DataSource(collectionView: bakeryListCollectionView, cellProvider: { collectionView, indexPath, item in let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.getViewType(.defaultType) - cell.updateUI(data: item, index: indexPath.item) + if let bakeryListItem = item as? BakeryListResponseDTO { + let bakeryListProtocols = BakeryListProtocols( + bakeryName: bakeryListItem.bakeryName, + bookmarkCount: bakeryListItem.bookmarkCount, + isBooked: bakeryListItem.isBooked, + isHACCP: bakeryListItem.isHACCP, + isVegan: bakeryListItem.isVegan, + isNonGMO: bakeryListItem.isNonGMO, + firstNearStation: bakeryListItem.firstNearStation, + secondNearStation: bakeryListItem.secondNearStation ?? "", + breadType: bakeryListItem.breadType + ) + cell.updateUI(data: bakeryListProtocols, index: indexPath.item) + } return cell }) } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index fad727b5..d886f93e 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -6,6 +6,7 @@ // // MARK: - BakeryListResponseDTO + struct BakeryListResponseDTO: Hashable { let bakeryID: Int let bakeryName: String @@ -22,7 +23,7 @@ struct BakeryListResponseDTO: Hashable { // MARK: - BreadType -struct BreadType: Hashable { +struct BreadType: Hashable, BakeryTypeProtocol { let breadTypeID: Int let breadTypeName: String let isGlutenFree: Bool From 7f5b265ceb6db54c8181ddba4e4bc422792a1c61 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 13:28:26 +0900 Subject: [PATCH 118/153] =?UTF-8?q?[Fix]=20#40=20-=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Presentation/BakeryList/Views/BakeryFilterView.swift | 3 ++- .../Presentation/BakeryList/Views/BakeryListTopView.swift | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift index 5622a2a9..199029ac 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryFilterView.swift @@ -61,7 +61,8 @@ final class BakeryFilterView: UIView { $0.configuration?.background.strokeColor = .gbbGray200 $0.configuration?.baseForegroundColor = .black $0.configuration?.image = .swapIcon - $0.configuration?.attributedTitle = AttributedString("기본순", attributes: AttributeContainer([.font: UIFont.pretendardBold(13)])) + $0.configuration?.attributedTitle = AttributedString(I18N.BakeryList.defaultFilter, + attributes: AttributeContainer([.font: UIFont.pretendardBold(13)])) $0.configuration?.cornerStyle = .capsule $0.configuration?.imagePadding = 5 $0.configuration?.contentInsets = .zero diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift index fc622b9b..3e6a98bc 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift @@ -19,7 +19,6 @@ final class BakeryListTopView: UIView { private let bakeryIcon = UIImageView() private let searchButton = UIButton() - // MARK: - Life Cycle override init(frame: CGRect) { From fa92efb950d2f568e3eeeb1b183c8efa5cb43add Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 16:11:17 +0900 Subject: [PATCH 119/153] =?UTF-8?q?[Feat]=20#42=20-=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20UI=20=EB=A1=9C=EC=A7=81=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 --- .../BakeryList/Views/BakeryListTopView.swift | 3 +- .../MySavedBakeryViewController.swift | 58 ++++++++++++++++++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift index fc622b9b..c58c5850 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift @@ -18,8 +18,7 @@ final class BakeryListTopView: UIView { private let bakeryTitle = UILabel() private let bakeryIcon = UIImageView() private let searchButton = UIButton() - - + // MARK: - Life Cycle override init(frame: CGRect) { diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index b221596c..ac0cd0c7 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -13,22 +13,47 @@ import Then final class MySavedBakeryViewController: BaseViewController { // MARK: - Property + + enum Section { + case main + } + typealias DataSource = UICollectionViewDiffableDataSource + private var dataSource: DataSource? + private var filterlist: [BakeryListResponseDTO] = BakeryListResponseDTO.item private lazy var safeArea = self.view.safeAreaLayoutGuide // MARK: - UI Property private let naviView = CustomNavigationBar() - + private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) + + // MARK: - Life Cycle + + override func viewDidLoad() { + super.viewDidLoad() + + setRegistration() + setupDataSource() + setReloadData() + } + // MARK: - Setting override func setLayout() { - view.addSubview(naviView) + view.addSubviews(naviView, collectionView) naviView.snp.makeConstraints { $0.top.equalToSuperview() $0.directionalHorizontalEdges.equalTo(safeArea) } + + collectionView.snp.makeConstraints { + $0.top.equalTo(naviView.snp.bottom) + $0.directionalHorizontalEdges.equalTo(safeArea) + $0.bottom.equalToSuperview() + + } } override func setUI() { @@ -39,4 +64,33 @@ final class MySavedBakeryViewController: BaseViewController { $0.configureLeftTitle(to: I18N.MySavedBakery.naviTitle) } } + + private func setRegistration() { + collectionView.register(cell: BakeryListCollectionViewCell.self) + } + + private func layout() -> UICollectionViewLayout { + var config = UICollectionLayoutListConfiguration(appearance: .plain) + config.backgroundColor = .clear + config.showsSeparators = true + + let layout = UICollectionViewCompositionalLayout.list(using: config) + return layout + } + + private func setupDataSource() { + dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in + let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.defaultType) + cell.updateUI(data: item, index: indexPath.item) + return cell + }) + } + + private func setReloadData() { + var snapshot = NSDiffableDataSourceSnapshot() + defer { dataSource?.apply(snapshot, animatingDifferences: false)} + snapshot.appendSections([.main]) + snapshot.appendItems(filterlist) + } } From ceee6377d8abe5a470b79c44bb773dd4d8270304 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Fri, 14 Jul 2023 19:08:04 +0900 Subject: [PATCH 120/153] [Feat] #51 - mypageDTO added --- GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift | 8 +++++ .../Presentation/MyPage/Model/MyPageDTO.swift | 28 ++++++++++++++++++ .../MyPage/View/ImageWithSubtitleButton.swift | 8 +++++ .../View/MyPageCollectionViewCell.swift | 8 +++++ .../View/MyPageCollectionViewFooter.swift | 8 +++++ .../View/MyPageCollectionViewHeader.swift | 8 +++++ .../MyPage/View/MyPagePurposeChipView.swift | 8 +++++ .../icons/ic_profile.imageset/Contents.json | 23 ++++++++++++++ .../ic_profile.imageset/ic_profile 1.png | Bin 0 -> 1426 bytes .../ic_profile.imageset/ic_profile 2.png | Bin 0 -> 2065 bytes .../icons/ic_profile.imageset/ic_profile.png | Bin 0 -> 755 bytes 11 files changed, 99 insertions(+) create mode 100644 GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift create mode 100644 GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift create mode 100644 GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift create mode 100644 GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift create mode 100644 GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift create mode 100644 GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift create mode 100644 GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/Contents.json create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/ic_profile 1.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/ic_profile 2.png create mode 100644 GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/ic_profile.png diff --git a/GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift b/GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift new file mode 100644 index 00000000..93cc3c2c --- /dev/null +++ b/GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift @@ -0,0 +1,8 @@ +// +// MyPageEnum.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift b/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift new file mode 100644 index 00000000..eac72564 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift @@ -0,0 +1,28 @@ +// +// MyPageDTO.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation + +struct MyPageDTO: Codable { + let memberNickname: String + let mainPurpose: String + let breadType: BreadType +} + +extension MyPageDTO { + + static func dummyData() -> MyPageDTO { + return .init(memberNickname: "Id", + mainPurpose: "HEALTH", + breadType: .init(breadTypeID: 1, + breadTypeName: "맛 • 다이어트", + isGlutenFree: true, + isVegan: true, + isNutFree: true, + isSugarFree: true)) + } +} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift new file mode 100644 index 00000000..c62d8966 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift @@ -0,0 +1,8 @@ +// +// ButtonWithSubtitleView.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift new file mode 100644 index 00000000..7bac6a38 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift @@ -0,0 +1,8 @@ +// +// MyPageCollectionViewCell.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift new file mode 100644 index 00000000..146d19fb --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift @@ -0,0 +1,8 @@ +// +// MyPageCollectionViewFooter.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift new file mode 100644 index 00000000..3eee5531 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -0,0 +1,8 @@ +// +// MyPageCollectionViewHeader.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift new file mode 100644 index 00000000..c0fc0868 --- /dev/null +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift @@ -0,0 +1,8 @@ +// +// MyPagePurposeChipView.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/Contents.json b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/Contents.json new file mode 100644 index 00000000..9480cc23 --- /dev/null +++ b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_profile.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_profile 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_profile 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/ic_profile 1.png b/GEON-PPANG-iOS/Resource/Assets/Assets.xcassets/icons/ic_profile.imageset/ic_profile 1.png new file mode 100644 index 0000000000000000000000000000000000000000..282f1c8ef0fab945c44f5b02c3372faef6f4a0a7 GIT binary patch literal 1426 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 literal 0 HcmV?d00001 From 5e1d457a7d2bca4b23402be13e763dab98ac857f Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Fri, 14 Jul 2023 19:08:58 +0900 Subject: [PATCH 121/153] [Feat] #51 - myPageUI in progress --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 44 ++++ GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift | 8 - .../Global/Enum/MyPageSectionEnum.swift | 22 ++ .../Global/Extensions/Design/UIImage+.swift | 1 + GEON-PPANG-iOS/Global/Literals/Strings.swift | 12 + GEON-PPANG-iOS/Global/Utils/Utils.swift | 8 + .../Model/BakeryListResponseDTO.swift | 2 +- .../Cell/DescriptionCollectionViewCell.swift | 2 +- .../MyPage/View/ImageWithSubtitleButton.swift | 93 +++++++- .../View/MyPageCollectionViewCell.swift | 70 +++++- .../View/MyPageCollectionViewFooter.swift | 62 ++++- .../View/MyPageCollectionViewHeader.swift | 213 +++++++++++++++++- .../MyPage/View/MyPagePurposeChipView.swift | 57 ++++- .../MyPageViewController.swift | 140 +++++++++++- 14 files changed, 717 insertions(+), 17 deletions(-) delete mode 100644 GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift create mode 100644 GEON-PPANG-iOS/Global/Enum/MyPageSectionEnum.swift diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index f97b9818..41a56037 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -72,6 +72,9 @@ 3E16E4FE2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */; }; 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; + 3E452B672A60E68000EA456D /* MyPageDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E452B662A60E68000EA456D /* MyPageDTO.swift */; }; + 3E452B692A60FF7900EA456D /* MyPageCollectionViewFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E452B682A60FF7900EA456D /* MyPageCollectionViewFooter.swift */; }; + 3E452B6B2A614AAE00EA456D /* ImageWithSubtitleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E452B6A2A614AAD00EA456D /* ImageWithSubtitleButton.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */; }; @@ -82,6 +85,10 @@ 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1E92A541AEB003516A3 /* CustomNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */; }; 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */; }; + 3ED40E002A608B4700C7D5DA /* MyPageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */; }; + 3ED40E022A608B8600C7D5DA /* MyPageSectionEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40E012A608B8600C7D5DA /* MyPageSectionEnum.swift */; }; + 3ED40E042A608EF000C7D5DA /* MyPageCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */; }; + 3ED40E062A60916000C7D5DA /* MyPagePurposeChipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */; }; DF959A612A539FBE00E75774 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */; }; DF959A622A539FBE00E75774 /* Pretendard-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */; }; DF959A6C2A568C4600E75774 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DF959A6B2A568C4600E75774 /* Colors.xcassets */; }; @@ -153,6 +160,9 @@ 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewFlowLayout.swift; sourceTree = ""; }; 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewHeader.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; + 3E452B662A60E68000EA456D /* MyPageDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageDTO.swift; sourceTree = ""; }; + 3E452B682A60FF7900EA456D /* MyPageCollectionViewFooter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewFooter.swift; sourceTree = ""; }; + 3E452B6A2A614AAD00EA456D /* ImageWithSubtitleButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageWithSubtitleButton.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewViewController.swift; sourceTree = ""; }; @@ -163,6 +173,10 @@ 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeLiteral.swift; sourceTree = ""; }; + 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewCell.swift; sourceTree = ""; }; + 3ED40E012A608B8600C7D5DA /* MyPageSectionEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageSectionEnum.swift; sourceTree = ""; }; + 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewHeader.swift; sourceTree = ""; }; + 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPagePurposeChipView.swift; sourceTree = ""; }; DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; DF959A602A539FBE00E75774 /* Pretendard-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Medium.otf"; sourceTree = ""; }; DF959A6B2A568C4600E75774 /* Colors.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Colors.xcassets; sourceTree = ""; }; @@ -509,6 +523,8 @@ 09B13F512A593CC200C0C723 /* MyPage */ = { isa = PBXGroup; children = ( + 3ED40DFD2A608B2F00C7D5DA /* Model */, + 3ED40DFC2A608B2B00C7D5DA /* View */, 09B13F522A593CC800C0C723 /* ViewControllers */, ); path = MyPage; @@ -646,11 +662,32 @@ path = Base; sourceTree = ""; }; + 3ED40DFC2A608B2B00C7D5DA /* View */ = { + isa = PBXGroup; + children = ( + 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */, + 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */, + 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */, + 3E452B682A60FF7900EA456D /* MyPageCollectionViewFooter.swift */, + 3E452B6A2A614AAD00EA456D /* ImageWithSubtitleButton.swift */, + ); + path = View; + sourceTree = ""; + }; + 3ED40DFD2A608B2F00C7D5DA /* Model */ = { + isa = PBXGroup; + children = ( + 3E452B662A60E68000EA456D /* MyPageDTO.swift */, + ); + path = Model; + sourceTree = ""; + }; DF959A672A56851000E75774 /* Enum */ = { isa = PBXGroup; children = ( 09C6264D2A5B29F8002C8110 /* SearchEnum.swift */, 09B13F572A59433500C0C723 /* TabBarItem.swift */, + 3ED40E012A608B8600C7D5DA /* MyPageSectionEnum.swift */, ); path = Enum; sourceTree = ""; @@ -806,7 +843,9 @@ 0915C1702A5C3C5600ACB8D4 /* RegionStackView.swift in Sources */, 3E16E4FC2A57D24900B813D0 /* LikeModel.swift in Sources */, 3E79B1AE2A56F14A00D36A26 /* BakeryOverviewView.swift in Sources */, + 3ED40E042A608EF000C7D5DA /* MyPageCollectionViewHeader.swift in Sources */, 3E16E4FA2A57D1F400B813D0 /* RecommendationModel.swift in Sources */, + 3E452B6B2A614AAE00EA456D /* ImageWithSubtitleButton.swift in Sources */, 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */, 097682E72A5CF0080008F4FB /* BakeryFilterView.swift in Sources */, 090556292A51DBC000752067 /* UIView+.swift in Sources */, @@ -859,6 +898,7 @@ 09CA3F062A569EB30063897A /* API.swift in Sources */, DFB587B92A5D584800704B6C /* OnboardingViewController.swift in Sources */, DF959A6E2A568C9400E75774 /* UIColor+.swift in Sources */, + 3E452B672A60E68000EA456D /* MyPageDTO.swift in Sources */, 09C626562A5B3572002C8110 /* HomeBestReviewResponseDTO.swift in Sources */, 090556472A51E7D900752067 /* UITextView+.swift in Sources */, 0905562B2A51DBCE00752067 /* UIStackView+.swift in Sources */, @@ -870,10 +910,14 @@ 3E79B1B22A571E1F00D36A26 /* OptionsCollectionView.swift in Sources */, 3E79B1B52A571E7100D36A26 /* OptionsCollectionViewCell.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, + 3ED40E002A608B4700C7D5DA /* MyPageCollectionViewCell.swift in Sources */, 097682E52A5C99340008F4FB /* BakeryFilterItems.swift in Sources */, + 3ED40E062A60916000C7D5DA /* MyPagePurposeChipView.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */, + 3ED40E022A608B8600C7D5DA /* MyPageSectionEnum.swift in Sources */, 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */, + 3E452B692A60FF7900EA456D /* MyPageCollectionViewFooter.swift in Sources */, 3E16E4F52A57CF3800B813D0 /* WriteReviewDTO.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift b/GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift deleted file mode 100644 index 93cc3c2c..00000000 --- a/GEON-PPANG-iOS/Global/Enum/MyPageEnum.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// MyPageEnum.swift -// GEON-PPANG-iOS -// -// Created by 이성민 on 2023/07/14. -// - -import Foundation diff --git a/GEON-PPANG-iOS/Global/Enum/MyPageSectionEnum.swift b/GEON-PPANG-iOS/Global/Enum/MyPageSectionEnum.swift new file mode 100644 index 00000000..6138ea14 --- /dev/null +++ b/GEON-PPANG-iOS/Global/Enum/MyPageSectionEnum.swift @@ -0,0 +1,22 @@ +// +// MyPageEnum.swift +// GEON-PPANG-iOS +// +// Created by 이성민 on 2023/07/14. +// + +import Foundation + +enum MyPageSectionEnum: String, CaseIterable { + + case terms + case questions + + var items: [String] { + switch self { + case .terms: return ["이용약관"] + case .questions: return ["자주 묻는 질문", "문의하기"] + } + } + +} diff --git a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift index d6d860f7..9eac6b2e 100644 --- a/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift +++ b/GEON-PPANG-iOS/Global/Extensions/Design/UIImage+.swift @@ -48,6 +48,7 @@ extension UIImage { static let listIcon = UIImage(named: "ic_list")!.withRenderingMode(.alwaysOriginal) // 건빵집 리스트 옆에 얘 써야 됨, 탭바의 storelist 아님! static let logoIcon16px = UIImage(named: "ic_logo_16px")!.withRenderingMode(.alwaysOriginal) static let noticeIcon18px = UIImage(named: "ic_notice_18px")!.withRenderingMode(.alwaysOriginal) + static let profileIcon = UIImage(named: "ic_profile")!.withRenderingMode(.alwaysOriginal) static let reviewIcon = UIImage(named: "ic_review")!.withRenderingMode(.alwaysOriginal) static let searchIcon400 = UIImage(named: "ic_search_400")!.withRenderingMode(.alwaysOriginal) /// gray400 static let searchIcon600 = UIImage(named: "ic_search_600")!.withRenderingMode(.alwaysOriginal) /// gray600 diff --git a/GEON-PPANG-iOS/Global/Literals/Strings.swift b/GEON-PPANG-iOS/Global/Literals/Strings.swift index 0850d14b..83a6e2de 100644 --- a/GEON-PPANG-iOS/Global/Literals/Strings.swift +++ b/GEON-PPANG-iOS/Global/Literals/Strings.swift @@ -48,4 +48,16 @@ struct I18N { static let vegan = "비건빵" static let noSugar = "저당, 무설탕" } + + /// MyPage + struct MyPage { + static let title = "마이페이지" + static let bookmark = "저장목록" + static let myReviews = "내가 쓴 리뷰" + static let terms = "이용약관" + static let commonQuestions = "자주 묻는 질문" + static let askQuestions = "문의하기" + static let appVersion = "앱버전" + static let appVersionNum = "v 0.0.1" + } } diff --git a/GEON-PPANG-iOS/Global/Utils/Utils.swift b/GEON-PPANG-iOS/Global/Utils/Utils.swift index be4265da..0718be9a 100644 --- a/GEON-PPANG-iOS/Global/Utils/Utils.swift +++ b/GEON-PPANG-iOS/Global/Utils/Utils.swift @@ -21,4 +21,12 @@ final class Utils { modalViewController.modalPresentationStyle = modalStyle viewController.present(modalViewController, animated: false) } + + class func updateCollectionViewConstraint(of collectionView: UICollectionView) { + let height = collectionView.collectionViewLayout.collectionViewContentSize.height + guard height != 0 else { return } + collectionView.snp.updateConstraints { + $0.height.equalTo(height) + } + } } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index fad727b5..38d1864e 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -22,7 +22,7 @@ struct BakeryListResponseDTO: Hashable { // MARK: - BreadType -struct BreadType: Hashable { +struct BreadType: Codable, Hashable { let breadTypeID: Int let breadTypeName: String let isGlutenFree: Bool diff --git a/GEON-PPANG-iOS/Presentation/Common/Cell/DescriptionCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Common/Cell/DescriptionCollectionViewCell.swift index ac69121b..793e7636 100644 --- a/GEON-PPANG-iOS/Presentation/Common/Cell/DescriptionCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Common/Cell/DescriptionCollectionViewCell.swift @@ -69,7 +69,7 @@ final class DescriptionCollectionViewCell: UICollectionViewCell { private func setLayout() { addSubview(descriptionLabel) descriptionLabel.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(8) + $0.horizontalEdges.equalToSuperview().inset(6) $0.verticalEdges.equalToSuperview().inset(4) } } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift index c62d8966..2629dd5b 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/ImageWithSubtitleButton.swift @@ -1,8 +1,97 @@ // -// ButtonWithSubtitleView.swift +// ImageWithSubtitleButton.swift // GEON-PPANG-iOS // // Created by 이성민 on 2023/07/14. // -import Foundation +import UIKit + +import SnapKit +import Then + +final class ImageWithSubtitleButton: UIButton { + + // MARK: - Property + + enum ButtonType { + case bookmark + case myReview + } + + private var buttonImage: UIImage { + switch type { + case .bookmark: return .bookmarkIcon + case .myReview: return .reviewIcon + } + } + + private var buttonSubtitle: String { + switch type { + case .bookmark: return I18N.MyPage.bookmark + case .myReview: return I18N.MyPage.myReviews + } + } + + private var type: ButtonType + + // MARK: - UI Property + + private lazy var buttonImageView = UIImageView(image: buttonImage) + private lazy var buttonSubtitleLabel = UILabel() + + // MARK: - Life Cycle + + init(buttonType: ButtonType) { + self.type = buttonType + + super.init(frame: .zero) + + setLayout() + setUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + self.snp.makeConstraints { + $0.width.equalTo(66) + $0.height.equalTo(45) + } + + addSubview(buttonImageView) + buttonImageView.snp.makeConstraints { + $0.top.centerX.equalToSuperview() + $0.size.equalTo(24) + } + + addSubview(buttonSubtitleLabel) + buttonSubtitleLabel.snp.makeConstraints { + $0.top.equalTo(buttonImageView.snp.bottom).offset(4) + $0.centerX.equalTo(buttonImageView) + } + } + + private func setUI() { + buttonSubtitleLabel.do { + $0.text = buttonSubtitle + $0.font = .captionB1 + $0.textColor = .gbbPoint1 + } + } + + // MARK: - Custom Method + + func addButtonAction(_ tapped: @escaping () -> Void) { + let action = UIAction { _ in + tapped() + } + self.addAction(action, for: .touchUpInside) + } + +} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift index 7bac6a38..56f71192 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift @@ -5,4 +5,72 @@ // Created by 이성민 on 2023/07/14. // -import Foundation +import UIKit + +import SnapKit +import Then + +final class MyPageCollectionViewCell: UICollectionViewCell { + + // MARK: - UI Property + + private let titleLabel = UILabel() + private let rightChevronImageViewContainer = UIView() + private let rightChevronImageView = UIImageView(image: .rightArrowIcon) + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + contentView.addSubview(titleLabel) + titleLabel.snp.makeConstraints { + $0.leading.equalToSuperview().inset(24) + $0.centerY.equalToSuperview() + } + + contentView.addSubview(rightChevronImageViewContainer) + rightChevronImageViewContainer.snp.makeConstraints { + $0.verticalEdges.equalToSuperview().inset(10) + $0.width.height.equalTo(48) + $0.trailing.equalToSuperview().inset(6) + } + + rightChevronImageViewContainer.addSubview(rightChevronImageView) + rightChevronImageView.snp.makeConstraints { + $0.center.equalToSuperview() + } + } + + private func setUI() { + contentView.do { + $0.backgroundColor = .gbbWhite + } + + titleLabel.do { + $0.font = .bodyM1 + $0.textColor = .gbbBlack + } + } + + // MARK: - Custom Method + + func configureTitle(to text: String) { + titleLabel.do { + $0.text = text + } + } + +} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift index 146d19fb..7f0eb368 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift @@ -5,4 +5,64 @@ // Created by 이성민 on 2023/07/14. // -import Foundation +import UIKit + +import SnapKit +import Then + +final class MyPageCollectionViewFooter: UICollectionReusableView { + + // MARK: - UI Property + + private let appVersionLabel = UILabel() + private let appVersionNumLabel = UILabel() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubview(appVersionLabel) + appVersionLabel.snp.makeConstraints { + $0.leading.equalToSuperview().inset(24) + $0.centerY.equalToSuperview() + } + + addSubview(appVersionNumLabel) + appVersionNumLabel.snp.makeConstraints { + $0.trailing.equalToSuperview().inset(24) + $0.centerY.equalToSuperview() + } + } + + private func setUI() { + self.do { + $0.backgroundColor = .gbbWhite + } + + appVersionLabel.do { + $0.text = I18N.MyPage.appVersion + $0.font = .captionM1 + $0.textColor = .gbbMain1 + } + + appVersionNumLabel.do { + $0.text = I18N.MyPage.appVersionNum + $0.font = .captionM1 + $0.textColor = .gbbMain1 + } + } + +} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index 3eee5531..85dd11ad 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -5,4 +5,215 @@ // Created by 이성민 on 2023/07/14. // -import Foundation +import UIKit + +import SnapKit +import Then + +final class MyPageCollectionViewHeader: UICollectionReusableView { + + // MARK: - Prperty + + private let myPageData = MyPageDTO.dummyData() + private let username = "빵순이빵돌이" +// private lazy var myPageTagData = myPageData.breadType.configureTrueOptions() + + // MARK: - UI Property + + private let mainTitleLabel = UILabel() + private let mainTitleLogoImageView = UIImageView(image: .enabledStorelistIcon) + private let profileImageViewContainer = UIView() + private let profileImageView = UIImageView(image: .profileIcon) + private let purposeFilterChipView = MyPagePurposeChipView() + private let userNameLabel = UILabel() + private let flowLayout = OptionsCollectionViewFlowLayout() + lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) + private let rightChevronButton = UIButton() + + private let bookmarkButtonContainer = UIView() + private let bookmarkButton = ImageWithSubtitleButton(buttonType: .bookmark) + private let myReviewButtonContainer = UIView() + private let myReviewButton = ImageWithSubtitleButton(buttonType: .myReview) + private let seperatorView = UIView() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + setDelegate() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubview(mainTitleLabel) + mainTitleLabel.snp.makeConstraints { + // TODO: notch 유무로 재계산 + $0.top.equalToSuperview().inset(44) + $0.leading.equalToSuperview().inset(24) + } + + addSubview(mainTitleLogoImageView) + mainTitleLogoImageView.snp.makeConstraints { + $0.leading.equalTo(mainTitleLabel.snp.trailing).offset(8) + $0.centerY.equalTo(mainTitleLabel) + $0.size.equalTo(24) + } + + addSubview(profileImageViewContainer) + profileImageViewContainer.snp.makeConstraints { + $0.leading.equalTo(mainTitleLabel) + $0.top.equalTo(mainTitleLabel.snp.bottom).offset(34) + $0.size.equalTo(73) + } + + profileImageViewContainer.addSubview(profileImageView) + profileImageView.snp.makeConstraints { + $0.center.equalToSuperview() + $0.size.equalTo(36) + } + + addSubview(purposeFilterChipView) + purposeFilterChipView.snp.makeConstraints { + $0.leading.equalTo(profileImageViewContainer.snp.trailing).offset(10) + $0.top.equalTo(profileImageViewContainer) + } + + addSubview(userNameLabel) + userNameLabel.snp.makeConstraints { + $0.leading.equalTo(purposeFilterChipView) + $0.top.equalTo(purposeFilterChipView.snp.bottom).offset(14) + } + + addSubview(filterCollectionView) + filterCollectionView.snp.makeConstraints { + $0.leading.equalTo(purposeFilterChipView) + $0.top.equalTo(userNameLabel.snp.bottom).offset(10) + $0.height.equalTo(60) + $0.width.equalTo(170) + } + + addSubview(rightChevronButton) + rightChevronButton.snp.makeConstraints { + $0.top.equalTo(purposeFilterChipView) + $0.trailing.equalToSuperview().inset(5) + $0.bottom.equalTo(filterCollectionView) + $0.width.equalTo(48) + } + + addSubview(bookmarkButtonContainer) + bookmarkButtonContainer.snp.makeConstraints { + $0.leading.equalToSuperview().inset(24) + $0.trailing.equalTo(self.snp.centerX) + $0.top.equalTo(filterCollectionView.snp.bottom).offset(24) + $0.height.equalTo(87) + $0.bottom.equalToSuperview().inset(20) + } + + bookmarkButtonContainer.addSubview(bookmarkButton) + bookmarkButton.snp.makeConstraints { + $0.center.equalToSuperview() + } + + addSubview(myReviewButtonContainer) + myReviewButtonContainer.snp.makeConstraints { + $0.leading.equalTo(bookmarkButtonContainer.snp.trailing) + $0.trailing.equalToSuperview().inset(24) + $0.top.bottom.equalTo(bookmarkButtonContainer) + } + + myReviewButtonContainer.addSubview(myReviewButton) + myReviewButton.snp.makeConstraints { + $0.center.equalToSuperview() + } + + addSubview(seperatorView) + seperatorView.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.centerY.equalTo(myReviewButtonContainer) + $0.width.equalTo(1) + $0.height.equalTo(42) + } + } + + private func setUI() { + self.do { + $0.backgroundColor = .gbbWhite + } + + mainTitleLabel.do { + $0.text = I18N.MyPage.title + $0.font = .title1 + $0.textColor = .gbbGray700 + } + + profileImageViewContainer.do { + $0.backgroundColor = .gbbBackground2 + $0.makeCornerRound(radius: 36.5) + } + + userNameLabel.do { + $0.text = username + $0.font = .title2 + $0.textColor = .gbbGray700 + } + + filterCollectionView.do { + $0.register(cell: DescriptionCollectionViewCell.self) + } + + rightChevronButton.do { + $0.setImage(.rightArrowIcon, for: .normal) + } + + bookmarkButtonContainer.do { + $0.roundCorners(corners: [.topLeft, .bottomLeft], radius: 12) + $0.makeBorder(width: 1, color: .gbbPoint1!) + $0.backgroundColor = .gbbBackground1 + } + + myReviewButtonContainer.do { + $0.roundCorners(corners: [.topRight, .bottomLeft], radius: 12) + $0.makeBorder(width: 1, color: .gbbPoint1!) + $0.backgroundColor = .gbbBackground1 + } + + seperatorView.do { + $0.backgroundColor = .gbbPoint1 + } + } + + private func setDelegate() { + filterCollectionView.delegate = self + filterCollectionView.dataSource = self + } + +} + +// MARK: - UICollectionViewDelegate extension + +extension MyPageCollectionViewHeader: UICollectionViewDelegate {} + +// MARK: - UICollectionViewDataSource + +extension MyPageCollectionViewHeader: UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 4 + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.configureTagTitle("test") + return cell + } + +} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift index c0fc0868..fbfee91a 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPagePurposeChipView.swift @@ -5,4 +5,59 @@ // Created by 이성민 on 2023/07/14. // -import Foundation +import UIKit + +import SnapKit +import Then + +final class MyPagePurposeChipView: UIView { + + // MARK: - Property + + // TODO: filterPurposeType 으로 변경 + let purposeType = "맛 • 다이어트" + + // MARK: - UI Property + + private let purposeLabel = UILabel() + + // MARK: - Life Cycle + + override init(frame: CGRect) { + super.init(frame: .zero) + + setLayout() + setUI() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - Setting + + private func setLayout() { + addSubview(purposeLabel) + purposeLabel.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(11) + $0.verticalEdges.equalToSuperview().inset(4) + } + } + + private func setUI() { + self.do { + $0.backgroundColor = .gbbPoint2 + $0.makeCornerRound(radius: 12.5) + $0.makeBorder(width: 0.5, color: .gbbPoint1!) + } + + purposeLabel.do { + // TODO: filterPurposeType 으로 변환 후 .rawValue 사용 + $0.text = purposeType + $0.font = .captionM1 + $0.textColor = .gbbPoint1 + } + } + +} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index df7ef2a7..c9fac5e2 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -7,10 +7,148 @@ import UIKit -final class MyPageViewController: UIViewController { +import SnapKit +import Then +final class MyPageViewController: BaseViewController { + + + // MARK: - Property + + + // MARK: - UI Property + + private let flowLayout = UICollectionViewFlowLayout() + private lazy var myPageCollectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) + + // MARK: - Life Cycle + override func viewDidLoad() { super.viewDidLoad() + + } + + override func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + + Utils.updateCollectionViewConstraint(of: myPageCollectionView) + } + + // MARK: - Setting + + override func setLayout() { + view.addSubview(myPageCollectionView) + myPageCollectionView.snp.makeConstraints { + $0.top.equalTo(view.safeAreaLayoutGuide) + $0.horizontalEdges.equalToSuperview() + $0.height.equalTo(50) + } + } + + override func setUI() { + flowLayout.do { + $0.scrollDirection = .vertical + $0.sectionInset = .init(top: 8, left: 0, bottom: 0, right: 0) + $0.minimumLineSpacing = 1 + } + + myPageCollectionView.do { + $0.register(header: MyPageCollectionViewHeader.self) + $0.register(cell: MyPageCollectionViewCell.self) + $0.register(footer: MyPageCollectionViewFooter.self) + $0.backgroundColor = .gbbGray200 + } + } + + override func setDelegate() { + myPageCollectionView.delegate = self + myPageCollectionView.dataSource = self + } + + // MARK: - Action Helper + + + + // MARK: - Custom Method + + + +} + +// MARK: - UICollectionViewDelegate extension + +extension MyPageViewController: UICollectionViewDelegate {} + +// MARK: - UICollectionViewDataSource extension +extension MyPageViewController: UICollectionViewDataSource { + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return MyPageSectionEnum.allCases.count + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + switch section { + case 0: return MyPageSectionEnum.terms.items.count + case 1: return MyPageSectionEnum.questions.items.count + default: return 0 + } + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: MyPageCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + let section = indexPath.section + switch section { + case 0: cell.configureTitle(to: MyPageSectionEnum.terms.items[indexPath.item]) + case 1: cell.configureTitle(to: MyPageSectionEnum.questions.items[indexPath.item]) + default: return UICollectionViewCell() + } + return cell + } + + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + + switch indexPath.section { + case 0: + let header: MyPageCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) + return header + case 1: + let footer: MyPageCollectionViewFooter = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, indexPath: indexPath) + return footer + default: + return UICollectionReusableView() + } + + } + +} + +// MARK: - UICollectionViewDelegateFlowLayout extension + +extension MyPageViewController: UICollectionViewDelegateFlowLayout { + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return .init(width: SizeLiteral.Screen.width, height: 68) + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { + let indexPath = IndexPath(item: 0, section: section) + let header: MyPageCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) + switch section { + case 0: return header.systemLayoutSizeFitting(.init(width: collectionView.frame.width, + height: UIView.layoutFittingExpandedSize.height), + withHorizontalFittingPriority: .required, + verticalFittingPriority: .fittingSizeLevel) + default: return .zero + } + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { + switch section { + case 0: return .zero + case 1: return .init(width: SizeLiteral.Screen.width, height: 37) + default: return .zero + } } + } From 7a2634cfb3a59fdc3b196b2d68ef999c748ec15c Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 19:18:52 +0900 Subject: [PATCH 122/153] =?UTF-8?q?[Feat]=20#42=20-=20MyRevies=20=ED=97=A4?= =?UTF-8?q?=EB=8D=94=EB=B7=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 52 +++++++++++-------- .../MyReviewsHeaderView.swift | 23 ++++---- 2 files changed, 44 insertions(+), 31 deletions(-) rename GEON-PPANG-iOS/Presentation/MyReviews/{ViewControllers => Views}/MyReviewsHeaderView.swift (63%) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index eec1c4b2..d5b75c1f 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -44,6 +44,7 @@ 097682E72A5CF0080008F4FB /* BakeryFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */; }; 097682E92A5D0B6B0008F4FB /* BakeryListTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */; }; 097682EB2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */; }; + 098716B82A6138BD00538D05 /* MyReviewsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 098716B72A6138BD00538D05 /* MyReviewsHeaderView.swift */; }; 0987288D2A5BA1F000A29402 /* BookmarkButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */; }; 098F32EA2A4200FE0092D09A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 098F32E92A4200FE0092D09A /* Assets.xcassets */; }; 098F32ED2A4200FE0092D09A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 098F32EB2A4200FE0092D09A /* LaunchScreen.storyboard */; }; @@ -66,14 +67,13 @@ 09CA3EFC2A569E4A0063897A /* URLConstant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3EFB2A569E4A0063897A /* URLConstant.swift */; }; 09CA3F062A569EB30063897A /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F052A569EB30063897A /* API.swift */; }; 09CA3F082A569EBA0063897A /* Service.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09CA3F072A569EBA0063897A /* Service.swift */; }; + 09FD47DD2A5E57F2002020BD /* MyReviewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */; }; 3E16E4F52A57CF3800B813D0 /* WriteReviewDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */; }; 3E16E4FA2A57D1F400B813D0 /* RecommendationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */; }; 3E16E4FC2A57D24900B813D0 /* LikeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */; }; 3E16E4FE2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */; }; 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */; }; 3E16E5022A58176800B813D0 /* ReviewDetailTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */; }; - 09FD47DD2A5E57F2002020BD /* MyReviewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */; }; - 09FD47DF2A5E58D1002020BD /* MyReviewsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD47DE2A5E58D1002020BD /* MyReviewsHeaderView.swift */; }; 3E79B19D2A54523D00D36A26 /* BackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19C2A54523D00D36A26 /* BackButton.swift */; }; 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */; }; 3E79B1A62A566F6400D36A26 /* WriteReviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */; }; @@ -123,6 +123,7 @@ 097682E62A5CF0080008F4FB /* BakeryFilterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryFilterView.swift; sourceTree = ""; }; 097682E82A5D0B6B0008F4FB /* BakeryListTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListTopView.swift; sourceTree = ""; }; 097682EA2A5D12BD0008F4FB /* BakeryListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BakeryListCollectionViewCell.swift; sourceTree = ""; }; + 098716B72A6138BD00538D05 /* MyReviewsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyReviewsHeaderView.swift; sourceTree = ""; }; 0987288C2A5BA1F000A29402 /* BookmarkButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkButton.swift; sourceTree = ""; }; 098F32DD2A4200FD0092D09A /* GEON-PPANG-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "GEON-PPANG-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 098F32E02A4200FD0092D09A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -149,14 +150,13 @@ 09CA3EFB2A569E4A0063897A /* URLConstant.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLConstant.swift; sourceTree = ""; }; 09CA3F052A569EB30063897A /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; 09CA3F072A569EBA0063897A /* Service.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Service.swift; sourceTree = ""; }; + 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyReviewsViewController.swift; sourceTree = ""; }; 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewDTO.swift; sourceTree = ""; }; 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendationModel.swift; sourceTree = ""; }; 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikeModel.swift; sourceTree = ""; }; 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewFlowLayout.swift; sourceTree = ""; }; 3E16E4FF2A57FFD900B813D0 /* OptionsCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewHeader.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; - 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyReviewsViewController.swift; sourceTree = ""; }; - 09FD47DE2A5E58D1002020BD /* MyReviewsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyReviewsHeaderView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewViewController.swift; sourceTree = ""; }; @@ -434,6 +434,14 @@ path = Views; sourceTree = ""; }; + 098716B92A613B6A00538D05 /* Views */ = { + isa = PBXGroup; + children = ( + 098716B72A6138BD00538D05 /* MyReviewsHeaderView.swift */, + ); + path = Views; + sourceTree = ""; + }; 098F32D42A4200FD0092D09A = { isa = PBXGroup; children = ( @@ -544,6 +552,23 @@ path = Protocol; sourceTree = ""; }; + 09FD47DA2A5E57CC002020BD /* MyReviews */ = { + isa = PBXGroup; + children = ( + 098716B92A613B6A00538D05 /* Views */, + 09FD47DB2A5E57E3002020BD /* ViewControllers */, + ); + path = MyReviews; + sourceTree = ""; + }; + 09FD47DB2A5E57E3002020BD /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; 3E16E4F22A57CE2B00B813D0 /* Model */ = { isa = PBXGroup; children = ( @@ -587,23 +612,6 @@ path = Model; sourceTree = ""; }; - 09FD47DA2A5E57CC002020BD /* MyReviews */ = { - isa = PBXGroup; - children = ( - 09FD47DB2A5E57E3002020BD /* ViewControllers */, - ); - path = MyReviews; - sourceTree = ""; - }; - 09FD47DB2A5E57E3002020BD /* ViewControllers */ = { - isa = PBXGroup; - children = ( - 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */, - 09FD47DE2A5E58D1002020BD /* MyReviewsHeaderView.swift */, - ); - path = ViewControllers; - sourceTree = ""; - }; 3E79B19B2A54523400D36A26 /* Button */ = { isa = PBXGroup; children = ( @@ -860,6 +868,7 @@ 09C6264E2A5B29F8002C8110 /* SearchEnum.swift in Sources */, 0915C16A2A5BFC5900ACB8D4 /* HomeBottomCollectionViewCell.swift in Sources */, 09CA3F082A569EBA0063897A /* Service.swift in Sources */, + 098716B82A6138BD00538D05 /* MyReviewsHeaderView.swift in Sources */, 09B13F4C2A593C6F00C0C723 /* HomeViewController.swift in Sources */, 09C626542A5B344B002C8110 /* HomeBestBakeryResponseDTO.swift in Sources */, 0915C16E2A5C2EE200ACB8D4 /* MarkStackView.swift in Sources */, @@ -894,7 +903,6 @@ 3E79B1B52A571E7100D36A26 /* OptionsCollectionViewCell.swift in Sources */, 090556312A51DDD800752067 /* UITableView+.swift in Sources */, 097682E52A5C99340008F4FB /* BakeryFilterItems.swift in Sources */, - 09FD47DF2A5E58D1002020BD /* MyReviewsHeaderView.swift in Sources */, 090556272A51DBB100752067 /* NSObject+.swift in Sources */, 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */, 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */, diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsHeaderView.swift b/GEON-PPANG-iOS/Presentation/MyReviews/Views/MyReviewsHeaderView.swift similarity index 63% rename from GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsHeaderView.swift rename to GEON-PPANG-iOS/Presentation/MyReviews/Views/MyReviewsHeaderView.swift index 3dead43d..c80ca43f 100644 --- a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsHeaderView.swift +++ b/GEON-PPANG-iOS/Presentation/MyReviews/Views/MyReviewsHeaderView.swift @@ -2,7 +2,7 @@ // MyReviewsHeaderView.swift // GEON-PPANG-iOS // -// Created by JEONGEUN KIM on 2023/07/12. +// Created by JEONGEUN KIM on 2023/07/14. // import UIKit @@ -30,29 +30,34 @@ final class MyReviewsHeaderView: UICollectionReusableView { fatalError("init(coder:) has not been implemented") } - // MARK: - Setting - private func setLayout() { - addSubviews(dateLabel, dotButton) + self.addSubviews(dateLabel, dotButton) dateLabel.snp.makeConstraints { - $0.leading.top.equalToSuperview() + $0.leading.equalToSuperview() + $0.centerY.equalToSuperview() } + dotButton.snp.makeConstraints { $0.size.equalTo(24) - $0.top.equalToSuperview() - $0.trailing.equalToSuperview().offset(-19) + $0.directionalVerticalEdges.equalToSuperview() + $0.trailing.equalToSuperview().inset(24) } } private func setUI() { - dateLabel.do { - $0.basic(font: .pretendardMedium(13), color: .gbbGray400!) + $0.basic(text: "23.08.09", + font: .captionM1!, + color: .gbbGray400!) } dotButton.do { $0.setImage(.dotdotdotIcon, for: .normal) + $0.addAction(UIAction { _ in + print("myreviews Tapped") + }, for: .touchUpInside) } } + } From efa6cd43b6702c44813a634b060c96d3505759d6 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 19:19:25 +0900 Subject: [PATCH 123/153] =?UTF-8?q?[Feat]=20#43=20-=20MyReviews=20UI=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyReviewsViewController.swift | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift index 094a5ed5..ca0567e7 100644 --- a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift @@ -15,20 +15,36 @@ final class MyReviewsViewController: BaseViewController { // MARK: - Property private lazy var safeArea = self.view.safeAreaLayoutGuide + private var myReviewslist: [BakeryListResponseDTO] = BakeryListResponseDTO.item // MARK: - UI Property private let naviView = CustomNavigationBar() + private lazy var collectionView = UICollectionView(frame: .zero, + collectionViewLayout: layout()) // MARK: - Setting + override func viewDidLoad() { + super.viewDidLoad() + + setRegistration() + } + override func setLayout() { - view.addSubview(naviView) + view.addSubviews(naviView, collectionView) naviView.snp.makeConstraints { $0.top.equalToSuperview() $0.directionalHorizontalEdges.equalTo(safeArea) } + + collectionView.snp.makeConstraints { + $0.top.equalTo(naviView.snp.bottom) + $0.leading.equalToSuperview().inset(24) + $0.trailing.equalToSuperview() + $0.bottom.equalToSuperview() + } } override func setUI() { @@ -39,4 +55,55 @@ final class MyReviewsViewController: BaseViewController { $0.configureLeftTitle(to: I18N.MyReviews.naviTitle) } } + + override func setDelegate() { + collectionView.delegate = self + collectionView.dataSource = self + } + + private func setRegistration() { + collectionView.register(cell: BakeryListCollectionViewCell.self) + collectionView.register(header: MyReviewsHeaderView.self) + } + + private func layout() -> UICollectionViewLayout { + var config = UICollectionLayoutListConfiguration(appearance: .grouped) + config.backgroundColor = .clear + config.showsSeparators = true + config.headerMode = .supplementary + config.footerMode = .none + config.separatorConfiguration.topSeparatorVisibility = .hidden + config.separatorConfiguration.bottomSeparatorVisibility = .visible + + let layout = UICollectionViewCompositionalLayout.list(using: config) + return layout + } +} + +// MARK: - UICollectionViewDataSource + +extension MyReviewsViewController: UICollectionViewDataSource { + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return myReviewslist.count + } + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 1 + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.reviewType) + cell.updateUI(data: myReviewslist[indexPath.section], index: indexPath.item) + return cell + } +} + +// MARK: - UICollectionViewDelegateFlowLayout + +extension MyReviewsViewController: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + let header: MyReviewsHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) + return header + } } From 9420d6c525a4fc610151e2571a224f7a3e78c8b9 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 19:19:58 +0900 Subject: [PATCH 124/153] =?UTF-8?q?[Fix]=20#43=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/BakeryListCollectionViewCell.swift | 10 ++++++++-- .../ViewControllers/BakeryListViewController.swift | 4 +++- .../BakeryList/Views/BakeryListTopView.swift | 3 +-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index b67344eb..5af5194a 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -80,7 +80,8 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { bakeryImage.snp.makeConstraints { $0.size.equalTo(90) - $0.top.leading.equalToSuperview().offset(24) + $0.top.equalToSuperview().offset(24) + $0.leading.equalToSuperview().inset(48) } markStackView.snp.makeConstraints { @@ -90,7 +91,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { } bakeryTitle.snp.makeConstraints { - $0.top.equalToSuperview().offset(24) + $0.top.equalTo(bakeryImage.snp.top) $0.leading.equalTo(bakeryImage.snp.trailing).offset(14) } @@ -192,6 +193,11 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { }, for: .touchUpInside) } + bakeryImage.snp.remakeConstraints { + $0.size.equalTo(90) + $0.top.equalToSuperview().offset(10) + $0.leading.equalToSuperview() + } arrowButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.trailing.equalToSuperview().offset(-12) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index 4e1baf1c..66fb3b69 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -62,7 +62,9 @@ final class BakeryListViewController: BaseViewController { bakeryListCollectionView.snp.makeConstraints { $0.top.equalTo(bakeryFilterView.snp.bottom) - $0.directionalHorizontalEdges.equalTo(safeArea) + $0.leading.equalTo(safeArea).offset(-24) + $0.trailing.equalTo(safeArea) +// $0.directionalHorizontalEdges.equalTo(safeArea) $0.bottom.equalToSuperview() } } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift index fc622b9b..c58c5850 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/Views/BakeryListTopView.swift @@ -18,8 +18,7 @@ final class BakeryListTopView: UIView { private let bakeryTitle = UILabel() private let bakeryIcon = UIImageView() private let searchButton = UIButton() - - + // MARK: - Life Cycle override init(frame: CGRect) { From 723ec69a8b19b4627dec34264fd0e3e1ea8fa1c5 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Fri, 14 Jul 2023 19:25:37 +0900 Subject: [PATCH 125/153] =?UTF-8?q?[Fix]=20#43=20-=20MyReviews=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=B7=B0=20=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/BakeryListCollectionViewCell.swift | 2 +- GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift | 2 +- .../MyReviews/ViewControllers/MyReviewsViewController.swift | 4 +--- .../Presentation/MyReviews/Views/MyReviewsHeaderView.swift | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 5af5194a..c4ea411a 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -196,7 +196,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { bakeryImage.snp.remakeConstraints { $0.size.equalTo(90) $0.top.equalToSuperview().offset(10) - $0.leading.equalToSuperview() + $0.leading.equalToSuperview().offset(24) } arrowButton.snp.makeConstraints { $0.centerY.equalToSuperview() diff --git a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift index 0c4d6c1d..43d2f62b 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift @@ -41,7 +41,7 @@ final class HomeHeaderView: UICollectionReusableView { addSubview(headerLabel) headerLabel.snp.makeConstraints { - $0.leading.equalToSuperview() + $0.leading.equalToSuperview().offset(24) $0.bottom.equalToSuperview() } } diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift index ca0567e7..49fe8be7 100644 --- a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift @@ -41,8 +41,7 @@ final class MyReviewsViewController: BaseViewController { collectionView.snp.makeConstraints { $0.top.equalTo(naviView.snp.bottom) - $0.leading.equalToSuperview().inset(24) - $0.trailing.equalToSuperview() + $0.directionalHorizontalEdges.equalTo(safeArea) $0.bottom.equalToSuperview() } } @@ -71,7 +70,6 @@ final class MyReviewsViewController: BaseViewController { config.backgroundColor = .clear config.showsSeparators = true config.headerMode = .supplementary - config.footerMode = .none config.separatorConfiguration.topSeparatorVisibility = .hidden config.separatorConfiguration.bottomSeparatorVisibility = .visible diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/Views/MyReviewsHeaderView.swift b/GEON-PPANG-iOS/Presentation/MyReviews/Views/MyReviewsHeaderView.swift index c80ca43f..7ac03baf 100644 --- a/GEON-PPANG-iOS/Presentation/MyReviews/Views/MyReviewsHeaderView.swift +++ b/GEON-PPANG-iOS/Presentation/MyReviews/Views/MyReviewsHeaderView.swift @@ -34,7 +34,7 @@ final class MyReviewsHeaderView: UICollectionReusableView { self.addSubviews(dateLabel, dotButton) dateLabel.snp.makeConstraints { - $0.leading.equalToSuperview() + $0.leading.equalToSuperview().offset(24) $0.centerY.equalToSuperview() } From 2c66c1ebc40ca27a228a9e4fabae809f741ee233 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Fri, 14 Jul 2023 23:42:39 +0900 Subject: [PATCH 126/153] [Feat] #51 - MyPageViewController overall UI completed --- .../View/MyPageCollectionViewHeader.swift | 64 ++++++++++--------- .../MyPageViewController.swift | 8 +-- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index 85dd11ad..c6002856 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -30,10 +30,10 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { lazy var filterCollectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) private let rightChevronButton = UIButton() - private let bookmarkButtonContainer = UIView() + private let buttonsContainer = UIView() private let bookmarkButton = ImageWithSubtitleButton(buttonType: .bookmark) - private let myReviewButtonContainer = UIView() private let myReviewButton = ImageWithSubtitleButton(buttonType: .myReview) + private lazy var buttonsStackView = UIStackView(arrangedSubviews: [bookmarkButton, myReviewButton]) private let seperatorView = UIView() // MARK: - Life Cycle @@ -51,6 +51,12 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { fatalError("init(coder:) has not been implemented") } + override func layoutSubviews() { + super.layoutSubviews() + + Utils.updateCollectionViewConstraint(of: filterCollectionView) + } + // MARK: - Setting private func setLayout() { @@ -109,36 +115,23 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { $0.width.equalTo(48) } - addSubview(bookmarkButtonContainer) - bookmarkButtonContainer.snp.makeConstraints { - $0.leading.equalToSuperview().inset(24) - $0.trailing.equalTo(self.snp.centerX) + addSubview(buttonsContainer) + buttonsContainer.snp.makeConstraints { + $0.horizontalEdges.equalToSuperview().inset(24) $0.top.equalTo(filterCollectionView.snp.bottom).offset(24) $0.height.equalTo(87) $0.bottom.equalToSuperview().inset(20) } - bookmarkButtonContainer.addSubview(bookmarkButton) - bookmarkButton.snp.makeConstraints { - $0.center.equalToSuperview() - } - - addSubview(myReviewButtonContainer) - myReviewButtonContainer.snp.makeConstraints { - $0.leading.equalTo(bookmarkButtonContainer.snp.trailing) - $0.trailing.equalToSuperview().inset(24) - $0.top.bottom.equalTo(bookmarkButtonContainer) - } - - myReviewButtonContainer.addSubview(myReviewButton) - myReviewButton.snp.makeConstraints { - $0.center.equalToSuperview() + addSubview(buttonsStackView) + buttonsStackView.snp.makeConstraints { + $0.center.equalTo(buttonsContainer) } addSubview(seperatorView) seperatorView.snp.makeConstraints { $0.centerX.equalToSuperview() - $0.centerY.equalTo(myReviewButtonContainer) + $0.centerY.equalTo(buttonsContainer) $0.width.equalTo(1) $0.height.equalTo(42) } @@ -174,16 +167,15 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { $0.setImage(.rightArrowIcon, for: .normal) } - bookmarkButtonContainer.do { - $0.roundCorners(corners: [.topLeft, .bottomLeft], radius: 12) + buttonsContainer.do { + $0.makeCornerRound(radius: 12) $0.makeBorder(width: 1, color: .gbbPoint1!) $0.backgroundColor = .gbbBackground1 } - myReviewButtonContainer.do { - $0.roundCorners(corners: [.topRight, .bottomLeft], radius: 12) - $0.makeBorder(width: 1, color: .gbbPoint1!) - $0.backgroundColor = .gbbBackground1 + buttonsStackView.do { + $0.axis = .horizontal + $0.spacing = CGFloat().convertByWidthRatio(96) } seperatorView.do { @@ -207,7 +199,7 @@ extension MyPageCollectionViewHeader: UICollectionViewDelegate {} extension MyPageCollectionViewHeader: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 4 + return 5 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { @@ -217,3 +209,17 @@ extension MyPageCollectionViewHeader: UICollectionViewDataSource { } } + +// MARK: - UICollectionViewDelegateFlowLayout extension + +extension MyPageCollectionViewHeader: UICollectionViewDelegateFlowLayout { + +// func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { +// let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) +// return cell.systemLayoutSizeFitting(.init(width: collectionView.frame.width, +// height: UIView.layoutFittingExpandedSize.height), +// withHorizontalFittingPriority: .required, +// verticalFittingPriority: .fittingSizeLevel) +// } + +} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index c9fac5e2..6e91c046 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -23,11 +23,6 @@ final class MyPageViewController: BaseViewController { // MARK: - Life Cycle - override func viewDidLoad() { - super.viewDidLoad() - - } - override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() @@ -40,7 +35,7 @@ final class MyPageViewController: BaseViewController { view.addSubview(myPageCollectionView) myPageCollectionView.snp.makeConstraints { $0.top.equalTo(view.safeAreaLayoutGuide) - $0.horizontalEdges.equalToSuperview() + $0.horizontalEdges.bottom.equalToSuperview() $0.height.equalTo(50) } } @@ -56,7 +51,6 @@ final class MyPageViewController: BaseViewController { $0.register(header: MyPageCollectionViewHeader.self) $0.register(cell: MyPageCollectionViewCell.self) $0.register(footer: MyPageCollectionViewFooter.self) - $0.backgroundColor = .gbbGray200 } } From 1caadf6ef184dd9aaa304575c7a7f37fdd1a4428 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 00:11:30 +0900 Subject: [PATCH 127/153] [Feat] #51 - adapted UI to iPhone SE2 --- .../MyPage/View/MyPageCollectionViewFooter.swift | 4 ++-- .../MyPage/View/MyPageCollectionViewHeader.swift | 16 +--------------- .../ViewControllers/MyPageViewController.swift | 2 +- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift index 7f0eb368..4442dbdb 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewFooter.swift @@ -37,13 +37,13 @@ final class MyPageCollectionViewFooter: UICollectionReusableView { addSubview(appVersionLabel) appVersionLabel.snp.makeConstraints { $0.leading.equalToSuperview().inset(24) - $0.centerY.equalToSuperview() + $0.top.equalToSuperview().inset(12) } addSubview(appVersionNumLabel) appVersionNumLabel.snp.makeConstraints { $0.trailing.equalToSuperview().inset(24) - $0.centerY.equalToSuperview() + $0.centerY.equalTo(appVersionLabel) } } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index c6002856..2a15b922 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -194,7 +194,7 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { extension MyPageCollectionViewHeader: UICollectionViewDelegate {} -// MARK: - UICollectionViewDataSource +// MARK: - UICollectionViewDataSource extension extension MyPageCollectionViewHeader: UICollectionViewDataSource { @@ -209,17 +209,3 @@ extension MyPageCollectionViewHeader: UICollectionViewDataSource { } } - -// MARK: - UICollectionViewDelegateFlowLayout extension - -extension MyPageCollectionViewHeader: UICollectionViewDelegateFlowLayout { - -// func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { -// let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) -// return cell.systemLayoutSizeFitting(.init(width: collectionView.frame.width, -// height: UIView.layoutFittingExpandedSize.height), -// withHorizontalFittingPriority: .required, -// verticalFittingPriority: .fittingSizeLevel) -// } - -} diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index 6e91c046..0a4df334 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -140,7 +140,7 @@ extension MyPageViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { switch section { case 0: return .zero - case 1: return .init(width: SizeLiteral.Screen.width, height: 37) + case 1: return .init(width: SizeLiteral.Screen.width, height: 60) default: return .zero } } From 9af0c3d43f4b7b46342bf7cdf999a5285defbc98 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 00:32:42 +0900 Subject: [PATCH 128/153] [Feat] #51 - MyPageVC detail added --- .../View/MyPageCollectionViewCell.swift | 27 ++++++++++++++++ .../View/MyPageCollectionViewHeader.swift | 5 +++ .../MyPageViewController.swift | 32 +++++++++++++------ 3 files changed, 54 insertions(+), 10 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift index 56f71192..593bf13d 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewCell.swift @@ -73,4 +73,31 @@ final class MyPageCollectionViewCell: UICollectionViewCell { } } + func applyTopThickBorder() { + let borderView = UIView() + contentView.addSubview(borderView) + borderView.snp.makeConstraints { + $0.bottom.equalTo(contentView.snp.top) + $0.height.equalTo(8) + $0.horizontalEdges.equalToSuperview() + } + + borderView.do { + $0.backgroundColor = .gbbGray200 + } + } + + func applyTopThinBorder() { + let borderView = UIView() + contentView.addSubview(borderView) + borderView.snp.makeConstraints { + $0.height.equalTo(1) + $0.horizontalEdges.equalToSuperview() + } + + borderView.do { + $0.backgroundColor = .gbbGray200 + } + } + } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index 2a15b922..0031200b 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -159,6 +159,11 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { $0.textColor = .gbbGray700 } + flowLayout.do { + $0.minimumLineSpacing = 10 + $0.minimumInteritemSpacing = 4 + } + filterCollectionView.do { $0.register(cell: DescriptionCollectionViewCell.self) } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index 0a4df334..2aaac6c7 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -59,14 +59,6 @@ final class MyPageViewController: BaseViewController { myPageCollectionView.dataSource = self } - // MARK: - Action Helper - - - - // MARK: - Custom Method - - - } // MARK: - UICollectionViewDelegate extension @@ -93,8 +85,16 @@ extension MyPageViewController: UICollectionViewDataSource { let cell: MyPageCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) let section = indexPath.section switch section { - case 0: cell.configureTitle(to: MyPageSectionEnum.terms.items[indexPath.item]) - case 1: cell.configureTitle(to: MyPageSectionEnum.questions.items[indexPath.item]) + case 0: + cell.configureTitle(to: MyPageSectionEnum.terms.items[indexPath.item]) + cell.applyTopThickBorder() + case 1: + cell.configureTitle(to: MyPageSectionEnum.questions.items[indexPath.item]) + if indexPath.item == 0 { + cell.applyTopThickBorder() + } else { + cell.applyTopThinBorder() + } default: return UICollectionViewCell() } return cell @@ -122,6 +122,18 @@ extension MyPageViewController: UICollectionViewDataSource { extension MyPageViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + switch indexPath.section { + case 0: + return .init(width: SizeLiteral.Screen.width, height: 68 + 8) + case 1: + if indexPath.item == 0 { + return .init(width: SizeLiteral.Screen.width, height: 68 + 8) + } else { + return .init(width: SizeLiteral.Screen.width, height: 68 + 1) + } + default: + return .zero + } return .init(width: SizeLiteral.Screen.width, height: 68) } From 60942ee29854c82f9a1e9d6ef76ef8b013774af2 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 00:38:26 +0900 Subject: [PATCH 129/153] [Add] #51 - edited BreadType to BreadResponseType in BakeryListResponseDTO --- .../Model/BakeryListResponseDTO.swift | 12 ++++++------ .../Presentation/MyPage/Model/MyPageDTO.swift | 2 +- .../ViewControllers/MyPageViewController.swift | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index 38d1864e..b0fc21a3 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -13,7 +13,7 @@ struct BakeryListResponseDTO: Hashable { let isHACCP: Bool let isVegan: Bool let isNonGMO: Bool - let breadType: BreadType + let breadType: BreadResponseType let firstNearStation: String let secondNearStation: String? let isBooked: Bool @@ -22,7 +22,7 @@ struct BakeryListResponseDTO: Hashable { // MARK: - BreadType -struct BreadType: Codable, Hashable { +struct BreadResponseType: Codable, Hashable { let breadTypeID: Int let breadTypeName: String let isGlutenFree: Bool @@ -37,9 +37,9 @@ extension BakeryListResponseDTO { BakeryListResponseDTO(bakeryID: 3, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem3, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7) ] } -extension BreadType { - static let breadItem1: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: true, isSugarFree: true) - static let breadItem2: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: false, isNutFree: false, isSugarFree: true) - static let breadItem3: BreadType = BreadType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: true, isSugarFree: true) +extension BreadResponseType { + static let breadItem1: BreadResponseType = BreadResponseType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: true, isSugarFree: true) + static let breadItem2: BreadResponseType = BreadResponseType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: false, isNutFree: false, isSugarFree: true) + static let breadItem3: BreadResponseType = BreadResponseType(breadTypeID: 1, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: true, isSugarFree: true) } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift b/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift index eac72564..b775b5aa 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift @@ -10,7 +10,7 @@ import Foundation struct MyPageDTO: Codable { let memberNickname: String let mainPurpose: String - let breadType: BreadType + let breadType: BreadResponseType } extension MyPageDTO { diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index 2aaac6c7..0fe64446 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -101,7 +101,6 @@ extension MyPageViewController: UICollectionViewDataSource { } func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - switch indexPath.section { case 0: let header: MyPageCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) @@ -112,7 +111,6 @@ extension MyPageViewController: UICollectionViewDataSource { default: return UICollectionReusableView() } - } } From 968c95dd61ce8771bf99a26a53a9be667da7ba87 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 01:10:10 +0900 Subject: [PATCH 130/153] [Feat] #51 - MyPageVC completed --- .../Model/BakeryListResponseDTO.swift | 9 +++++++++ .../Presentation/MyPage/Model/MyPageDTO.swift | 2 +- .../MyPage/View/MyPageCollectionViewHeader.swift | 13 ++++++++++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index b0fc21a3..121bef75 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -29,6 +29,15 @@ struct BreadResponseType: Codable, Hashable { let isVegan: Bool let isNutFree: Bool let isSugarFree: Bool + + func configureTrueOptions() -> [(String, Bool)] { + var optionsBoolArray: [(String, Bool)] = [] + if isGlutenFree { optionsBoolArray.append((I18N.BakeryList.glutenfree, true)) } + if isVegan { optionsBoolArray.append((I18N.BakeryList.vegan, true)) } + if isNutFree { optionsBoolArray.append((I18N.BakeryList.nutfree, true)) } + if isSugarFree { optionsBoolArray.append((I18N.BakeryList.noSugar, true)) } + return optionsBoolArray + } } extension BakeryListResponseDTO { diff --git a/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift b/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift index b775b5aa..801c559f 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/Model/MyPageDTO.swift @@ -22,7 +22,7 @@ extension MyPageDTO { breadTypeName: "맛 • 다이어트", isGlutenFree: true, isVegan: true, - isNutFree: true, + isNutFree: false, isSugarFree: true)) } } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index 0031200b..88dbaead 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -16,7 +16,7 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { private let myPageData = MyPageDTO.dummyData() private let username = "빵순이빵돌이" -// private lazy var myPageTagData = myPageData.breadType.configureTrueOptions() + private lazy var myPageTagData = myPageData.breadType.configureTrueOptions() // MARK: - UI Property @@ -204,12 +204,19 @@ extension MyPageCollectionViewHeader: UICollectionViewDelegate {} extension MyPageCollectionViewHeader: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 5 + return myPageTagData.filter { $0.1 == true }.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) - cell.configureTagTitle("test") + cell.configureTagTitle(myPageTagData[indexPath.item].0) +// switch indexPath.item { +// case 0: +// case 1: cell.configureTagTitle("비건빵") +// case 2: cell.configureTagTitle("넛프리") +// case 3: cell.configureTagTitle("저당,무설탕") +// default: return UICollectionViewCell() +// } return cell } From b9dbff55d5966717db8e108187ee8b883e54b7bd Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 01:10:59 +0900 Subject: [PATCH 131/153] [Del] #51 - deleted unused codes --- .../MyPage/View/MyPageCollectionViewHeader.swift | 7 ------- 1 file changed, 7 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index 88dbaead..9c0d79dd 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -210,13 +210,6 @@ extension MyPageCollectionViewHeader: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: DescriptionCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.configureTagTitle(myPageTagData[indexPath.item].0) -// switch indexPath.item { -// case 0: -// case 1: cell.configureTagTitle("비건빵") -// case 2: cell.configureTagTitle("넛프리") -// case 3: cell.configureTagTitle("저당,무설탕") -// default: return UICollectionViewCell() -// } return cell } From 50f626c64484644deb1d11e12a2b623d160d0c31 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 01:17:53 +0900 Subject: [PATCH 132/153] [Setting] edited PR template --- .github/PULL_REQUEST_TEMPLATE.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 12818f10..ede83f1d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,12 +1,3 @@ ---- -name: "Pull Request Template" -about: 기본 PR 템플릿입니다. -title: '[종류] #브랜치번호 - PR에 대한 설명' -labels: '' -assignees: '' - ---- - ## 🌁 Background @@ -14,6 +5,10 @@ assignees: '' ## 📱 Screenshot +| iPhone SE2 | iPhone 13 mini | iPhone 13 Pro | +|----|----|----| +| | | | + ## 👩‍💻 Contents From bf385ee361e303a413a652609f9060506cf07985 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 15:01:24 +0900 Subject: [PATCH 133/153] [Add] #39 - duplicated model changed --- GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift index 6b83f6f7..86fe98b1 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/Model/FilterDTO.swift @@ -9,7 +9,7 @@ import Foundation struct FilterRequestDTO { var mainPurpose: String - var breadType: BreadType + var breadType: BreadRequestType var nutrientType: NutrientType static var sharedData = FilterRequestDTO() @@ -26,7 +26,7 @@ struct FilterRequestDTO { } } -struct BreadType { +struct BreadRequestType { var isGlutenFree: Bool var isVegan: Bool var isNutFree: Bool From a38a7cbc74056b5a50b1e7b84b802956e8259902 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 15:28:30 +0900 Subject: [PATCH 134/153] [Feat] #39 - connected filterview to homeview --- .../ViewControllers/FilterBreadTypeViewController.swift | 3 +-- .../ViewControllers/FilterIngredientViewController.swift | 7 +++++-- .../ViewControllers/FilterPurposeViewController.swift | 2 +- .../Home/ViewControllers/HomeViewController.swift | 3 +++ GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift | 9 +++++++++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift index 6387db91..ab1aac5f 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterBreadTypeViewController.swift @@ -133,8 +133,7 @@ final class FilterBreadTypeViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in - Utils.push(self?.navigationController, FilterIngredientViewController(maxSteps: 6)) - dump(FilterRequestDTO.sharedData) + Utils.push(self?.navigationController, FilterIngredientViewController(maxSteps: self?.maxSteps ?? 0)) } nextButton.addAction(action, for: .touchUpInside) } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift index 7a1d6ce3..fe6bde21 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterIngredientViewController.swift @@ -131,8 +131,11 @@ final class FilterIngredientViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in - // TODO: to next filter selection - dump(FilterRequestDTO.sharedData) + if self?.maxSteps != 6 { + self?.navigationController?.popToRootViewController(animated: true) + } else { + + } } nextButton.addAction(action, for: .touchUpInside) } diff --git a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift index ac12ebc9..d2f31ba8 100644 --- a/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Filter/ViewControllers/FilterPurposeViewController.swift @@ -126,7 +126,7 @@ final class FilterPurposeViewController: BaseViewController { private func setNextButtonAction() { let action = UIAction { [weak self] _ in - Utils.push(self?.navigationController, FilterBreadTypeViewController(maxSteps: 6)) + Utils.push(self?.navigationController, FilterBreadTypeViewController(maxSteps: self?.maxSteps ?? 0)) dump(FilterRequestDTO.sharedData) } nextButton.addAction(action, for: .touchUpInside) diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift index e7449287..7c7d9157 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift @@ -57,6 +57,9 @@ final class HomeViewController: BaseViewController { $0.gotoNextView = { Utils.push(self.navigationController, SearchViewController()) } + $0.addActionToFilterButton { + Utils.push(self.navigationController, FilterPurposeViewController(maxSteps: 3, username: "찐빵대빵")) + } } collectionView.do { diff --git a/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift b/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift index 49693010..8eeacb8f 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Views/HomeTopView.swift @@ -93,4 +93,13 @@ final class HomeTopView: UIView { func setTitle(_ title: String) { titleLabel.text = "\(title)님\n건빵에 오신걸 환영해요!" } + + // MARK: - Custom Method + + func addActionToFilterButton(_ action: @escaping () -> Void) { + filterButton.addAction(UIAction { _ in + action() + }, for: .touchUpInside) + } + } From 75b94954b295cd72330fce80d0d1bf7083701944 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 15:38:15 +0900 Subject: [PATCH 135/153] =?UTF-8?q?[Fix]=20#47=20-=20=ED=99=88=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=BB=AC=EB=A0=89=EC=85=98=EB=B7=B0=20=EC=85=80=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/ViewControllers/HomeReviewCollectionViewCell.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift index 1f45b1fc..0191d382 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeReviewCollectionViewCell.swift @@ -143,8 +143,8 @@ final class HomeReviewCollectionViewCell: UICollectionViewCell { if !self.reviewList[index].firstMaxRecommendKeyword.isEmpty { self.keywords.append(data.firstMaxRecommendKeyword) } - if !self.reviewList[index].secondMaxRecommendKeyword.isEmpty { - self.keywords.append(data.secondMaxRecommendKeyword) + if self.reviewList[index].secondMaxRecommendKeyword != nil { + self.keywords.append(data.secondMaxRecommendKeyword ?? "" ) } } } From afe1d47cb24c23d56df39383ebfe7c22cc13eecc Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 15:41:09 +0900 Subject: [PATCH 136/153] =?UTF-8?q?[Fix]=20#47=20-=20=EB=A6=B0=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift index 1362ddc4..9cb53c9c 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift @@ -39,7 +39,7 @@ final class HomeHeaderView: UICollectionReusableView { } func setctionHeaderTitle(_ section: String) { - var attributedString = NSMutableAttributedString ( + let attributedString = NSMutableAttributedString( string: section, attributes: [ .font: UIFont.pretendardBold(20), From 02e76c7fa567bc1a10884028f5f8cd10c6397299 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 15:56:39 +0900 Subject: [PATCH 137/153] =?UTF-8?q?[Fix]=20#42=20-=20MySavedBakery=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySavedBakeryViewController.swift | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index ac0cd0c7..1b36adc2 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -82,7 +82,20 @@ final class MySavedBakeryViewController: BaseViewController { dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.getViewType(.defaultType) - cell.updateUI(data: item, index: indexPath.item) + if let bakeryListItem = item as? BakeryListResponseDTO { + let bakeryListProtocols = BakeryListProtocols( + bakeryName: bakeryListItem.bakeryName, + bookmarkCount: bakeryListItem.bookmarkCount, + isBooked: bakeryListItem.isBooked, + isHACCP: bakeryListItem.isHACCP, + isVegan: bakeryListItem.isVegan, + isNonGMO: bakeryListItem.isNonGMO, + firstNearStation: bakeryListItem.firstNearStation, + secondNearStation: bakeryListItem.secondNearStation ?? "", + breadType: bakeryListItem.breadType + ) + cell.updateUI(data: bakeryListProtocols, index: indexPath.item) + } return cell }) } From de606269ae778dbb8865bc8cfc17564527608579 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 15:58:57 +0900 Subject: [PATCH 138/153] [Feat] #51 - changed BreadType to BreadResponseType --- GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift | 4 ++-- .../MyPage/ViewControllers/MyPageViewController.swift | 4 ---- .../Presentation/Search/Model/SearchResponseDTO.swift | 6 +++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift index 8182d7e8..c092a2bf 100644 --- a/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift +++ b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift @@ -26,7 +26,7 @@ protocol BakeryListProtocol { var firstNearStation: String { get } var secondNearStation: String? { get } - var breadType: BreadType { get } + var breadType: BreadResponseType { get } } struct BakeryListProtocols: BakeryListProtocol { @@ -41,6 +41,6 @@ struct BakeryListProtocols: BakeryListProtocol { var firstNearStation: String var secondNearStation: String? = "" - var breadType: BreadType + var breadType: BreadResponseType } diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index 0fe64446..fa6bc881 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -12,10 +12,6 @@ import Then final class MyPageViewController: BaseViewController { - - // MARK: - Property - - // MARK: - UI Property private let flowLayout = UICollectionViewFlowLayout() diff --git a/GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift b/GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift index 9651fd88..ba519acd 100644 --- a/GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/Search/Model/SearchResponseDTO.swift @@ -22,7 +22,7 @@ struct SearchBakeryList: Hashable, BakeryListProtocol { let isHACCP: Bool let isVegan: Bool let isNonGMO: Bool - var breadType: BreadType + var breadType: BreadResponseType let firstNearStation: String var secondNearStation: String? let isBooked: Bool @@ -38,6 +38,6 @@ extension SearchBakeryList { static let searchBakeryItem: [SearchBakeryList] = [SearchBakeryList(bakeryID: 1, bakeryName: "히히히히", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .searchBreadType, firstNearStation: "헤헤", secondNearStation: "두번째역", isBooked: true, bookmarkCount: 5, bakeryPicture: "")] } -extension BreadType { - static let searchBreadType: BreadType = BreadType(breadTypeID: 3, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: false, isSugarFree: true) +extension BreadResponseType { + static let searchBreadType: BreadResponseType = BreadResponseType(breadTypeID: 3, breadTypeName: "글루텐프리", isGlutenFree: true, isVegan: true, isNutFree: false, isSugarFree: true) } From f2f434857f8aee0c86b29d6eb39123caa62f69bf Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 16:49:39 +0900 Subject: [PATCH 139/153] [Feat] #51 - connected MyPage and Filter in progress --- .../MyPage/View/MyPageCollectionViewHeader.swift | 8 ++++++++ .../MyPage/ViewControllers/MyPageViewController.swift | 3 +++ 2 files changed, 11 insertions(+) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index 9c0d79dd..8640b5c5 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -193,6 +193,14 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { filterCollectionView.dataSource = self } + // MARK: - Custom Method + + func addNextButtonAction(_ action: @escaping () -> Void) { + rightChevronButton.addAction(UIAction { _ in + action() + }, for: .touchUpInside) + } + } // MARK: - UICollectionViewDelegate extension diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index fa6bc881..63ac8687 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -134,6 +134,9 @@ extension MyPageViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { let indexPath = IndexPath(item: 0, section: section) let header: MyPageCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) + header.addNextButtonAction { +// Utils.push(self.navigationController, ) + } switch section { case 0: return header.systemLayoutSizeFitting(.init(width: collectionView.frame.width, height: UIView.layoutFittingExpandedSize.height), From 4cf35747188005fcef91e4629a2492f42576af6e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 16:54:30 +0900 Subject: [PATCH 140/153] =?UTF-8?q?[Fix]=20#42=20=20-=20=20=EB=B9=B5?= =?UTF-8?q?=EC=A7=91=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20DTO=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Protocol/BakeryTypeProtocol.swift | 32 +++++++++---------- .../BakeryListViewController.swift | 27 ++++++++-------- .../Model/BakeryListResponseDTO.swift | 2 +- .../ViewControllers/HomeViewController.swift | 2 +- .../MySavedBakeryViewController.swift | 13 +------- .../SearchViewController.swift | 13 +------- 6 files changed, 33 insertions(+), 56 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift index 8182d7e8..01a33456 100644 --- a/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift +++ b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift @@ -28,19 +28,19 @@ protocol BakeryListProtocol { var breadType: BreadType { get } } - -struct BakeryListProtocols: BakeryListProtocol { - var bakeryName: String - var bookmarkCount: Int - var isBooked: Bool - - var isHACCP: Bool - var isVegan: Bool - var isNonGMO: Bool - - var firstNearStation: String - var secondNearStation: String? = "" - - var breadType: BreadType - -} +// +//struct Bakery: BakeryListProtocol { +// var bakeryName: String +// var bookmarkCount: Int +// var isBooked: Bool +// +// var isHACCP: Bool +// var isVegan: Bool +// var isNonGMO: Bool +// +// var firstNearStation: String +// var secondNearStation: String? = "" +// +// var breadType: BreadType +// +//} diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index 42b091b4..90b7c48a 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -84,20 +84,19 @@ final class BakeryListViewController: BaseViewController { dataSource = DataSource(collectionView: bakeryListCollectionView, cellProvider: { collectionView, indexPath, item in let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.getViewType(.defaultType) - if let bakeryListItem = item as? BakeryListResponseDTO { - let bakeryListProtocols = BakeryListProtocols( - bakeryName: bakeryListItem.bakeryName, - bookmarkCount: bakeryListItem.bookmarkCount, - isBooked: bakeryListItem.isBooked, - isHACCP: bakeryListItem.isHACCP, - isVegan: bakeryListItem.isVegan, - isNonGMO: bakeryListItem.isNonGMO, - firstNearStation: bakeryListItem.firstNearStation, - secondNearStation: bakeryListItem.secondNearStation ?? "", - breadType: bakeryListItem.breadType - ) - cell.updateUI(data: bakeryListProtocols, index: indexPath.item) - } +// if let bakeryListItem = item as? BakeryListResponseDTO { +// let bakeryListProtocols = BakeryListProtocols( +// bakeryName: bakeryListItem.bakeryName, +// bookmarkCount: bakeryListItem.bookmarkCount, +// isBooked: bakeryListItem.isBooked, +// isHACCP: bakeryListItem.isHACCP, +// isVegan: bakeryListItem.isVegan, +// isNonGMO: bakeryListItem.isNonGMO, +// firstNearStation: bakeryListItem.firstNearStation, +// secondNearStation: bakeryListItem.secondNearStation ?? "", +// breadType: bakeryListItem.breadType +// ) + cell.updateUI(data: item, index: indexPath.item) return cell }) } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index d886f93e..b472e810 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -7,7 +7,7 @@ // MARK: - BakeryListResponseDTO -struct BakeryListResponseDTO: Hashable { +struct BakeryListResponseDTO: Hashable, BakeryListProtocol { let bakeryID: Int let bakeryName: String let bakeryPicture: String diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift index 5adda319..510ad9f8 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift @@ -73,7 +73,7 @@ final class HomeViewController: BaseViewController { topView.snp.makeConstraints { $0.top.equalTo(safeArea) $0.directionalHorizontalEdges.equalTo(safeArea) - $0.height.equalTo(convertByHeightRatio(200)) + $0.height.equalTo(200) } collectionView.snp.makeConstraints { diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index 1b36adc2..1f6bb712 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -83,18 +83,7 @@ final class MySavedBakeryViewController: BaseViewController { let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.getViewType(.defaultType) if let bakeryListItem = item as? BakeryListResponseDTO { - let bakeryListProtocols = BakeryListProtocols( - bakeryName: bakeryListItem.bakeryName, - bookmarkCount: bakeryListItem.bookmarkCount, - isBooked: bakeryListItem.isBooked, - isHACCP: bakeryListItem.isHACCP, - isVegan: bakeryListItem.isVegan, - isNonGMO: bakeryListItem.isNonGMO, - firstNearStation: bakeryListItem.firstNearStation, - secondNearStation: bakeryListItem.secondNearStation ?? "", - breadType: bakeryListItem.breadType - ) - cell.updateUI(data: bakeryListProtocols, index: indexPath.item) + cell.updateUI(data: bakeryListItem, index: indexPath.item) } return cell }) diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift index af5b0c00..f9327df1 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/SearchViewController.swift @@ -107,18 +107,7 @@ final class SearchViewController: BaseViewController { let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.getViewType(.defaultType) if let searchBakeryItem = item as? SearchBakeryList { - let bakeryListProtocols = BakeryListProtocols( - bakeryName: searchBakeryItem.bakeryName, - bookmarkCount: searchBakeryItem.bookmarkCount, - isBooked: searchBakeryItem.isBooked, - isHACCP: searchBakeryItem.isHACCP, - isVegan: searchBakeryItem.isVegan, - isNonGMO: searchBakeryItem.isNonGMO, - firstNearStation: searchBakeryItem.firstNearStation, - secondNearStation: searchBakeryItem.secondNearStation ?? "", - breadType: searchBakeryItem.breadType - ) - cell.updateUI(data: bakeryListProtocols, index: indexPath.item) + cell.updateUI(data: searchBakeryItem, index: indexPath.item) } return cell } From 81c0fd7692353ed5322f4e5b6d581d3c7a9a092b Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 16:57:33 +0900 Subject: [PATCH 141/153] =?UTF-8?q?[Del]=20#42=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Global/Protocol/BakeryTypeProtocol.swift | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift index 01a33456..c8a5bea9 100644 --- a/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift +++ b/GEON-PPANG-iOS/Global/Protocol/BakeryTypeProtocol.swift @@ -28,19 +28,3 @@ protocol BakeryListProtocol { var breadType: BreadType { get } } -// -//struct Bakery: BakeryListProtocol { -// var bakeryName: String -// var bookmarkCount: Int -// var isBooked: Bool -// -// var isHACCP: Bool -// var isVegan: Bool -// var isNonGMO: Bool -// -// var firstNearStation: String -// var secondNearStation: String? = "" -// -// var breadType: BreadType -// -//} From a6e1991f508e42282c8defcee36d1eae51811e13 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 17:05:50 +0900 Subject: [PATCH 142/153] [Feat] #51 - connected MyPage and Filter --- GEON-PPANG-iOS/Application/SceneDelegate.swift | 2 +- .../MyPage/ViewControllers/MyPageViewController.swift | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GEON-PPANG-iOS/Application/SceneDelegate.swift b/GEON-PPANG-iOS/Application/SceneDelegate.swift index 619ca26f..5a66dd4c 100644 --- a/GEON-PPANG-iOS/Application/SceneDelegate.swift +++ b/GEON-PPANG-iOS/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let window = UIWindow(windowScene: windowScene) window.overrideUserInterfaceStyle = UIUserInterfaceStyle.light - let rootViewController = FilterPurposeViewController(maxSteps: 6, username: "Id") + let rootViewController = TabBarController() let navigationController = UINavigationController(rootViewController: rootViewController) navigationController.isNavigationBarHidden = true window.rootViewController = navigationController diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index 63ac8687..d05b65b9 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -100,6 +100,9 @@ extension MyPageViewController: UICollectionViewDataSource { switch indexPath.section { case 0: let header: MyPageCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) + header.addNextButtonAction { + Utils.push(self.navigationController, FilterPurposeViewController(maxSteps: 3, username: "찐빵대빵")) + } return header case 1: let footer: MyPageCollectionViewFooter = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, indexPath: indexPath) @@ -134,9 +137,6 @@ extension MyPageViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { let indexPath = IndexPath(item: 0, section: section) let header: MyPageCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) - header.addNextButtonAction { -// Utils.push(self.navigationController, ) - } switch section { case 0: return header.systemLayoutSizeFitting(.init(width: collectionView.frame.width, height: UIView.layoutFittingExpandedSize.height), From 5e97bfd644ab66b09705976adfe67901653146d4 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 18:44:25 +0900 Subject: [PATCH 143/153] =?UTF-8?q?[Fix]=20#42=20-=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A0=80=EC=9E=A5=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EB=B7=B0=20=EC=A0=84=ED=99=98=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyPage/View/MyPageCollectionViewHeader.swift | 12 ++++++++++++ .../ViewControllers/MyPageViewController.swift | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift index 8640b5c5..6554da3c 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/View/MyPageCollectionViewHeader.swift @@ -17,6 +17,8 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { private let myPageData = MyPageDTO.dummyData() private let username = "빵순이빵돌이" private lazy var myPageTagData = myPageData.breadType.configureTrueOptions() + var svedBakeryTapped: (() -> Void)? + var myReviewsTapped: (() -> Void)? // MARK: - UI Property @@ -186,6 +188,16 @@ final class MyPageCollectionViewHeader: UICollectionReusableView { seperatorView.do { $0.backgroundColor = .gbbPoint1 } + bookmarkButton.do { + $0.addButtonAction { + self.svedBakeryTapped?() + } + } + myReviewButton.do { + $0.addButtonAction { + self.myReviewsTapped?() + } + } } private func setDelegate() { diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index d05b65b9..80f94193 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -37,6 +37,7 @@ final class MyPageViewController: BaseViewController { } override func setUI() { + self.navigationController?.navigationBar.isHidden = false flowLayout.do { $0.scrollDirection = .vertical $0.sectionInset = .init(top: 8, left: 0, bottom: 0, right: 0) @@ -103,6 +104,12 @@ extension MyPageViewController: UICollectionViewDataSource { header.addNextButtonAction { Utils.push(self.navigationController, FilterPurposeViewController(maxSteps: 3, username: "찐빵대빵")) } + header.myReviewsTapped = { + print("tapped") + } + header.svedBakeryTapped = { + Utils.push(self.navigationController, MySavedBakeryViewController()) + } return header case 1: let footer: MyPageCollectionViewFooter = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, indexPath: indexPath) From a7328a73a39c8dcee9ab48b812fa5feee557a63b Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 19:04:32 +0900 Subject: [PATCH 144/153] =?UTF-8?q?[Fix]=20#42=20-=20=EB=B7=B0=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=B7=B0=20=EC=A0=84=ED=99=98=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyPage/ViewControllers/MyPageViewController.swift | 2 +- .../ViewControllers/MySavedBakeryViewController.swift | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index 80f94193..6ac6ec3b 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -37,7 +37,7 @@ final class MyPageViewController: BaseViewController { } override func setUI() { - self.navigationController?.navigationBar.isHidden = false + flowLayout.do { $0.scrollDirection = .vertical $0.sectionInset = .init(top: 8, left: 0, bottom: 0, right: 0) diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index 1f6bb712..6d334df2 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -59,7 +59,8 @@ final class MySavedBakeryViewController: BaseViewController { override func setUI() { naviView.do { $0.addBackButtonAction(UIAction { _ in - self.navigationController?.popToViewController(self, animated: true) + dump(self.navigationController) + self.navigationController?.popViewController(animated: true) }) $0.configureLeftTitle(to: I18N.MySavedBakery.naviTitle) } From 53713d516c6de59c4ab52df6ca15267ca112d274 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 19:39:20 +0900 Subject: [PATCH 145/153] =?UTF-8?q?[Fix]=20#42=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GEON-PPANG-iOS/Global/Enum/FilterEnum.swift | 1 - .../BakeryListCollectionViewCell.swift | 28 ++--- .../BakeryListViewController.swift | 16 +-- .../Model/BakeryListResponseDTO.swift | 2 +- .../HomeBottomCollectionViewCell.swift | 1 - .../ViewControllers/HomeViewController.swift | 2 +- .../MySavedBakeryViewController.swift | 101 +++++++++++++----- 7 files changed, 94 insertions(+), 57 deletions(-) diff --git a/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift b/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift index b3a27ba9..1b984e9b 100644 --- a/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift +++ b/GEON-PPANG-iOS/Global/Enum/FilterEnum.swift @@ -75,4 +75,3 @@ enum FilterIngredientType: String, CaseIterable { case isIngredientOpen = "원재료 공개" case isNotOpen = "비공개" } - diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift index 7781fb25..771d7971 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListCollectionViewCell.swift @@ -123,23 +123,23 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { regionStackView.removeSecondRegion() } regionStackView.getRegionName(data.firstNearStation, data.secondNearStation ?? "") - + if data.breadType.isGlutenFree { breadTypeTag.append(I18N.BakeryList.glutenfree) } - + if data.breadType.isNutFree { breadTypeTag.append(I18N.BakeryList.nutfree) } - + if data.breadType.isVegan { breadTypeTag.append(I18N.BakeryList.vegan) } - + if data.breadType.isSugarFree { breadTypeTag.append(I18N.BakeryList.noSugar) } - + collectionView.snp.remakeConstraints { $0.height.equalTo(getHeight(breadTypeTag)) $0.top.equalTo(bakeryTitle.snp.bottom).offset(10) @@ -147,14 +147,14 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { $0.trailing.equalToSuperview().offset(-70) } } - + func getViewType(_ type: BakeryViewType) { bakeryViewType = type } - + func defaultViewButton() { addSubview(bookMarkButton) - + bookMarkButton.do { $0.configuration?.imagePlacement = NSDirectionalRectEdge.top $0.configuration?.imagePadding = 4 @@ -163,27 +163,27 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { print("default") }, for: .touchUpInside) } - + bookMarkButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.trailing.equalToSuperview().offset(-24) $0.size.equalTo(34) } } - + func getHeight(_ list: [String]) -> CGFloat { var width: CGFloat = 0 list.forEach { width += $0.size(withAttributes: [NSAttributedString.Key.font: UIFont.pretendardMedium(13)]).width + 4 } width -= 4 - + return width < (UIScreen.main.bounds.width - 206) ? 25 : 60 } - + func reviewViewButton() { addSubview(arrowButton) - + regionStackView.getBackgroundColor(.gbbGray700!) arrowButton.do { $0.setImage(.rightArrowIcon, for: .normal) @@ -191,7 +191,7 @@ final class BakeryListCollectionViewCell: UICollectionViewCell { print("review") }, for: .touchUpInside) } - + arrowButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.trailing.equalToSuperview().offset(-12) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index 90b7c48a..d8f79b80 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -51,7 +51,7 @@ final class BakeryListViewController: BaseViewController { bakeryTopView.snp.makeConstraints { $0.top.equalTo(safeArea) $0.directionalHorizontalEdges.equalTo(safeArea) - $0.height.equalTo(convertByHeightRatio(91)) + $0.height.equalTo(91) } bakeryFilterView.snp.makeConstraints { @@ -84,19 +84,7 @@ final class BakeryListViewController: BaseViewController { dataSource = DataSource(collectionView: bakeryListCollectionView, cellProvider: { collectionView, indexPath, item in let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) cell.getViewType(.defaultType) -// if let bakeryListItem = item as? BakeryListResponseDTO { -// let bakeryListProtocols = BakeryListProtocols( -// bakeryName: bakeryListItem.bakeryName, -// bookmarkCount: bakeryListItem.bookmarkCount, -// isBooked: bakeryListItem.isBooked, -// isHACCP: bakeryListItem.isHACCP, -// isVegan: bakeryListItem.isVegan, -// isNonGMO: bakeryListItem.isNonGMO, -// firstNearStation: bakeryListItem.firstNearStation, -// secondNearStation: bakeryListItem.secondNearStation ?? "", -// breadType: bakeryListItem.breadType -// ) - cell.updateUI(data: item, index: indexPath.item) + cell.updateUI(data: item, index: indexPath.item) return cell }) } diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift index 3c8421a2..0095da3b 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/Model/BakeryListResponseDTO.swift @@ -44,7 +44,7 @@ struct BreadResponseType: Codable, Hashable { extension BakeryListResponseDTO { static let item: [BakeryListResponseDTO] = [BakeryListResponseDTO(bakeryID: 1, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem1, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7), BakeryListResponseDTO(bakeryID: 2, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem2, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7), - BakeryListResponseDTO(bakeryID: 3, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem3, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7) + BakeryListResponseDTO(bakeryID: 3, bakeryName: "건대 초코빵", bakeryPicture: "ursl", isHACCP: true, isVegan: true, isNonGMO: true, breadType: .breadItem3, firstNearStation: "건대역", secondNearStation: "건대", isBooked: true, bookmarkCount: 7) ] } extension BreadResponseType { diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift index 735a494e..9dcec4a9 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeBottomCollectionViewCell.swift @@ -44,7 +44,6 @@ final class HomeBottomCollectionViewCell: UICollectionViewCell { $0.basic(text: I18N.Home.bottomSectionTitle, font: .captionM2!, color: .gbbGray300!) - } } diff --git a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift index 525fc420..6cd3e33f 100644 --- a/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift +++ b/GEON-PPANG-iOS/Presentation/Home/ViewControllers/HomeViewController.swift @@ -135,7 +135,7 @@ final class HomeViewController: BaseViewController { dataSource?.supplementaryViewProvider = { (collectionView, _, indexPath) in let header: HomeHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) - + switch indexPath.section { case 0: header.setctionHeaderTitle(Sections.bakery.title) diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index 6d334df2..f1d4c658 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -13,13 +13,14 @@ import Then final class MySavedBakeryViewController: BaseViewController { // MARK: - Property - + enum Section { - case main + case main, empty } - typealias DataSource = UICollectionViewDiffableDataSource + typealias DataSource = UICollectionViewDiffableDataSource private var dataSource: DataSource? - private var filterlist: [BakeryListResponseDTO] = BakeryListResponseDTO.item + private var savedList: [BakeryListResponseDTO] = BakeryListResponseDTO.item + private var currentSection: [Section] = [.empty] private lazy var safeArea = self.view.safeAreaLayoutGuide @@ -32,9 +33,9 @@ final class MySavedBakeryViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - + setRegistration() - setupDataSource() + setDataSource() setReloadData() } @@ -68,32 +69,82 @@ final class MySavedBakeryViewController: BaseViewController { private func setRegistration() { collectionView.register(cell: BakeryListCollectionViewCell.self) + collectionView.register(cell: EmptyCollectionViewCell.self) } - private func layout() -> UICollectionViewLayout { - var config = UICollectionLayoutListConfiguration(appearance: .plain) - config.backgroundColor = .clear - config.showsSeparators = true - - let layout = UICollectionViewCompositionalLayout.list(using: config) - return layout - } - - private func setupDataSource() { + private func setDataSource() { dataSource = DataSource(collectionView: collectionView, cellProvider: { collectionView, indexPath, item in - let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) - cell.getViewType(.defaultType) - if let bakeryListItem = item as? BakeryListResponseDTO { - cell.updateUI(data: bakeryListItem, index: indexPath.item) + let section = self.dataSource?.snapshot().sectionIdentifiers[indexPath.section] + switch section { + case .main: + let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.defaultType) + if let bakeryListItem = item as? BakeryListResponseDTO { + cell.updateUI(data: bakeryListItem, index: indexPath.item) + } + return cell + case .empty, .none: + let cell: EmptyCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.noBookMark) + return cell } - return cell }) } - + private func setReloadData() { - var snapshot = NSDiffableDataSourceSnapshot() + var snapshot = NSDiffableDataSourceSnapshot() defer { dataSource?.apply(snapshot, animatingDifferences: false)} - snapshot.appendSections([.main]) - snapshot.appendItems(filterlist) + snapshot.appendSections([.empty]) + snapshot.appendItems([0]) + } + + private func updateDataSource(data: BakeryListResponseDTO) { + guard var snapshot = dataSource?.snapshot() else { return } + if data.bookmarkCount == 0 { + snapshot.deleteSections(currentSection) + snapshot.appendItems([0], toSection: .empty) + currentSection = [.empty] + dataSource?.apply(snapshot) + } else { + snapshot.deleteSections(currentSection) + snapshot.appendItems(savedList, toSection: .main) + currentSection = [.main] + dataSource?.apply(snapshot) + } + } + + private func layout() -> UICollectionViewLayout { + let layout = UICollectionViewCompositionalLayout { sectionIndex, layoutEnvirnment in + let section = self.dataSource?.snapshot().sectionIdentifiers[sectionIndex] + switch section { + case .main: + var config = UICollectionLayoutListConfiguration(appearance: .plain) + config.backgroundColor = .clear + config.showsSeparators = true + + let layoutSection = NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvirnment) + return layoutSection + case .empty, .none: + return self.normalSection() + } + } + return layout + } + + private func normalSection() -> NSCollectionLayoutSection { + let item = NSCollectionLayoutItem(layoutSize: .init( + widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1)) + ) + let group = NSCollectionLayoutGroup.vertical( + layoutSize: .init( + widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1) + ), + subitem: item, + count: 1 + ) + let section = NSCollectionLayoutSection(group: group) + return section } } From f32c541053ec3ee71911711f6e85a828580e6c91 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 19:43:16 +0900 Subject: [PATCH 146/153] =?UTF-8?q?[Add]=20#42=20-=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20lineView=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/MySavedBakeryViewController.swift | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index f1d4c658..f851a833 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -27,6 +27,7 @@ final class MySavedBakeryViewController: BaseViewController { // MARK: - UI Property private let naviView = CustomNavigationBar() + private let lineView = LineView() private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) // MARK: - Life Cycle @@ -43,12 +44,18 @@ final class MySavedBakeryViewController: BaseViewController { override func setLayout() { view.addSubviews(naviView, collectionView) + naviView.addSubview(lineView) naviView.snp.makeConstraints { $0.top.equalToSuperview() $0.directionalHorizontalEdges.equalTo(safeArea) } + lineView.snp.makeConstraints { + $0.directionalHorizontalEdges.equalToSuperview() + $0.height.equalTo(1) + $0.bottom.equalToSuperview() + } collectionView.snp.makeConstraints { $0.top.equalTo(naviView.snp.bottom) $0.directionalHorizontalEdges.equalTo(safeArea) @@ -94,8 +101,8 @@ final class MySavedBakeryViewController: BaseViewController { private func setReloadData() { var snapshot = NSDiffableDataSourceSnapshot() defer { dataSource?.apply(snapshot, animatingDifferences: false)} - snapshot.appendSections([.empty]) - snapshot.appendItems([0]) + snapshot.appendSections([.main]) + snapshot.appendItems(savedList) } private func updateDataSource(data: BakeryListResponseDTO) { From 877ab43ce1685ed70c76eb96e05ba7901e86190e Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 19:55:02 +0900 Subject: [PATCH 147/153] =?UTF-8?q?[Fix]=20#42=20-=20bookmark=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/MySavedBakeryViewController.swift | 6 +++++- .../Search/ViewControllers/EmptyCollectionViewCell.swift | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index f851a833..48224037 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -43,6 +43,7 @@ final class MySavedBakeryViewController: BaseViewController { // MARK: - Setting override func setLayout() { + view.addSubviews(naviView, collectionView) naviView.addSubview(lineView) @@ -92,7 +93,7 @@ final class MySavedBakeryViewController: BaseViewController { return cell case .empty, .none: let cell: EmptyCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) - cell.getViewType(.noBookMark) + cell.getViewType(.noBookmark) return cell } }) @@ -121,6 +122,7 @@ final class MySavedBakeryViewController: BaseViewController { } private func layout() -> UICollectionViewLayout { + let layout = UICollectionViewCompositionalLayout { sectionIndex, layoutEnvirnment in let section = self.dataSource?.snapshot().sectionIdentifiers[sectionIndex] switch section { @@ -135,6 +137,7 @@ final class MySavedBakeryViewController: BaseViewController { return self.normalSection() } } + return layout } @@ -152,6 +155,7 @@ final class MySavedBakeryViewController: BaseViewController { count: 1 ) let section = NSCollectionLayoutSection(group: group) + return section } } diff --git a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift index 636d07b4..117ac4e9 100644 --- a/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift +++ b/GEON-PPANG-iOS/Presentation/Search/ViewControllers/EmptyCollectionViewCell.swift @@ -12,14 +12,14 @@ import Then enum EmptyType: String { case noReview = "작성된 리뷰가 없어요!" - case noBookMark = "저장 목록이 없어요!" + case noBookmark = "저장 목록이 없어요!" case noSearch = "검색결과가 없어요\n다른 키워드로 검색해보세요!" case initialize = "궁금하신 건빵집을\n검색해보세요!" var icon: UIImage { switch self { case .noReview: return .noReviewImage - case .noBookMark: return .noBookmarkImage + case .noBookmark: return .noBookmarkImage case .noSearch: return .noSearchResultImage case .initialize: return .searchImage } @@ -67,7 +67,7 @@ final class EmptyCollectionViewCell: UICollectionViewCell { switch emptyType { case .initialize, .noSearch: $0.centerY.equalToSuperview().inset(-33) - case .noReview, .noBookMark: + case .noReview, .noBookmark: $0.centerY.equalToSuperview().inset(-22) } } @@ -91,7 +91,7 @@ final class EmptyCollectionViewCell: UICollectionViewCell { emptyLabel.text = type.rawValue switch type { - case .initialize, .noBookMark, .noReview: + case .initialize, .noBookmark, .noReview: return emptyLabel.basic(text: emptyType.rawValue, font: .title2!, color: .gbbGray300!) case .noSearch: return emptyLabel.partFontChange(targetString: "다른 키워드로 검색해보세요!", font: .subHead!) From 37f3a039258cd5d06ca801360d9dd6316d942e6c Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 20:32:14 +0900 Subject: [PATCH 148/153] =?UTF-8?q?[Fix]=20#43=20-=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ViewControllers/BakeryListViewController.swift | 1 - .../Presentation/Home/Views/HomeHeaderView.swift | 2 +- .../ViewControllers/MyReviewsViewController.swift | 2 +- .../MySavedBakeryViewController.swift | 13 +++---------- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift index ef22de09..22539736 100644 --- a/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift +++ b/GEON-PPANG-iOS/Presentation/BakeryList/ViewControllers/BakeryListViewController.swift @@ -64,7 +64,6 @@ final class BakeryListViewController: BaseViewController { $0.top.equalTo(bakeryFilterView.snp.bottom) $0.leading.equalTo(safeArea).offset(-24) $0.trailing.equalTo(safeArea) -// $0.directionalHorizontalEdges.equalTo(safeArea) $0.bottom.equalToSuperview() } } diff --git a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift index 30fdd4a9..9cb53c9c 100644 --- a/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift +++ b/GEON-PPANG-iOS/Presentation/Home/Views/HomeHeaderView.swift @@ -33,7 +33,7 @@ final class HomeHeaderView: UICollectionReusableView { addSubview(headerLabel) headerLabel.snp.makeConstraints { - $0.leading.equalToSuperview().offset(24) + $0.leading.equalToSuperview() $0.bottom.equalToSuperview() } } diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift index 49fe8be7..ba55b5f4 100644 --- a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift @@ -49,7 +49,7 @@ final class MyReviewsViewController: BaseViewController { override func setUI() { naviView.do { $0.addBackButtonAction(UIAction { _ in - self.navigationController?.popToViewController(self, animated: true) + self.navigationController?.popViewController(animated: true) }) $0.configureLeftTitle(to: I18N.MyReviews.naviTitle) } diff --git a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift index 48224037..9082472a 100644 --- a/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MySavedBakery/ViewControllers/MySavedBakeryViewController.swift @@ -27,7 +27,6 @@ final class MySavedBakeryViewController: BaseViewController { // MARK: - UI Property private let naviView = CustomNavigationBar() - private let lineView = LineView() private lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout()) // MARK: - Life Cycle @@ -45,23 +44,17 @@ final class MySavedBakeryViewController: BaseViewController { override func setLayout() { view.addSubviews(naviView, collectionView) - naviView.addSubview(lineView) naviView.snp.makeConstraints { $0.top.equalToSuperview() $0.directionalHorizontalEdges.equalTo(safeArea) } - - lineView.snp.makeConstraints { - $0.directionalHorizontalEdges.equalToSuperview() - $0.height.equalTo(1) - $0.bottom.equalToSuperview() - } + collectionView.snp.makeConstraints { $0.top.equalTo(naviView.snp.bottom) - $0.directionalHorizontalEdges.equalTo(safeArea) + $0.leading.equalTo(safeArea).offset(-24) + $0.trailing.equalTo(safeArea) $0.bottom.equalToSuperview() - } } From 0a393118a02170f46f06b88385c271ab9a963292 Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 20:32:50 +0900 Subject: [PATCH 149/153] =?UTF-8?q?[Add]=20#43=20-=20=EB=82=B4=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=B7=B0=20=EB=82=B4=EA=B0=80=20=EC=93=B4=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=ED=99=94=EB=A9=B4=20=EC=A0=84=ED=99=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyPage/ViewControllers/MyPageViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift index 6ac6ec3b..0c1e0cfb 100644 --- a/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyPage/ViewControllers/MyPageViewController.swift @@ -105,7 +105,7 @@ extension MyPageViewController: UICollectionViewDataSource { Utils.push(self.navigationController, FilterPurposeViewController(maxSteps: 3, username: "찐빵대빵")) } header.myReviewsTapped = { - print("tapped") + Utils.push(self.navigationController, MyReviewsViewController()) } header.svedBakeryTapped = { Utils.push(self.navigationController, MySavedBakeryViewController()) From a684338d5e3c4bc407d74a13f63ab8459d005f15 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 20:39:02 +0900 Subject: [PATCH 150/153] [Del] #31 - deleted unused codes --- .../WriteReviewViewController.swift | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index fca00101..064e8e58 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -364,20 +364,20 @@ extension WriteReviewViewController: UICollectionViewDataSource { return cell } - func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - let header: OptionsCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) - - switch collectionView { - case likeCollectionView: - header.configureTitle(to: I18N.WriteReview.likeOptionTitle) - header.isEnabled.toggle() - case optionsCollectionView: - header.configureTitle(to: I18N.WriteReview.optionTitle) - default: - return UICollectionReusableView() - } - return header - } +// func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { +// let header: OptionsCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) +// +// switch collectionView { +// case likeCollectionView: +// header.configureTitle(to: I18N.WriteReview.likeOptionTitle) +// header.isEnabled.toggle() +// case optionsCollectionView: +// header.configureTitle(to: I18N.WriteReview.optionTitle) +// default: +// return UICollectionReusableView() +// } +// return header +// } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 18, left: 0, bottom: 0, right: 0) From 22d163bdc7b88bf2343d7e5bed22768bc3b84b05 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sat, 15 Jul 2023 21:53:12 +0900 Subject: [PATCH 151/153] [Del] #31 - deleted unused code --- .../WriteReviewViewController.swift | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index 064e8e58..b3958545 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -21,9 +21,11 @@ final class WriteReviewViewController: BaseViewController { // TODO: bakeryImage 추가 private let scrollView = UIScrollView() private let contentView = UIView() + private let navigationBar = CustomNavigationBar() private let bakeryOverviewView = BakeryOverviewView(bakeryImage: .actions, firstRegion: "tset", secondRegion: "efqerqf") private let lineView = LineView() + private let likeCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() private let optionsCollectionViewFlowLayout = OptionsCollectionViewFlowLayout() private let likeCollectionViewHeaderLabel = UILabel() @@ -34,8 +36,9 @@ final class WriteReviewViewController: BaseViewController { private let dotView = UILabel() private let aboutReviewContainerView = UIView() private let aboutReviewLabel = UILabel() + private let bottomView = BottomView() - private let bottomDummyView = UIView() + private let nextButton = CommonButton() // MARK: - life cycle @@ -217,10 +220,10 @@ final class WriteReviewViewController: BaseViewController { bottomView.do { $0.backgroundColor = .white $0.layer.masksToBounds = false - $0.applyAdditionalSubview(bottomDummyView, withTrailingOffset: 16) + $0.applyAdditionalSubview(nextButton, withTrailingOffset: 16) } - bottomDummyView.do { + nextButton.do { $0.backgroundColor = .gbbPoint1 $0.makeCornerRound(radius: 12) } @@ -291,7 +294,7 @@ final class WriteReviewViewController: BaseViewController { UIView.animate(withDuration: 0.2, animations: { self.scrollView.transform = .identity self.bottomView.transform = .identity - self.bottomDummyView.transform = .identity + self.nextButton.transform = .identity }) } @@ -364,21 +367,6 @@ extension WriteReviewViewController: UICollectionViewDataSource { return cell } -// func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { -// let header: OptionsCollectionViewHeader = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) -// -// switch collectionView { -// case likeCollectionView: -// header.configureTitle(to: I18N.WriteReview.likeOptionTitle) -// header.isEnabled.toggle() -// case optionsCollectionView: -// header.configureTitle(to: I18N.WriteReview.optionTitle) -// default: -// return UICollectionReusableView() -// } -// return header -// } - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 18, left: 0, bottom: 0, right: 0) } From e70f4014b0939101d4885032838ad45392efeaaa Mon Sep 17 00:00:00 2001 From: jeongdung-eo Date: Sat, 15 Jul 2023 21:59:30 +0900 Subject: [PATCH 152/153] =?UTF-8?q?[Add]=20#42=20-=20empty=20section=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MyReviewsViewController.swift | 70 +++++++++++++++---- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift index ba55b5f4..b901ded2 100644 --- a/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift +++ b/GEON-PPANG-iOS/Presentation/MyReviews/ViewControllers/MyReviewsViewController.swift @@ -62,20 +62,45 @@ final class MyReviewsViewController: BaseViewController { private func setRegistration() { collectionView.register(cell: BakeryListCollectionViewCell.self) + collectionView.register(cell: EmptyCollectionViewCell.self) collectionView.register(header: MyReviewsHeaderView.self) } - + private func layout() -> UICollectionViewLayout { - var config = UICollectionLayoutListConfiguration(appearance: .grouped) - config.backgroundColor = .clear - config.showsSeparators = true - config.headerMode = .supplementary - config.separatorConfiguration.topSeparatorVisibility = .hidden - config.separatorConfiguration.bottomSeparatorVisibility = .visible - - let layout = UICollectionViewCompositionalLayout.list(using: config) + let layout = UICollectionViewCompositionalLayout {_, layoutEnvirnment in + if self.myReviewslist.isEmpty { + return self.normalSection() + } else { + var config = UICollectionLayoutListConfiguration(appearance: .grouped) + config.backgroundColor = .clear + config.showsSeparators = true + config.headerMode = .supplementary + config.separatorConfiguration.topSeparatorVisibility = .hidden + config.separatorConfiguration.bottomSeparatorVisibility = .visible + + let layoutSection = NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvirnment) + return layoutSection + } + } return layout } + + private func normalSection() -> NSCollectionLayoutSection { + let item = NSCollectionLayoutItem(layoutSize: .init( + widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1)) + ) + let group = NSCollectionLayoutGroup.vertical( + layoutSize: .init( + widthDimension: .fractionalWidth(1), + heightDimension: .fractionalHeight(1) + ), + subitem: item, + count: 1 + ) + let section = NSCollectionLayoutSection(group: group) + return section + } } // MARK: - UICollectionViewDataSource @@ -83,17 +108,28 @@ final class MyReviewsViewController: BaseViewController { extension MyReviewsViewController: UICollectionViewDataSource { func numberOfSections(in collectionView: UICollectionView) -> Int { - return myReviewslist.count + if myReviewslist.isEmpty { + return 1 + } else { + return myReviewslist.count + } } + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) - cell.getViewType(.reviewType) - cell.updateUI(data: myReviewslist[indexPath.section], index: indexPath.item) - return cell + if myReviewslist.isEmpty { + let cell: EmptyCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.noReview) + return cell + } else { + let cell: BakeryListCollectionViewCell = collectionView.dequeueReusableCell(for: indexPath) + cell.getViewType(.reviewType) + cell.updateUI(data: myReviewslist[indexPath.section], index: indexPath.item) + return cell + } } } @@ -101,7 +137,11 @@ extension MyReviewsViewController: UICollectionViewDataSource { extension MyReviewsViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { - let header: MyReviewsHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) + if myReviewslist.isEmpty { + return UICollectionReusableView() + } else { + let header: MyReviewsHeaderView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, indexPath: indexPath) return header + } } } From 5d739a402852fa4a5ff9c608e8d55ab4965f8de3 Mon Sep 17 00:00:00 2001 From: seongmin221 Date: Sun, 16 Jul 2023 00:59:55 +0900 Subject: [PATCH 153/153] [Feat] #31 - attached DTO --- GEON-PPANG-iOS.xcodeproj/project.pbxproj | 95 +++++++++---------- .../Application/SceneDelegate.swift | 2 +- .../WriteReview/Model}/WriteReviewDTO.swift | 8 +- .../WriteReviewViewController.swift | 36 ++++++- 4 files changed, 84 insertions(+), 57 deletions(-) rename GEON-PPANG-iOS/{Global/Network/Model/Bakery => Presentation/WriteReview/Model}/WriteReviewDTO.swift (81%) diff --git a/GEON-PPANG-iOS.xcodeproj/project.pbxproj b/GEON-PPANG-iOS.xcodeproj/project.pbxproj index 1cfb17ed..e20bf9c0 100644 --- a/GEON-PPANG-iOS.xcodeproj/project.pbxproj +++ b/GEON-PPANG-iOS.xcodeproj/project.pbxproj @@ -90,12 +90,12 @@ 3E79B1B52A571E7100D36A26 /* OptionsCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E79B1B42A571E7100D36A26 /* OptionsCollectionViewCell.swift */; }; 3EA2E1E32A53E88B003516A3 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1E22A53E88B003516A3 /* BaseViewController.swift */; }; 3EA2E1EB2A542151003516A3 /* SizeLiteral.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */; }; + 3ED40DF92A5FCF3800C7D5DA /* FilterEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DF82A5FCF3800C7D5DA /* FilterEnum.swift */; }; + 3ED40DFB2A5FD26200C7D5DA /* FilterDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DFA2A5FD26200C7D5DA /* FilterDTO.swift */; }; 3ED40E002A608B4700C7D5DA /* MyPageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */; }; 3ED40E022A608B8600C7D5DA /* MyPageSectionEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40E012A608B8600C7D5DA /* MyPageSectionEnum.swift */; }; 3ED40E042A608EF000C7D5DA /* MyPageCollectionViewHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */; }; 3ED40E062A60916000C7D5DA /* MyPagePurposeChipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */; }; - 3ED40DF92A5FCF3800C7D5DA /* FilterEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DF82A5FCF3800C7D5DA /* FilterEnum.swift */; }; - 3ED40DFB2A5FD26200C7D5DA /* FilterDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED40DFA2A5FD26200C7D5DA /* FilterDTO.swift */; }; 3EDC05BE2A5DED4400EAD950 /* FilterPurposeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */; }; 3EDC05C02A5DED9200EAD950 /* FilterBreadTypeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */; }; 3EDC05C22A5DED9D00EAD950 /* FilterIngredientViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */; }; @@ -173,17 +173,17 @@ 09FD47C72A5DC991002020BD /* SearchNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchNavigationView.swift; sourceTree = ""; }; 09FD47C92A5DD38D002020BD /* SearchResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultView.swift; sourceTree = ""; }; 09FD47D12A5DF892002020BD /* EmptyCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyCollectionViewCell.swift; sourceTree = ""; }; + 09FD47D82A5E5148002020BD /* MySavedBakeryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MySavedBakeryViewController.swift; sourceTree = ""; }; 09FD47DC2A5E57F2002020BD /* MyReviewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyReviewsViewController.swift; sourceTree = ""; }; 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewDTO.swift; sourceTree = ""; }; 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendationModel.swift; sourceTree = ""; }; 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikeModel.swift; sourceTree = ""; }; 3E16E4FD2A57F06D00B813D0 /* OptionsCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsCollectionViewFlowLayout.swift; sourceTree = ""; }; 3E16E5012A58176800B813D0 /* ReviewDetailTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewDetailTextView.swift; sourceTree = ""; }; + 3E2EEF742A5C93010093BCA9 /* BottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomView.swift; sourceTree = ""; }; 3E452B662A60E68000EA456D /* MyPageDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageDTO.swift; sourceTree = ""; }; 3E452B682A60FF7900EA456D /* MyPageCollectionViewFooter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewFooter.swift; sourceTree = ""; }; 3E452B6A2A614AAD00EA456D /* ImageWithSubtitleButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageWithSubtitleButton.swift; sourceTree = ""; }; - 09FD47D82A5E5148002020BD /* MySavedBakeryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MySavedBakeryViewController.swift; sourceTree = ""; }; - 3E2EEF742A5C93010093BCA9 /* BottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomView.swift; sourceTree = ""; }; 3E79B19C2A54523D00D36A26 /* BackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackButton.swift; sourceTree = ""; }; 3E79B19F2A5546E700D36A26 /* DescriptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionCollectionViewCell.swift; sourceTree = ""; }; 3E79B1A52A566F6400D36A26 /* WriteReviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WriteReviewViewController.swift; sourceTree = ""; }; @@ -194,15 +194,15 @@ 3EA2E1EA2A542151003516A3 /* SizeLiteral.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SizeLiteral.swift; sourceTree = ""; }; 3ED40DF82A5FCF3800C7D5DA /* FilterEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterEnum.swift; sourceTree = ""; }; 3ED40DFA2A5FD26200C7D5DA /* FilterDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterDTO.swift; sourceTree = ""; }; + 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewCell.swift; sourceTree = ""; }; + 3ED40E012A608B8600C7D5DA /* MyPageSectionEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageSectionEnum.swift; sourceTree = ""; }; + 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewHeader.swift; sourceTree = ""; }; + 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPagePurposeChipView.swift; sourceTree = ""; }; 3EDC05BD2A5DED4400EAD950 /* FilterPurposeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterPurposeViewController.swift; sourceTree = ""; }; 3EDC05BF2A5DED9200EAD950 /* FilterBreadTypeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBreadTypeViewController.swift; sourceTree = ""; }; 3EDC05C12A5DED9D00EAD950 /* FilterIngredientViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterIngredientViewController.swift; sourceTree = ""; }; 3EDC05C32A5DEE3600EAD950 /* FilterCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterCollectionViewCell.swift; sourceTree = ""; }; 3EDC05CF2A5E4FF900EAD950 /* String+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+.swift"; sourceTree = ""; }; - 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewCell.swift; sourceTree = ""; }; - 3ED40E012A608B8600C7D5DA /* MyPageSectionEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageSectionEnum.swift; sourceTree = ""; }; - 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageCollectionViewHeader.swift; sourceTree = ""; }; - 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPagePurposeChipView.swift; sourceTree = ""; }; 3EFA97852A5EBCA9002E70FA /* LineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineView.swift; sourceTree = ""; }; 3EFA97872A5EBCED002E70FA /* CustomNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomNavigationBar.swift; sourceTree = ""; }; DF959A5F2A539FBE00E75774 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; @@ -615,6 +615,22 @@ path = Views; sourceTree = ""; }; + 09FD47D62A5E511F002020BD /* MySavedBakery */ = { + isa = PBXGroup; + children = ( + 09FD47D72A5E5132002020BD /* ViewControllers */, + ); + path = MySavedBakery; + sourceTree = ""; + }; + 09FD47D72A5E5132002020BD /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 09FD47D82A5E5148002020BD /* MySavedBakeryViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; 09FD47DA2A5E57CC002020BD /* MyReviews */ = { isa = PBXGroup; children = ( @@ -643,7 +659,6 @@ 3E16E4F32A57CEF400B813D0 /* Bakery */ = { isa = PBXGroup; children = ( - 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */, ); path = Bakery; sourceTree = ""; @@ -671,26 +686,11 @@ children = ( 3E16E4FB2A57D24900B813D0 /* LikeModel.swift */, 3E16E4F92A57D1F400B813D0 /* RecommendationModel.swift */, + 3E16E4F42A57CF3800B813D0 /* WriteReviewDTO.swift */, ); path = Model; sourceTree = ""; }; - 09FD47D62A5E511F002020BD /* MySavedBakery */ = { - isa = PBXGroup; - children = ( - 09FD47D72A5E5132002020BD /* ViewControllers */, - ); - path = MySavedBakery; - sourceTree = ""; - }; - 09FD47D72A5E5132002020BD /* ViewControllers */ = { - isa = PBXGroup; - children = ( - 09FD47D82A5E5148002020BD /* MySavedBakeryViewController.swift */, - ); - path = ViewControllers; - sourceTree = ""; - }; 3E2EEF722A5C928F0093BCA9 /* View */ = { isa = PBXGroup; children = ( @@ -749,7 +749,6 @@ 3EA2E1E02A53E864003516A3 /* Common */ = { isa = PBXGroup; children = ( - 3EA2E1E12A53E880003516A3 /* Base */, 3E2EEF722A5C928F0093BCA9 /* View */, 093213FD2A5A74D100875EF6 /* TextField */, 3E79B19E2A55468500D36A26 /* Cell */, @@ -758,8 +757,6 @@ 097682D82A5C828E0008F4FB /* ImageView */, 3E79B19B2A54523400D36A26 /* Button */, 3EA2E1E12A53E880003516A3 /* Base */, - 3E79B1AF2A571B4B00D36A26 /* LineView.swift */, - 3EA2E1E82A541AEB003516A3 /* CustomNavigationBar.swift */, DFB587BA2A5D588500704B6C /* DrawDashLineView.swift */, 3E2EEF732A5C92980093BCA9 /* NavigationBar */, ); @@ -774,6 +771,26 @@ path = Base; sourceTree = ""; }; + 3ED40DFC2A608B2B00C7D5DA /* View */ = { + isa = PBXGroup; + children = ( + 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */, + 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */, + 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */, + 3E452B682A60FF7900EA456D /* MyPageCollectionViewFooter.swift */, + 3E452B6A2A614AAD00EA456D /* ImageWithSubtitleButton.swift */, + ); + path = View; + sourceTree = ""; + }; + 3ED40DFD2A608B2F00C7D5DA /* Model */ = { + isa = PBXGroup; + children = ( + 3E452B662A60E68000EA456D /* MyPageDTO.swift */, + ); + path = Model; + sourceTree = ""; + }; 3EDC05BA2A5DEB7500EAD950 /* Filter */ = { isa = PBXGroup; children = ( @@ -810,26 +827,6 @@ path = Model; sourceTree = ""; }; - 3ED40DFC2A608B2B00C7D5DA /* View */ = { - isa = PBXGroup; - children = ( - 3ED40DFF2A608B4600C7D5DA /* MyPageCollectionViewCell.swift */, - 3ED40E032A608EF000C7D5DA /* MyPageCollectionViewHeader.swift */, - 3ED40E052A60916000C7D5DA /* MyPagePurposeChipView.swift */, - 3E452B682A60FF7900EA456D /* MyPageCollectionViewFooter.swift */, - 3E452B6A2A614AAD00EA456D /* ImageWithSubtitleButton.swift */, - ); - path = View; - sourceTree = ""; - }; - 3ED40DFD2A608B2F00C7D5DA /* Model */ = { - isa = PBXGroup; - children = ( - 3E452B662A60E68000EA456D /* MyPageDTO.swift */, - ); - path = Model; - sourceTree = ""; - }; DF959A672A56851000E75774 /* Enum */ = { isa = PBXGroup; children = ( @@ -1003,7 +1000,6 @@ 090556292A51DBC000752067 /* UIView+.swift in Sources */, 090668FC2A4FF3C600F413FA /* AppDelegate.swift in Sources */, 3EDC05C02A5DED9200EAD950 /* FilterBreadTypeViewController.swift in Sources */, - 3E79B1B02A571B4B00D36A26 /* LineView.swift in Sources */, 09FD47C82A5DC991002020BD /* SearchNavigationView.swift in Sources */, 090668FD2A4FF3C600F413FA /* SceneDelegate.swift in Sources */, 097682DC2A5C83910008F4FB /* CGFloat+.swift in Sources */, @@ -1080,7 +1076,6 @@ 090556272A51DBB100752067 /* NSObject+.swift in Sources */, 3E79B1A02A5546E700D36A26 /* DescriptionCollectionViewCell.swift in Sources */, 3ED40E022A608B8600C7D5DA /* MyPageSectionEnum.swift in Sources */, - 3E16E5002A57FFD900B813D0 /* OptionsCollectionViewHeader.swift in Sources */, 3E452B692A60FF7900EA456D /* MyPageCollectionViewFooter.swift in Sources */, 3E16E4F52A57CF3800B813D0 /* WriteReviewDTO.swift in Sources */, 09FD47CA2A5DD38D002020BD /* SearchResultView.swift in Sources */, diff --git a/GEON-PPANG-iOS/Application/SceneDelegate.swift b/GEON-PPANG-iOS/Application/SceneDelegate.swift index 5a66dd4c..03e62fd0 100644 --- a/GEON-PPANG-iOS/Application/SceneDelegate.swift +++ b/GEON-PPANG-iOS/Application/SceneDelegate.swift @@ -18,7 +18,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let window = UIWindow(windowScene: windowScene) window.overrideUserInterfaceStyle = UIUserInterfaceStyle.light - let rootViewController = TabBarController() + let rootViewController = WriteReviewViewController() let navigationController = UINavigationController(rootViewController: rootViewController) navigationController.isNavigationBarHidden = true window.rootViewController = navigationController diff --git a/GEON-PPANG-iOS/Global/Network/Model/Bakery/WriteReviewDTO.swift b/GEON-PPANG-iOS/Presentation/WriteReview/Model/WriteReviewDTO.swift similarity index 81% rename from GEON-PPANG-iOS/Global/Network/Model/Bakery/WriteReviewDTO.swift rename to GEON-PPANG-iOS/Presentation/WriteReview/Model/WriteReviewDTO.swift index 344135fa..3f44f0a3 100644 --- a/GEON-PPANG-iOS/Global/Network/Model/Bakery/WriteReviewDTO.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/Model/WriteReviewDTO.swift @@ -9,9 +9,9 @@ import Foundation struct WriteReviewDTO: Codable { let bakeryID: Int - let isLike: Bool - let keywordList: [KeywordList] - let reviewText: String + var isLike: Bool + var keywordList: [String] + var reviewText: String enum CodingKeys: String, CodingKey { case bakeryID = "bakeryId" @@ -28,6 +28,4 @@ struct KeywordList: Codable { case special = "특별한 메뉴" case zeroWaste = "제로 웨이스트" } - - let keywordName: Keyword.RawValue } diff --git a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift index b3958545..adc2cefb 100644 --- a/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift +++ b/GEON-PPANG-iOS/Presentation/WriteReview/ViewController/WriteReviewViewController.swift @@ -16,6 +16,9 @@ final class WriteReviewViewController: BaseViewController { private var likeCollectionViewHeightConstraint: NSLayoutConstraint! + private let keywordList = KeywordList.Keyword.allCases.map { $0.rawValue } + private var writeReviewData: WriteReviewDTO = .init(bakeryID: 1, isLike: false, keywordList: [], reviewText: "") + // MARK: - UI Property // TODO: bakeryImage 추가 @@ -225,7 +228,13 @@ final class WriteReviewViewController: BaseViewController { nextButton.do { $0.backgroundColor = .gbbPoint1 + $0.isUserInteractionEnabled = false $0.makeCornerRound(radius: 12) + $0.getButtonTitle(.write) + $0.getButtonUI(.gbbGray200!) + $0.addAction(UIAction { [weak self] _ in + self?.nextButtonTapped() + }, for: .touchUpInside) } } @@ -246,6 +255,13 @@ final class WriteReviewViewController: BaseViewController { NotificationCenter.default.addObserver(self, selector: #selector(moveDownAboutKeyboardOnScrollView), name: UIResponder.keyboardWillHideNotification, object: nil) } + // MARK: - Action Helper + + private func nextButtonTapped() { + writeReviewData.reviewText = reviewDetailTextView.detailTextView.text + dump(writeReviewData) + } + // MARK: - Custom Method private func updateCollectionViewConstraint(of collectionView: UICollectionView) { @@ -311,18 +327,26 @@ extension WriteReviewViewController: UICollectionViewDelegate { else { return } optionsCollectionView.toggleIsEnabled(to: isLikeSelected) + if !isLikeSelected { + writeReviewData.keywordList.removeAll() + } + configureCollectionViewHeader(to: isLikeSelected ? .black : .gbbGray300!) reviewDetailTextView.isLike = isLikeSelected reviewDetailTextView.isUserInteractionEnabled = !isLikeSelected reviewDetailTextView.configureTextView(to: isLikeSelected ? .deactivated : .activated) + writeReviewData.isLike = isLikeSelected + case optionsCollectionView: let hasSelection = collectionView.indexPathsForSelectedItems != nil reviewDetailTextView.isUserInteractionEnabled = hasSelection reviewDetailTextView.configureTextView(to: hasSelection ? .activated : .deactivated) reviewDetailTextView.checkTextCount() + writeReviewData.keywordList.append(keywordList[indexPath.item]) + default: return } @@ -330,6 +354,11 @@ extension WriteReviewViewController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { guard collectionView == optionsCollectionView else { return } + + if let keywordIndex = writeReviewData.keywordList.firstIndex(of: keywordList[indexPath.item]) { + writeReviewData.keywordList.remove(at: keywordIndex) + } + if collectionView.indexPathsForSelectedItems == [] { reviewDetailTextView.isUserInteractionEnabled = false reviewDetailTextView.configureTextView(to: .deactivated) @@ -358,7 +387,6 @@ extension WriteReviewViewController: UICollectionViewDataSource { cell.configureCell(to: .deselected) cell.configureCellText(to: indexPath.item == 0 ? I18N.WriteReview.like : I18N.WriteReview.dislike) case optionsCollectionView: - let keywordList = KeywordList.Keyword.allCases.map { $0.rawValue } cell.configureCell(to: .disabled) cell.configureCellText(to: keywordList[indexPath.item]) default: @@ -381,8 +409,14 @@ extension WriteReviewViewController: UITextViewDelegate { let textCount = textView.text.count if textCount < 10 && 0 < textCount { reviewDetailTextView.configureTextView(to: .error) + + nextButton.getButtonUI(.gbbGray200!) + nextButton.isUserInteractionEnabled = false } else { reviewDetailTextView.configureTextView(to: .activated) + + nextButton.getButtonUI(.gbbGray700!) + nextButton.isUserInteractionEnabled = true } reviewDetailTextView.updateTextLimitLabel(to: textCount) }