From deb46e33f8dd4a8ee5a474a032fc405a1cee62f9 Mon Sep 17 00:00:00 2001 From: p2glet Date: Wed, 3 Dec 2025 00:34:07 +0900 Subject: [PATCH 01/18] =?UTF-8?q?fix/#273:=20=EA=B2=80=EC=83=89=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20count=20=EC=88=9C=EC=84=9C=20=EC=88=98=EC=A0=95=20(?= =?UTF-8?q?Map=20<->=20NPC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DictionarySearchResult/DictionarySearchResultReactor.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearchResult/DictionarySearchResultReactor.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearchResult/DictionarySearchResultReactor.swift index f8cf3ca6..6e3dc4a0 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearchResult/DictionarySearchResultReactor.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearchResult/DictionarySearchResultReactor.swift @@ -96,7 +96,7 @@ public final class DictionarySearchResultReactor: Reactor { .distinctUntilChanged() // 중복 keyword 방지 .flatMap { [weak self] keyword -> Observable in guard let self = self else { return .empty() } - let types = ["search", "monsters", "items", "npcs", "maps", "quests"] + let types = ["search", "monsters", "items", "maps", "npcs", "quests"] let countObservables = types.map { type in self.dictionarySearchCountUseCase.execute(type: type, keyword: keyword) .map { $0.count ?? 0 } From dfedcc305830f649213e9e8f3edebcbfef34c4ff Mon Sep 17 00:00:00 2001 From: p2glet Date: Wed, 3 Dec 2025 01:13:37 +0900 Subject: [PATCH 02/18] =?UTF-8?q?refactor/#273:=20=EB=B6=81=EB=A7=88?= =?UTF-8?q?=ED=81=AC=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Image.xcassets/bookmark.imageset/Contents.json | 2 +- .../Image.xcassets/bookmark.imageset/bookmark.svg | 3 +++ .../Image.xcassets/bookmark.imageset/bookmark_true.svg | 3 --- .../Image.xcassets/bookmark_border.imageset/Contents.json | 2 +- .../Image.xcassets/bookmark_border.imageset/bookmark.svg | 8 -------- .../bookmark_border.imageset/bookmark_border.svg | 3 +++ 6 files changed, 8 insertions(+), 13 deletions(-) create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark.svg delete mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark_true.svg delete mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark.svg create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark_border.svg diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/Contents.json b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/Contents.json index b811307d..b9a0914c 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/Contents.json +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "bookmark_true.svg", + "filename" : "bookmark.svg", "idiom" : "universal", "scale" : "1x" }, diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark.svg b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark.svg new file mode 100644 index 00000000..4df98315 --- /dev/null +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark.svg @@ -0,0 +1,3 @@ + + + diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark_true.svg b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark_true.svg deleted file mode 100644 index 7c6cd582..00000000 --- a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark.imageset/bookmark_true.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/Contents.json b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/Contents.json index b9a0914c..718b074b 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/Contents.json +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "bookmark.svg", + "filename" : "bookmark_border.svg", "idiom" : "universal", "scale" : "1x" }, diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark.svg b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark.svg deleted file mode 100644 index 3183d363..00000000 --- a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark_border.svg b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark_border.svg new file mode 100644 index 00000000..bf456cff --- /dev/null +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark_border.svg @@ -0,0 +1,3 @@ + + + From 9d20dfcc4e96cd15cb3d311760c5b910babca995 Mon Sep 17 00:00:00 2001 From: p2glet Date: Wed, 3 Dec 2025 21:39:44 +0900 Subject: [PATCH 03/18] refactor/#273: clean code --- .../DictionaryList/DictionaryListCell.swift | 85 ------------------- 1 file changed, 85 deletions(-) delete mode 100644 MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListCell.swift diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListCell.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListCell.swift deleted file mode 100644 index c636e5bd..00000000 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListCell.swift +++ /dev/null @@ -1,85 +0,0 @@ -// import UIKit -// -// import BaseFeature -// import DesignSystem -// import DomainInterface -// -// final class DictionaryListCell: UICollectionViewCell { -// // MARK: - Properties -// private var onBookmarkTapped: ((Bool) -> Void)? -// -// // MARK: - Components -// public let cellView = CardList() -// private var imageDownloadTask: URLSessionDataTask? -// -// // MARK: - init -// override init(frame: CGRect) { -// super.init(frame: frame) -// -// addViews() -// setupContstraints() -// } -// -// @available(*, unavailable) -// required init?(coder: NSCoder) { -// fatalError("\(#file), \(#function) Error") -// } -// } -// -//// MARK: - SetUp -// private extension DictionaryListCell { -// func addViews() { -// contentView.addSubview(cellView) -// } -// -// func setupContstraints() { -// cellView.snp.makeConstraints { make in -// make.edges.equalToSuperview() -// } -// } -// } -// -// extension DictionaryListCell { -// struct Input { -// let type: DictionaryItemType -// let mainText: String -// let subText: String -// let imageUrl: String -// let isBookmarked: Bool -// } -// -// func inject(type: CardList.CardListType, input: Input, onBookmarkTapped: @escaping (Bool) -> Void) { -// cellView.setType(type: type) -// // URL이 유효할 때만 요청 -// if let url = URL(string: input.imageUrl) { -// ImageLoader.shared.loadImage(url: url) { image in -// guard let image = image else { return } -// self.cellView.setImage(image: image, backgroundColor: input.type.backgroundColor) -// } -// } -// cellView.setMainText(text: input.mainText) -// cellView.setSubText(text: input.subText) -// cellView.setSelected(isSelected: input.isBookmarked) -// self.onBookmarkTapped = onBookmarkTapped -// cellView.onIconTapped = { [weak self] isSelected in -// self?.onBookmarkTapped?(isSelected) -// } -// } -// } -// -// public extension DictionaryItemType { -// var backgroundColor: UIColor { -// switch self { -// case .item: -// .listItem -// case .monster: -// .listMonster -// case .map: -// .listMap -// case .npc: -// .listNPC -// case .quest: -// .listQuest -// } -// } -// } From 09806f950467ea8dd4cecae3a7ce2d1c928f6070 Mon Sep 17 00:00:00 2001 From: p2glet Date: Wed, 3 Dec 2025 22:11:47 +0900 Subject: [PATCH 04/18] =?UTF-8?q?fix/#273:=20=EA=B2=80=EC=83=89=EC=8B=9C?= =?UTF-8?q?=20=ED=82=A4=EB=B3=B4=EB=93=9C=20=EC=97=94=ED=84=B0=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MLS/MLS.xcodeproj/project.pbxproj | 17 +++++++++++++++++ .../DesignSystem/Components/SearchBar.swift | 9 +++++++++ .../DictionarySearchViewController.swift | 8 ++++++++ 3 files changed, 34 insertions(+) diff --git a/MLS/MLS.xcodeproj/project.pbxproj b/MLS/MLS.xcodeproj/project.pbxproj index 4f150d4e..3ad0da22 100644 --- a/MLS/MLS.xcodeproj/project.pbxproj +++ b/MLS/MLS.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 779A490E2E1AD26700ABDE4F /* BookmarkFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 779A490C2E1AD26700ABDE4F /* BookmarkFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 779A49102E1AD26D00ABDE4F /* BookmarkFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 779A490F2E1AD26D00ABDE4F /* BookmarkFeatureInterface.framework */; }; 779A49112E1AD26D00ABDE4F /* BookmarkFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 779A490F2E1AD26D00ABDE4F /* BookmarkFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 77B1F9952EE06A4E00AE4B4D /* RxGesture in Frameworks */ = {isa = PBXBuildFile; productRef = 77B1F9942EE06A4E00AE4B4D /* RxGesture */; }; 77EB18D62DED9256004FB380 /* AuthFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77EB18D52DED9256004FB380 /* AuthFeature.framework */; }; 77EB18D72DED9256004FB380 /* AuthFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 77EB18D52DED9256004FB380 /* AuthFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ @@ -166,6 +167,7 @@ 08ED492C2DCFDED4002C21A2 /* RxSwift in Frameworks */, 7721A5042E0EE7AE00A7B58C /* BaseFeature.framework in Frameworks */, 08DA58AA2E1E5BEB009097A6 /* DictionaryFeatureInterface.framework in Frameworks */, + 77B1F9952EE06A4E00AE4B4D /* RxGesture in Frameworks */, 7721A5082E0EE7F100A7B58C /* ReactorKit in Frameworks */, 0801759F2DCD27E600D0919F /* DomainInterface.framework in Frameworks */, 7777F7022E9EAB8400F53D68 /* BookmarkFeature.framework in Frameworks */, @@ -323,6 +325,7 @@ 08DA51B32E1B9827009097A6 /* FirebaseFirestore */, 08DA51B52E1B9827009097A6 /* FirebaseMessaging */, 770ADB1E2E433EDA00270506 /* RxKeyboard */, + 77B1F9942EE06A4E00AE4B4D /* RxGesture */, ); productName = MLS; productReference = 087D3EE82DA7972C002F924D /* MLS.app */; @@ -386,6 +389,7 @@ 7721A5062E0EE7F100A7B58C /* XCRemoteSwiftPackageReference "ReactorKit" */, 08DA51B22E1B9827009097A6 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, 770ADB1D2E433EDA00270506 /* XCRemoteSwiftPackageReference "RxKeyboard" */, + 77B1F9932EE06A4E00AE4B4D /* XCRemoteSwiftPackageReference "RxGesture" */, ); preferredProjectObjectVersion = 77; productRefGroup = 087D3EE92DA7972C002F924D /* Products */; @@ -810,6 +814,14 @@ kind = branch; }; }; + 77B1F9932EE06A4E00AE4B4D /* XCRemoteSwiftPackageReference "RxGesture" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/RxSwiftCommunity/RxGesture.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.0.4; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -863,6 +875,11 @@ package = 77660AD32DD0D3DD007A4EF3 /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; productName = KakaoSDKUser; }; + 77B1F9942EE06A4E00AE4B4D /* RxGesture */ = { + isa = XCSwiftPackageProductDependency; + package = 77B1F9932EE06A4E00AE4B4D /* XCRemoteSwiftPackageReference "RxGesture" */; + productName = RxGesture; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 087D3EE02DA7972C002F924D /* Project object */; diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift index f94d600c..52488474 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift @@ -2,8 +2,15 @@ import UIKit import SnapKit +public protocol SearchBarDelegate: AnyObject { + func searchBarDidReturn(_ searchBar: SearchBar, text: String) +} + public final class SearchBar: UIView { // MARK: - Properties + public weak var searchDelegate: SearchBarDelegate? + + // MARK: - Components public let backButton: UIButton = { let button = UIButton(type: .system) let image = DesignSystemAsset.image(named: "arrowBack")?.withRenderingMode(.alwaysTemplate) @@ -139,6 +146,8 @@ extension SearchBar: UITextFieldDelegate { } public func textFieldShouldReturn(_ textField: UITextField) -> Bool { + searchDelegate?.searchBarDidReturn(self, text: textField.text ?? "") + endEditing(true) clearButton.isHidden = true return true diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift index 9693f932..3fcbcacb 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift @@ -56,6 +56,8 @@ private extension DictionarySearchViewController { func configureUI() { isBottomTabbarHidden = true + + mainView.searchBar.searchDelegate = self mainView.searchCollectionView.collectionViewLayout = createLayout() mainView.searchCollectionView.delegate = self @@ -292,3 +294,9 @@ extension DictionarySearchViewController: UICollectionViewDelegate, UICollection } } } + +extension DictionarySearchViewController: SearchBarDelegate { + public func searchBarDidReturn(_ searchBar: SearchBar, text: String) { + reactor?.action.onNext(.searchButtonTapped(text)) + } +} From 3d33911c51411475e3b44c29f70f3416ea27163a Mon Sep 17 00:00:00 2001 From: p2glet Date: Wed, 3 Dec 2025 23:12:27 +0900 Subject: [PATCH 05/18] =?UTF-8?q?fix/#273:=20=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=95=84=EC=9D=B4=EC=BD=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 --- .../DesignSystem/Components/CardList.swift | 4 ++-- .../Contents.json | 0 .../bookmark_border.svg | 0 .../bookmarkBorderList.imageset/Contents.json | 21 ++++++++++++++++++ .../bookmarkBorderList.png | Bin 0 -> 303 bytes .../Contents.json | 21 ++++++++++++++++++ .../bookmarkGrayBorderList.svg | 8 +++++++ .../bookmarkList.imageset/Contents.json | 21 ++++++++++++++++++ .../bookmarkList.imageset/bookmarkList.svg | 8 +++++++ 9 files changed, 81 insertions(+), 2 deletions(-) rename MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/{bookmark_border.imageset => bookmarkBorder.imageset}/Contents.json (100%) rename MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/{bookmark_border.imageset => bookmarkBorder.imageset}/bookmark_border.svg (100%) create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorderList.imageset/Contents.json create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorderList.imageset/bookmarkBorderList.png create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/Contents.json create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/bookmarkGrayBorderList.svg create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/Contents.json create mode 100644 MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/bookmarkList.svg diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift index ac80254c..0f095336 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift @@ -14,7 +14,7 @@ public final class CardList: UIView { var icon: UIImage? { switch self { case .bookmark: - return .bookmarkBorder + return .bookmarkBorderList case .checkbox: return .checkSquare case .detailStack, .detailStackText, .detailStackBadge: @@ -25,7 +25,7 @@ public final class CardList: UIView { var selectedIcon: UIImage? { switch self { case .bookmark: - return .bookmark + return .bookmarkList case .checkbox: return .checkSquareFill case .detailStack, .detailStackText, .detailStackBadge: diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/Contents.json b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorder.imageset/Contents.json similarity index 100% rename from MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/Contents.json rename to MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorder.imageset/Contents.json diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark_border.svg b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorder.imageset/bookmark_border.svg similarity index 100% rename from MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmark_border.imageset/bookmark_border.svg rename to MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorder.imageset/bookmark_border.svg diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorderList.imageset/Contents.json b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorderList.imageset/Contents.json new file mode 100644 index 00000000..684a4e90 --- /dev/null +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorderList.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "bookmarkBorderList.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorderList.imageset/bookmarkBorderList.png b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkBorderList.imageset/bookmarkBorderList.png new file mode 100644 index 0000000000000000000000000000000000000000..9fe9661af0c01cc21f827cb387985de0d8d3e873 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#Bc3jfAr*{oLk{vDGT^ZZU{7e-z<9HPSE6wf zqt68c##9zF4e65RH4}JWaLfr+Ub1TGzlMq@OD1bCKR5TYg+el0_r|oI!t+6swQo!~ z@nG+MUjDAm#s$vhH#P)2r!l(Ed#Q1NAx~$ily&r@(4 uly^iml7HTkrJW6R+MQW9-?a4XKO!u6QlIl4Ym`3FKMbC(elF{r5}E*KLvX|Z literal 0 HcmV?d00001 diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/Contents.json b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/Contents.json new file mode 100644 index 00000000..e279269b --- /dev/null +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "bookmarkGrayBorderList.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/bookmarkGrayBorderList.svg b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/bookmarkGrayBorderList.svg new file mode 100644 index 00000000..d5ace6ae --- /dev/null +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkGrayBorderList.imageset/bookmarkGrayBorderList.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/Contents.json b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/Contents.json new file mode 100644 index 00000000..78cce243 --- /dev/null +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "bookmarkList.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/bookmarkList.svg b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/bookmarkList.svg new file mode 100644 index 00000000..dc45cef0 --- /dev/null +++ b/MLS/Presentation/DesignSystem/DesignSystem/Resource/Image.xcassets/bookmarkList.imageset/bookmarkList.svg @@ -0,0 +1,8 @@ + + + + + + + + From 0c0b19767d7b165e8518f5bdce668bf2c0474d51 Mon Sep 17 00:00:00 2001 From: p2glet Date: Wed, 3 Dec 2025 23:31:27 +0900 Subject: [PATCH 06/18] =?UTF-8?q?fix/#273:=20=EA=B2=80=EC=83=89=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=A7=84=EC=9E=85=EC=8B=9C=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=ED=95=84=EB=93=9C=20=ED=8F=AC=EC=BB=A4=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DictionarySearch/DictionarySearchViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift index 3fcbcacb..f03f75dc 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionarySearch/DictionarySearchViewController.swift @@ -56,8 +56,9 @@ private extension DictionarySearchViewController { func configureUI() { isBottomTabbarHidden = true - + mainView.searchBar.searchDelegate = self + mainView.searchBar.textField.becomeFirstResponder() mainView.searchCollectionView.collectionViewLayout = createLayout() mainView.searchCollectionView.delegate = self From 211d09d3515653471f5c5fd82e11693a145760f7 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 01:04:50 +0900 Subject: [PATCH 07/18] =?UTF-8?q?fix/#273:=20=EC=85=80=20=EC=9E=AC?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CollectionViewCells/DictionaryListCell.swift | 13 ++++++++++++- .../DesignSystem/Components/CardList.swift | 4 +--- .../DictionaryListViewController.swift | 9 +++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift b/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift index a040c941..66c642ac 100644 --- a/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift +++ b/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift @@ -9,7 +9,6 @@ public final class DictionaryListCell: UICollectionViewCell { // MARK: - Components public let cellView = CardList() - private var imageDownloadTask: URLSessionDataTask? // MARK: - init override init(frame: CGRect) { @@ -23,6 +22,18 @@ public final class DictionaryListCell: UICollectionViewCell { required init?(coder: NSCoder) { fatalError("\(#file), \(#function) Error") } + + public override func prepareForReuse() { + super.prepareForReuse() + + onBookmarkTapped = nil + cellView.onIconTapped = nil + + cellView.setImage(image: UIImage(), backgroundColor: .clear) + cellView.setMainText(text: "") + cellView.setSubText(text: nil) + cellView.setSelected(isSelected: false) + } } // MARK: - SetUp diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift index 0f095336..a892a172 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift @@ -210,9 +210,7 @@ public extension CardList { } func setSubText(text: String?) { - if let text = text { - subText = text - } + subText = text } func setImage(image: UIImage, backgroundColor: UIColor) { diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift index c1700ee7..283e23ae 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift @@ -210,10 +210,8 @@ extension DictionaryListViewController: UICollectionViewDelegate, UICollectionVi let cell = collectionView.dequeueReusableCell(withReuseIdentifier: DictionaryListCell.identifier, for: indexPath) as? DictionaryListCell else { return UICollectionViewCell() } let item = state.listItems[indexPath.row] - var subText: String? { - [.item, .monster, .quest].contains(item.type) - ? item.level.map { "Lv. \($0)" } : nil - } + let subText: String? = [.item, .monster, .quest].contains(item.type) ? item.level.map { "Lv. \($0)" } : nil + cell.inject( type: .bookmark, input: DictionaryListCell.Input( @@ -269,8 +267,7 @@ extension DictionaryListViewController: UICollectionViewDelegate, UICollectionVi buttonAction: { DispatchQueue.main.async { [weak self] in guard let self = self, - let reactor = self.reactor, - let id = reactor.currentState.listItems[indexPath.row].bookmarkId else { return } + let id = item.bookmarkId else { return } let viewController = self.bookmarkModalFactory.make(bookmarkIds: [id], onComplete: { isAdd in if isAdd { From c9c82132dc2d21f51ff4dfec5e96dc180bdd6b48 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 01:27:20 +0900 Subject: [PATCH 08/18] =?UTF-8?q?fix/#273:=20=EB=8F=84=EA=B0=90=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=83=91=20=EB=A7=88=EC=A7=84=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 --- .../BaseFeature/BaseFeature/SharedView/BaseListView.swift | 6 ++---- .../Utills/CompositionalLayoutBuilder/LayoutFactory.swift | 4 ++-- .../BookmarkList/BookmarkListViewController.swift | 3 ++- .../DictionaryList/DictionaryListViewController.swift | 6 +++--- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/MLS/Presentation/BaseFeature/BaseFeature/SharedView/BaseListView.swift b/MLS/Presentation/BaseFeature/BaseFeature/SharedView/BaseListView.swift index 5bee442c..033df7e2 100644 --- a/MLS/Presentation/BaseFeature/BaseFeature/SharedView/BaseListView.swift +++ b/MLS/Presentation/BaseFeature/BaseFeature/SharedView/BaseListView.swift @@ -13,7 +13,6 @@ open class BaseListView: UIView { static let iconSize: CGFloat = 24 static let stackViewSpacing: CGFloat = 12 static let topMargin: CGFloat = 12 - static let nonFilterTopMargin: CGFloat = 20 static let cellSpacing: CGFloat = 10 static let cellWidth: CGFloat = 343 static let cellHeight: CGFloat = 104 @@ -80,8 +79,7 @@ private extension BaseListView { func setupConstraints(isFilterHidden: Bool) { if isFilterHidden { listCollectionView.snp.makeConstraints { make in - make.top.equalToSuperview().inset(Constant.nonFilterTopMargin) - make.horizontalEdges.bottom.equalToSuperview() + make.edges.equalToSuperview() } } else { filterStackView.snp.makeConstraints { make in @@ -118,7 +116,7 @@ public extension BaseListView { if hasFilter { make.top.equalTo(filterStackView.snp.bottom).offset(Constant.topMargin) } else { - make.top.equalToSuperview().inset(Constant.nonFilterTopMargin) + make.top.equalToSuperview() } make.horizontalEdges.bottom.equalToSuperview() } diff --git a/MLS/Presentation/BaseFeature/BaseFeature/Utills/CompositionalLayoutBuilder/LayoutFactory.swift b/MLS/Presentation/BaseFeature/BaseFeature/Utills/CompositionalLayoutBuilder/LayoutFactory.swift index 6c83082c..12af8d7f 100644 --- a/MLS/Presentation/BaseFeature/BaseFeature/Utills/CompositionalLayoutBuilder/LayoutFactory.swift +++ b/MLS/Presentation/BaseFeature/BaseFeature/Utills/CompositionalLayoutBuilder/LayoutFactory.swift @@ -36,13 +36,13 @@ public class LayoutFactory { .contentInsets(.init(top: 12, leading: 16, bottom: 32, trailing: 16)) } - public func getDictionaryListLayout() -> CompositionalSectionBuilder { + public func getDictionaryListLayout(isFilterHidden: Bool = true) -> CompositionalSectionBuilder { return CompositionalSectionBuilder() .item(width: .fractionalWidth(1.0), height: .absolute(104)) .group(.horizontal, width: .fractionalWidth(1.0), height: .absolute(104)) .buildSection() .interGroupSpacing(10) - .contentInsets(.init(top: 0, leading: 16, bottom: 0, trailing: 16)) + .contentInsets(.init(top: isFilterHidden ? 20 : 0, leading: 16, bottom: 0, trailing: 16)) } public func getTagChipLayout() -> CompositionalSectionBuilder { diff --git a/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift b/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift index b76516fc..8dda6bdb 100644 --- a/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift +++ b/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift @@ -86,9 +86,10 @@ private extension BookmarkListViewController { } func createListLayout() -> UICollectionViewLayout { + guard let isHidden = reactor?.currentState.type.isBookmarkSortHidden else { return UICollectionViewLayout() } let layoutFactory = LayoutFactory() let layout = CompositionalLayoutBuilder() - .section { _ in layoutFactory.getDictionaryListLayout() } + .section { _ in layoutFactory.getDictionaryListLayout(isFilterHidden: isHidden) } .build() layout.register(Neutral300DividerView.self, forDecorationViewOfKind: Neutral300DividerView.identifier) return layout diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift index 283e23ae..7099908c 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift @@ -41,8 +41,7 @@ public final class DictionaryListViewController: BaseViewController, View { self.bookmarkModalFactory = bookmarkModalFactory self.detailFactory = detailFactory self.loginFactory = loginFactory - self.mainView = DictionaryListView( - isFilterHidden: reactor.currentState.type.isSortHidden) + self.mainView = DictionaryListView(isFilterHidden: reactor.currentState.type.isSortHidden) super.init() self.reactor = reactor } @@ -85,9 +84,10 @@ private extension DictionaryListViewController { } func createListLayout() -> UICollectionViewLayout { + guard let isHidden = reactor?.currentState.type.isSortHidden else { return UICollectionViewLayout() } let layoutFactory = LayoutFactory() let layout = CompositionalLayoutBuilder() - .section { _ in layoutFactory.getDictionaryListLayout() } + .section { _ in layoutFactory.getDictionaryListLayout(isFilterHidden: isHidden) } .build() layout.register( Neutral300DividerView.self, From 969bb713242e7a855c3cc8b0a501419447750cd0 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 03:06:55 +0900 Subject: [PATCH 09/18] =?UTF-8?q?fix/#273:=20PinchMapView=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DictionaryListCell.swift | 26 +++++++++++++------ .../BookmarkListViewController.swift | 2 ++ .../CollectionDetailViewController.swift | 2 ++ .../CollectionEditViewController.swift | 4 ++- .../MapDictionaryDetailViewController.swift | 10 ++++--- .../SectionStackView/PinchMapView.swift | 5 ++-- .../DictionaryListViewController.swift | 3 ++- 7 files changed, 36 insertions(+), 16 deletions(-) diff --git a/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift b/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift index 66c642ac..570bba8c 100644 --- a/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift +++ b/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift @@ -23,13 +23,11 @@ public final class DictionaryListCell: UICollectionViewCell { fatalError("\(#file), \(#function) Error") } - public override func prepareForReuse() { + override public func prepareForReuse() { super.prepareForReuse() onBookmarkTapped = nil cellView.onIconTapped = nil - - cellView.setImage(image: UIImage(), backgroundColor: .clear) cellView.setMainText(text: "") cellView.setSubText(text: nil) cellView.setSelected(isSelected: false) @@ -66,15 +64,27 @@ public extension DictionaryListCell { } } - func inject(type: CardList.CardListType, input: Input, onBookmarkTapped: @escaping (Bool) -> Void) { + func inject( + type: CardList.CardListType, + input: Input, + indexPath: IndexPath, + collectionView: UICollectionView, + onBookmarkTapped: @escaping (Bool) -> Void + ) { cellView.setType(type: type) - // URL이 유효할 때만 요청 + cellView.setImage(image: UIImage(), backgroundColor: input.type.backgroundColor) // 초기화 + if let url = URL(string: input.imageUrl) { - ImageLoader.shared.loadImage(url: url) { image in - guard let image = image else { return } - self.cellView.setImage(image: image, backgroundColor: input.type.backgroundColor) + ImageLoader.shared.loadImage(url: url) { [weak self] image in + guard let self = self else { return } + // ⚠️ 셀이 재사용된 경우, indexPath가 다르면 무시 + if let currentIndex = collectionView.indexPath(for: self), + currentIndex == indexPath { + self.cellView.setImage(image: image ?? UIImage(), backgroundColor: input.type.backgroundColor) + } } } + cellView.setMainText(text: input.mainText) cellView.setSubText(text: input.subText) cellView.setSelected(isSelected: input.isBookmarked) diff --git a/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift b/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift index 8dda6bdb..e51f3ccc 100644 --- a/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift +++ b/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift @@ -249,6 +249,8 @@ extension BookmarkListViewController: UICollectionViewDelegate, UICollectionView imageUrl: item.imageUrl ?? "", isBookmarked: true ), + indexPath: indexPath, + collectionView: collectionView, onBookmarkTapped: { [weak self] isSelected in guard let self = self else { return } diff --git a/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionDetail/CollectionDetailViewController.swift b/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionDetail/CollectionDetailViewController.swift index c30e3e90..6ff006bf 100644 --- a/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionDetail/CollectionDetailViewController.swift +++ b/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionDetail/CollectionDetailViewController.swift @@ -235,6 +235,8 @@ extension CollectionDetailViewController: UICollectionViewDelegate, UICollection imageUrl: item.imageUrl ?? "", isBookmarked: true ), + indexPath: indexPath, + collectionView: collectionView, onBookmarkTapped: { [weak self] isSelected in guard let self = self else { return } diff --git a/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionEdit/CollectionEditViewController.swift b/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionEdit/CollectionEditViewController.swift index 2a0627c7..74d2f552 100644 --- a/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionEdit/CollectionEditViewController.swift +++ b/MLS/Presentation/BookmarkFeature/BookmarkFeature/CollectionEdit/CollectionEditViewController.swift @@ -159,7 +159,7 @@ extension CollectionEditViewController: UICollectionViewDelegate, UICollectionVi } cell.inject( - type: .checkbox, + type: .bookmark, input: DictionaryListCell.Input( type: item.type, mainText: item.name, @@ -167,6 +167,8 @@ extension CollectionEditViewController: UICollectionViewDelegate, UICollectionVi imageUrl: item.imageUrl ?? "", isBookmarked: isSelected ), + indexPath: indexPath, + collectionView: collectionView, onBookmarkTapped: { [weak self] _ in self?.reactor?.action.onNext(.itemTapped(indexPath.row)) } diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Map/MapDictionaryDetailViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Map/MapDictionaryDetailViewController.swift index 83ae69d0..67881480 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Map/MapDictionaryDetailViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Map/MapDictionaryDetailViewController.swift @@ -43,9 +43,9 @@ private extension MapDictionaryDetailViewController { func setUpMapView() { guard let reactor = reactor else { return } - mapInfoView.setUpMapView(imageUrl: reactor.currentState.mapDetailInfo.mapUrl) contentViews.append(mapInfoView) if let mapUrl = reactor.currentState.mapDetailInfo.mapUrl, !mapUrl.isEmpty { + mapInfoView.setUpMapView(imageUrl: reactor.currentState.mapDetailInfo.mapUrl) contentViews[0] = mapInfoView } else { contentViews[0] = DetailEmptyView(type: .mapInfo) @@ -90,9 +90,11 @@ private extension MapDictionaryDetailViewController { mapInfoView.mapImageView.addGestureRecognizer(tapGesture) tapGesture.rx.event - .bind(onNext: { [weak self] _ in - guard let self else { return } - let viewController = PinchMapViewController(imageUrl: "") + .withUnretained(self) + .bind(onNext: { owner, _ in + guard let reactor = owner.reactor, + let url = reactor.currentState.mapDetailInfo.mapUrl else { return } + let viewController = PinchMapViewController(imageUrl: url) viewController.modalPresentationStyle = .overFullScreen self.present(viewController, animated: true) }) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/PinchMapView.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/PinchMapView.swift index ea90ee00..4ffa6d00 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/PinchMapView.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/PinchMapView.swift @@ -19,6 +19,7 @@ final class PinchMapView: UIView { scrollView.showsVerticalScrollIndicator = false scrollView.showsHorizontalScrollIndicator = false scrollView.bouncesZoom = true + scrollView.backgroundColor = .clearMLS return scrollView }() @@ -26,7 +27,7 @@ final class PinchMapView: UIView { let view = UIImageView() view.clipsToBounds = true view.contentMode = .scaleAspectFit - view.backgroundColor = .textColor.withAlphaComponent(0.9) + view.backgroundColor = .clearMLS view.layer.opacity = 0.9 return view }() @@ -79,7 +80,7 @@ private extension PinchMapView { } func configureUI() { - backgroundColor = .clearMLS + backgroundColor = .textColor.withAlphaComponent(0.9) } } diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift index 7099908c..f592fc6d 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift @@ -209,7 +209,6 @@ extension DictionaryListViewController: UICollectionViewDelegate, UICollectionVi guard let state = reactor?.currentState, let cell = collectionView.dequeueReusableCell(withReuseIdentifier: DictionaryListCell.identifier, for: indexPath) as? DictionaryListCell else { return UICollectionViewCell() } let item = state.listItems[indexPath.row] - let subText: String? = [.item, .monster, .quest].contains(item.type) ? item.level.map { "Lv. \($0)" } : nil cell.inject( @@ -221,6 +220,8 @@ extension DictionaryListViewController: UICollectionViewDelegate, UICollectionVi imageUrl: item.imageUrl ?? "", isBookmarked: item.bookmarkId != nil ), + indexPath: indexPath, + collectionView: collectionView, onBookmarkTapped: { [weak self] isSelected in guard let self = self else { return } From 3acad1788439f99330c9b169d996d4c11cedc0d0 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 03:11:47 +0900 Subject: [PATCH 10/18] =?UTF-8?q?fix/#273:=20=EB=AA=AC=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=20=ED=83=9C=EA=B7=B8=EB=B7=B0=20=EC=A4=91=EC=B2=A9=20=EC=9D=B4?= =?UTF-8?q?=EC=8A=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DictionaryDetail/DictionaryDetailBaseViewController.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseViewController.swift index 3c039007..2a4455e0 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseViewController.swift @@ -150,6 +150,8 @@ extension DictionaryDetailBaseViewController { } func makeTagsRow(_ tags: Effectiveness) { + mainView.tagsVerticalStackView.arrangedSubviews.forEach { $0.removeFromSuperview() } + let maxWidth = UIScreen.main.bounds.width - DictionaryDetailBaseView.Constant.horizontalInset // 좌우 여백 고려 (16 * 2) let tagSpacing: CGFloat = DictionaryDetailBaseView.Constant.tagVerticalSpacing From 16f6bebc46dbad15fa1517377dcecc0721aeb574 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 16:47:09 +0900 Subject: [PATCH 11/18] =?UTF-8?q?fix/#273:=20=ED=80=98=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20Lv=20=ED=85=8D=EC=8A=A4=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 --- .../Quest/QuestDictionaryDetailViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Quest/QuestDictionaryDetailViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Quest/QuestDictionaryDetailViewController.swift index cbe66d63..d19806c1 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Quest/QuestDictionaryDetailViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Quest/QuestDictionaryDetailViewController.swift @@ -22,7 +22,7 @@ private extension QuestDictionaryDetailViewController { imageUrl: reactor?.currentState.detailInfo.iconUrl, backgroundColor: type.backgroundColor, name: reactor?.currentState.detailInfo.nameKr ?? "이름 없음", - subText: "수락Lv.\(reactor?.currentState.detailInfo.minLevel ?? 0)" + subText: "수락 Lv.\(reactor?.currentState.detailInfo.minLevel ?? 0)" )) } From 7abef8c336aeafd88f5e2c1f9f3dba14d4b10c15 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 17:52:39 +0900 Subject: [PATCH 12/18] =?UTF-8?q?fix/#273:=20=EB=A7=B5=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EB=B0=8F=20=EC=B6=9C=ED=98=84=EB=A7=B5=20?= =?UTF-8?q?=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EA=B0=84=EA=B2=A9=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 --- .../DictionaryListCell.swift | 7 +- .../BookmarkListViewController.swift | 1 + .../DesignSystem/Components/CardList.swift | 8 +- .../Components/ItemImageView.swift | 8 ++ ...onsterDictionaryDetailViewController.swift | 2 +- .../DetailStackCardView.swift | 73 +++++++++++++++---- .../DictionaryListViewController.swift | 3 +- 7 files changed, 82 insertions(+), 20 deletions(-) diff --git a/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift b/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift index 570bba8c..21c7d543 100644 --- a/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift +++ b/MLS/Presentation/BaseFeature/BaseFeature/UICollectionReusableViews/CollectionViewCells/DictionaryListCell.swift @@ -69,6 +69,7 @@ public extension DictionaryListCell { input: Input, indexPath: IndexPath, collectionView: UICollectionView, + isMap: Bool = false, onBookmarkTapped: @escaping (Bool) -> Void ) { cellView.setType(type: type) @@ -80,7 +81,11 @@ public extension DictionaryListCell { // ⚠️ 셀이 재사용된 경우, indexPath가 다르면 무시 if let currentIndex = collectionView.indexPath(for: self), currentIndex == indexPath { - self.cellView.setImage(image: image ?? UIImage(), backgroundColor: input.type.backgroundColor) + if isMap { + self.cellView.setMapImage(image: image ?? UIImage(), backgroundColor: input.type.backgroundColor) + } else { + self.cellView.setImage(image: image ?? UIImage(), backgroundColor: input.type.backgroundColor) + } } } } diff --git a/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift b/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift index e51f3ccc..4c3f4973 100644 --- a/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift +++ b/MLS/Presentation/BookmarkFeature/BookmarkFeature/BookmarkList/BookmarkListViewController.swift @@ -251,6 +251,7 @@ extension BookmarkListViewController: UICollectionViewDelegate, UICollectionView ), indexPath: indexPath, collectionView: collectionView, + isMap: item.type == .map, onBookmarkTapped: { [weak self] isSelected in guard let self = self else { return } diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift index a892a172..0df6ace2 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift @@ -44,6 +44,7 @@ public final class CardList: UIView { static let imageContentViewSize: CGFloat = 80 static let stackViewSpacing: CGFloat = 4 static let iconSize: CGFloat = 24 + static let mapImageSize: CGFloat = 40 } // MARK: - Properties @@ -72,7 +73,7 @@ public final class CardList: UIView { public var onIconTapped: ((Bool) -> Void)? // MARK: - Components - private let imageView = ItemImageView(image: nil, cornerRadius: Constant.imageRadius, inset: Constant.imageInset, backgroundColor: .listMap) + public let imageView = ItemImageView(image: nil, cornerRadius: Constant.imageRadius, inset: Constant.imageInset, backgroundColor: .listMap) private lazy var textLabelStackView: UIStackView = { let view = UIStackView(arrangedSubviews: [mainTextLabel, subTextLabel]) @@ -119,7 +120,6 @@ public final class CardList: UIView { let stack = UIStackView(arrangedSubviews: [dropTitleLabel, dropValueLabel]) stack.axis = .vertical stack.alignment = .trailing - stack.spacing = 2 stack.isHidden = true // 기본은 숨김 return stack }() @@ -217,6 +217,10 @@ public extension CardList { imageView.setImage(image: image, backgroundColor: backgroundColor) } + func setMapImage(image: UIImage, backgroundColor: UIColor) { + imageView.setMapImage(image: image, backgroundColor: backgroundColor) + } + func setSelected(isSelected: Bool) { isIconSelected = isSelected } diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift index a346d11f..87866070 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift @@ -43,4 +43,12 @@ public extension ItemImageView { imageView.image = image self.backgroundColor = backgroundColor } + + func setMapImage(image: UIImage?, backgroundColor: UIColor) { + setImage(image: image, backgroundColor: backgroundColor) + imageView.snp.remakeConstraints { make in + make.center.equalToSuperview() + make.size.equalTo(40) + } + } } diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Monster/MonsterDictionaryDetailViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Monster/MonsterDictionaryDetailViewController.swift index b8a4102d..c7fdca31 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Monster/MonsterDictionaryDetailViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Monster/MonsterDictionaryDetailViewController.swift @@ -63,7 +63,7 @@ private extension MonsterDictionaryDetailViewController { for map in maps { appearMapView.inject(input: DetailStackCardView .Input( - type: .appearMonsterWithText, + type: .appearMapWithText, imageUrl: map.iconUrl, mainText: map.mapName, subText: map.regionName, diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackCardView.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackCardView.swift index 29fc15f1..cdca16a2 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackCardView.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackCardView.swift @@ -1,13 +1,11 @@ -import UIKit - import BaseFeature import DesignSystem import DomainInterface - import RxCocoa import RxGesture import RxSwift import SnapKit +import UIKit final class DetailStackCardView: UIStackView { // MARK: - Type @@ -19,7 +17,12 @@ final class DetailStackCardView: UIStackView { static let filterContainerTopMargin: CGFloat = 12 static let filterButtonTrailing: CGFloat = 8 static let viewSpacing: CGFloat = 10 - static let stackViewInset: UIEdgeInsets = .init(top: 12, left: 16, bottom: 0, right: 16) + static let stackViewInset: UIEdgeInsets = .init( + top: 12, + left: 16, + bottom: 0, + right: 16 + ) } // MARK: - Properties @@ -35,8 +38,20 @@ final class DetailStackCardView: UIStackView { // 몬스터 순서 필터 버튼 public let filterButton: UIButton = { let button = UIButton() - button.setAttributedTitle(.makeStyledString(font: .b_s_r, text: "드롭률 높은 순", color: .textColor), for: .normal) - button.setImage(DesignSystemAsset.image(named: "dropDown")?.withRenderingMode(.alwaysTemplate), for: .normal) + button.setAttributedTitle( + .makeStyledString( + font: .b_s_r, + text: "드롭률 높은 순", + color: .textColor + ), + for: .normal + ) + button.setImage( + DesignSystemAsset.image(named: "dropDown")?.withRenderingMode( + .alwaysTemplate + ), + for: .normal + ) button.tintColor = .textColor button.semanticContentAttribute = .forceRightToLeft @@ -63,21 +78,23 @@ final class DetailStackCardView: UIStackView { } // MARK: - SetUp -private extension DetailStackCardView { - func addViews() { +extension DetailStackCardView { + fileprivate func addViews() { addArrangedSubview(filterContainerView) filterContainerView.addSubview(filterButton) addArrangedSubview(spacer) } - func setUpConstraints() { + fileprivate func setUpConstraints() { filterContainerView.snp.makeConstraints { make in make.height.equalTo(Constant.filterContainerHeight) } filterButton.snp.makeConstraints { make in make.centerY.equalToSuperview() - make.trailing.equalToSuperview().inset(Constant.filterButtonTrailing) + make.trailing.equalToSuperview().inset( + Constant.filterButtonTrailing + ) } spacer.snp.makeConstraints { make in @@ -85,7 +102,7 @@ private extension DetailStackCardView { } } - func configureUI() { + fileprivate func configureUI() { axis = .vertical alignment = .fill distribution = .fill @@ -140,7 +157,17 @@ extension DetailStackCardView { cardView.setType(type: .detailStackText) ImageLoader.shared.loadImage(stringURL: input.imageUrl) { image in guard let image = image else { return } - cardView.setImage(image: image, backgroundColor: input.type.backgroundColor) + if input.type == .appearMap || input.type == .appearMapWithText { + cardView.setMapImage( + image: image, + backgroundColor: input.type.backgroundColor + ) + } else { + cardView.setImage( + image: image, + backgroundColor: input.type.backgroundColor + ) + } } cardView.mainText = input.mainText cardView.subText = input.subText @@ -178,17 +205,33 @@ extension DetailStackCardView { filterContainerView.isHidden = isHidden spacer.snp.remakeConstraints { make in - make.height.equalTo(isHidden ? Constant.topSpacing : Constant.filterSpacing) + make.height.equalTo( + isHidden ? Constant.topSpacing : Constant.filterSpacing + ) } } func selectFilter(selectedType: SortType) { - filterButton.setAttributedTitle(.makeStyledString(font: .b_s_r, text: selectedType.rawValue, color: .primary700), for: .normal) + filterButton.setAttributedTitle( + .makeStyledString( + font: .b_s_r, + text: selectedType.rawValue, + color: .primary700 + ), + for: .normal + ) filterButton.tintColor = .primary700 } func initFilter(firstFilter: SortType) { - filterButton.setAttributedTitle(.makeStyledString(font: .b_s_r, text: firstFilter.rawValue, color: .textColor), for: .normal) + filterButton.setAttributedTitle( + .makeStyledString( + font: .b_s_r, + text: firstFilter.rawValue, + color: .textColor + ), + for: .normal + ) } func reset() { diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift index f592fc6d..e1b6330d 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryList/DictionaryListViewController.swift @@ -218,10 +218,11 @@ extension DictionaryListViewController: UICollectionViewDelegate, UICollectionVi mainText: item.name, subText: subText, imageUrl: item.imageUrl ?? "", - isBookmarked: item.bookmarkId != nil + isBookmarked: item.bookmarkId != nil, ), indexPath: indexPath, collectionView: collectionView, + isMap: item.type == .map, onBookmarkTapped: { [weak self] isSelected in guard let self = self else { return } From 44226e2ff6277f844dbcf4525e975342ee797d8d Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 18:11:00 +0900 Subject: [PATCH 13/18] =?UTF-8?q?fix/#273:=20=EB=A7=B5=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=82=AC=EC=9D=B4=EC=A6=88=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 --- .../DictionaryDetail/DictionaryDetailBaseView.swift | 2 +- .../SectionStackView/DetailStackMapView.swift | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseView.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseView.swift index cc99f127..b40114f4 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseView.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/DictionaryDetailBaseView.swift @@ -343,7 +343,7 @@ private extension DictionaryDetailBaseView { imageView.snp.makeConstraints { make in make.center.equalToSuperview() - make.size.equalTo(Constant.imageSize) + make.width.equalTo(imageContentView.snp.width).multipliedBy(0.42) } bookmarkContentView.snp.makeConstraints { make in diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackMapView.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackMapView.swift index 380efa01..3fd3b0f6 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackMapView.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/SectionStackView/DetailStackMapView.swift @@ -54,6 +54,15 @@ private extension DetailStackMapView { extension DetailStackMapView { func setUpMapView(imageUrl: String?) { ImageLoader.shared.loadImage(stringURL: imageUrl) { [weak self] image in + if image == DesignSystemAsset.image(named: "connectionError") { + self?.mapImageView.snp.remakeConstraints { make in + make.size.equalTo(165) + } + } else { + self?.mapImageView.snp.remakeConstraints { make in + make.height.equalTo(self?.mapImageView.snp.width ?? 0) + } + } self?.mapImageView.image = image } } From 32f8a259f1cb49521f5b210625d06a8aa93099e9 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 19:51:12 +0900 Subject: [PATCH 14/18] =?UTF-8?q?fix/#273:=20=ED=80=98=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=ED=85=8D=EC=8A=A4=ED=8A=B8=20=EC=A0=9C?= =?UTF-8?q?=EC=95=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignSystem/DesignSystem/Components/CardList.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift index 0df6ace2..bd6fc755 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift @@ -164,17 +164,20 @@ private extension CardList { iconButton.snp.makeConstraints { make in make.centerY.equalToSuperview() + make.leading.equalTo(textLabelStackView.snp.trailing).offset(Constant.cardLeadingInset) make.trailing.equalToSuperview().inset(Constant.cardTrailingInset) make.size.equalTo(Constant.iconSize) } badge.snp.makeConstraints { make in make.centerY.equalToSuperview() + make.leading.equalTo(textLabelStackView.snp.trailing).offset(Constant.cardLeadingInset) make.trailing.equalToSuperview().inset(Constant.cardTrailingInset) } dropInfoStack.snp.makeConstraints { make in make.centerY.equalToSuperview() + make.leading.equalTo(textLabelStackView.snp.trailing).offset(Constant.cardLeadingInset) make.trailing.equalToSuperview().inset(Constant.cardTrailingInset) } } From 5daf861a1290debac2922878fe072e979c8abda3 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 20:04:42 +0900 Subject: [PATCH 15/18] =?UTF-8?q?fix/#273:=20=EC=95=84=EC=9D=B4=ED=85=9C?= =?UTF-8?q?=20=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B3=B5?= =?UTF-8?q?=EA=B2=A9=EC=86=8D=EB=8F=84=20=EB=8D=B0=EC=9D=B4=ED=84=B0=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 --- .../Item/ItemDictionaryDetailViewController.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift index 8354ee09..260e2173 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift @@ -92,6 +92,10 @@ private extension ItemDictionaryDetailViewController { detailInfoView.addInfo(mainText: title, subText: subText) } } + + if let attackSpeed = equipmentStats.attackSpeed, let attackSpeedDetails = equipmentStats.attackSpeedDetails { + detailInfoView.addInfo(mainText: "공격속도", subText: "\(attackSpeed) (\(attackSpeedDetails))") + } } if let scrollDetail = infos.scrollDetail { From 2e43c7257d1aa2102c1b11d552bef75061c2bae1 Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 20:09:14 +0900 Subject: [PATCH 16/18] =?UTF-8?q?fix/#273:=20=EC=83=81=EC=A0=90=ED=8C=90?= =?UTF-8?q?=EB=A7=A4=EA=B0=80=20number=20=ED=8F=AC=EB=A7=B7=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Item/ItemDictionaryDetailViewController.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift index 260e2173..c3a7c7e3 100644 --- a/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift +++ b/MLS/Presentation/DictionaryFeature/DictionaryFeature/DictionaryDetail/Item/ItemDictionaryDetailViewController.swift @@ -37,7 +37,8 @@ private extension ItemDictionaryDetailViewController { detailInfoView.descriptionLabel.text = infos.descriptionText ?? "" if let npcPrice = infos.npcPrice { - detailInfoView.addInfo(mainText: "상점판매가", subText: "\(npcPrice)메소") + let formattedPrice = NumberFormatter.localizedString(from: NSNumber(value: npcPrice), number: .decimal) + detailInfoView.addInfo(mainText: "상점판매가", subText: "\(formattedPrice) 메소") } if let availableJobs = infos.availableJobs { From c4dbaacd0b73f81bd6df78a25da221bb5fd001aa Mon Sep 17 00:00:00 2001 From: p2glet Date: Thu, 4 Dec 2025 21:28:32 +0900 Subject: [PATCH 17/18] =?UTF-8?q?fix/#273:=20CardView=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=20=EA=B0=80=EB=A1=9C=20=EC=A0=9C=EC=95=BD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignSystem/Components/CardList.swift | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift index bd6fc755..7e5b42ec 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/CardList.swift @@ -158,27 +158,30 @@ private extension CardList { textLabelStackView.snp.makeConstraints { make in make.leading.equalTo(imageView.snp.trailing).offset(Constant.cardLeadingInset) - make.trailing.lessThanOrEqualTo(dropInfoStack.snp.leading).offset(-Constant.cardLeadingInset) make.centerY.equalToSuperview() + make.trailing.lessThanOrEqualToSuperview().inset(Constant.cardTrailingInset) } - iconButton.snp.makeConstraints { make in + dropInfoStack.snp.makeConstraints { make in make.centerY.equalToSuperview() - make.leading.equalTo(textLabelStackView.snp.trailing).offset(Constant.cardLeadingInset) make.trailing.equalToSuperview().inset(Constant.cardTrailingInset) - make.size.equalTo(Constant.iconSize) } badge.snp.makeConstraints { make in make.centerY.equalToSuperview() - make.leading.equalTo(textLabelStackView.snp.trailing).offset(Constant.cardLeadingInset) make.trailing.equalToSuperview().inset(Constant.cardTrailingInset) } - dropInfoStack.snp.makeConstraints { make in + iconButton.snp.makeConstraints { make in make.centerY.equalToSuperview() - make.leading.equalTo(textLabelStackView.snp.trailing).offset(Constant.cardLeadingInset) make.trailing.equalToSuperview().inset(Constant.cardTrailingInset) + make.size.equalTo(Constant.iconSize) + } + + textLabelStackView.snp.makeConstraints { make in + make.trailing.lessThanOrEqualTo(dropInfoStack.snp.leading).offset(-Constant.cardLeadingInset) + make.trailing.lessThanOrEqualTo(badge.snp.leading).offset(-Constant.cardLeadingInset) + make.trailing.lessThanOrEqualTo(iconButton.snp.leading).offset(-Constant.cardLeadingInset) } } From e9d21add52770fccabdf69a953821cb833259b95 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 4 Dec 2025 15:30:34 +0000 Subject: [PATCH 18/18] style/#273: Apply SwiftLint autocorrect --- .../DesignSystem/DesignSystem/Components/ItemImageView.swift | 2 +- .../DesignSystem/DesignSystem/Components/SearchBar.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift index 87866070..57a15624 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/ItemImageView.swift @@ -43,7 +43,7 @@ public extension ItemImageView { imageView.image = image self.backgroundColor = backgroundColor } - + func setMapImage(image: UIImage?, backgroundColor: UIColor) { setImage(image: image, backgroundColor: backgroundColor) imageView.snp.remakeConstraints { make in diff --git a/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift b/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift index 52488474..67008b75 100644 --- a/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift +++ b/MLS/Presentation/DesignSystem/DesignSystem/Components/SearchBar.swift @@ -9,7 +9,7 @@ public protocol SearchBarDelegate: AnyObject { public final class SearchBar: UIView { // MARK: - Properties public weak var searchDelegate: SearchBarDelegate? - + // MARK: - Components public let backButton: UIButton = { let button = UIButton(type: .system)