diff --git a/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj b/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj index a002f2a3..01743941 100644 --- a/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj +++ b/HealthFoodMe/HealthFoodMe.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 2EB23785D4711C41BE97BA3F /* Pods_HealthFoodMe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14DC488961BE98CD8C010993 /* Pods_HealthFoodMe.framework */; }; 3B0B25542876BBE400950539 /* NotoSansCJKkr-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3B0B254E2876BBE300950539 /* NotoSansCJKkr-Regular.otf */; }; 3B0B25552876BBE400950539 /* Pretendard-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3B0B254F2876BBE300950539 /* Pretendard-Bold.otf */; }; 3B0B25562876BBE400950539 /* Pretendard-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3B0B25502876BBE300950539 /* Pretendard-Regular.otf */; }; @@ -16,13 +15,13 @@ 3B0B25592876BBE400950539 /* NotoSansCJKkr-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3B0B25532876BBE400950539 /* NotoSansCJKkr-Medium.otf */; }; 3BCC441E28745FD800661A12 /* SocialLoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BCC441D28745FD800661A12 /* SocialLoginVC.swift */; }; 3BCC442028745FE500661A12 /* SocialLogin.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3BCC441F28745FE500661A12 /* SocialLogin.storyboard */; }; + 5886D49E10282855ADBDE143 /* Pods_HealthFoodMe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 142C37AC02B7DBB941359F4B /* Pods_HealthFoodMe.framework */; }; 69028BA62874673600373984 /* MenuCellCVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69028BA52874673600373984 /* MenuCellCVC.swift */; }; 69028BA82874675800373984 /* MenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69028BA72874675800373984 /* MenuView.swift */; }; 69028BAA287467F100373984 /* MenuDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69028BA9287467F100373984 /* MenuDetailView.swift */; }; 69028BAC2874681700373984 /* MenuTabVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69028BAB2874681700373984 /* MenuTabVC.swift */; }; 69028BB02874A60E00373984 /* HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69028BAF2874A60E00373984 /* HeaderView.swift */; }; 690AB5492875C1B200DE72D4 /* MenuDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 690AB5482875C1B200DE72D4 /* MenuDataModel.swift */; }; - 695758B7287D7B6700E36789 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 695758B6287D7B6700E36789 /* Config.swift */; }; 695758B9287D7C0B00E36789 /* MenuTab.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 695758B8287D7C0B00E36789 /* MenuTab.storyboard */; }; A938BB8E287D221200B8DE07 /* Search.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A938BB8D287D221200B8DE07 /* Search.storyboard */; }; A938BB90287D222800B8DE07 /* MainDetail.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A938BB8F287D222800B8DE07 /* MainDetail.storyboard */; }; @@ -119,10 +118,15 @@ EBF66B082872AF5B00DE0ED1 /* SampleEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF66B072872AF5B00DE0ED1 /* SampleEntity.swift */; }; EBF66B0A2872B21F00DE0ED1 /* StringLiterals.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF66B092872B21F00DE0ED1 /* StringLiterals.swift */; }; EBF66B0C2872B4FE00DE0ED1 /* StoryboardLiterals.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF66B0B2872B4FE00DE0ED1 /* StoryboardLiterals.swift */; }; + FD58291A287DC39A00CE62E8 /* mapContainerViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD582917287DC39A00CE62E8 /* mapContainerViewDelegateProxy.swift */; }; + FD58291B287DC39A00CE62E8 /* mapContainerView + Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD582918287DC39A00CE62E8 /* mapContainerView + Reactive.swift */; }; + FD58291C287DC39A00CE62E8 /* mapContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD582919287DC39A00CE62E8 /* mapContainerView.swift */; }; + FD89904F287DC4F400144E07 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD89904E287DC4F400144E07 /* Config.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 14DC488961BE98CD8C010993 /* Pods_HealthFoodMe.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HealthFoodMe.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0CC83077EBB8A80956139111 /* Pods-HealthFoodMe.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HealthFoodMe.release.xcconfig"; path = "Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe.release.xcconfig"; sourceTree = ""; }; + 142C37AC02B7DBB941359F4B /* Pods_HealthFoodMe.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HealthFoodMe.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3B0B254D28757C7100950539 /* HealthFoodMe.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = HealthFoodMe.entitlements; sourceTree = ""; }; 3B0B254E2876BBE300950539 /* NotoSansCJKkr-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSansCJKkr-Regular.otf"; sourceTree = ""; }; 3B0B254F2876BBE300950539 /* Pretendard-Bold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Pretendard-Bold.otf"; sourceTree = ""; }; @@ -132,13 +136,13 @@ 3B0B25532876BBE400950539 /* NotoSansCJKkr-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSansCJKkr-Medium.otf"; sourceTree = ""; }; 3BCC441D28745FD800661A12 /* SocialLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialLoginVC.swift; sourceTree = ""; }; 3BCC441F28745FE500661A12 /* SocialLogin.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SocialLogin.storyboard; sourceTree = ""; }; + 489A65A68E12AA2585E17522 /* Pods-HealthFoodMe.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HealthFoodMe.debug.xcconfig"; path = "Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe.debug.xcconfig"; sourceTree = ""; }; 69028BA52874673600373984 /* MenuCellCVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuCellCVC.swift; sourceTree = ""; }; 69028BA72874675800373984 /* MenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuView.swift; sourceTree = ""; }; 69028BA9287467F100373984 /* MenuDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuDetailView.swift; sourceTree = ""; }; 69028BAB2874681700373984 /* MenuTabVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuTabVC.swift; sourceTree = ""; }; 69028BAF2874A60E00373984 /* HeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderView.swift; sourceTree = ""; }; 690AB5482875C1B200DE72D4 /* MenuDataModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuDataModel.swift; sourceTree = ""; }; - 695758B6287D7B6700E36789 /* Config.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; 695758B8287D7C0B00E36789 /* MenuTab.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MenuTab.storyboard; sourceTree = ""; }; A938BB8D287D221200B8DE07 /* Search.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Search.storyboard; sourceTree = ""; }; A938BB8F287D222800B8DE07 /* MainDetail.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MainDetail.storyboard; sourceTree = ""; }; @@ -147,7 +151,6 @@ A9E593C62874266200B0F8B5 /* SearchRecent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecent.swift; sourceTree = ""; }; A9E593CE2876C26900B0F8B5 /* Color.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Color.xcassets; sourceTree = ""; }; A9E593D0287818E900B0F8B5 /* SearchTVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTVC.swift; sourceTree = ""; }; - E71673C053B2E49E39F1AADB /* Pods-HealthFoodMe.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HealthFoodMe.release.xcconfig"; path = "Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe.release.xcconfig"; sourceTree = ""; }; EB033E83287B5BE300C48FB9 /* StarRatingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StarRatingView.swift; sourceTree = ""; }; EB085ED628716E1900361837 /* HealthFoodMe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HealthFoodMe.app; sourceTree = BUILT_PRODUCTS_DIR; }; EB085EE728716E1B00361837 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -238,7 +241,10 @@ EBF66B072872AF5B00DE0ED1 /* SampleEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleEntity.swift; sourceTree = ""; }; EBF66B092872B21F00DE0ED1 /* StringLiterals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringLiterals.swift; sourceTree = ""; }; EBF66B0B2872B4FE00DE0ED1 /* StoryboardLiterals.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardLiterals.swift; sourceTree = ""; }; - FB08F925E37E9FAB6970F6A9 /* Pods-HealthFoodMe.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-HealthFoodMe.debug.xcconfig"; path = "Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe.debug.xcconfig"; sourceTree = ""; }; + FD582917287DC39A00CE62E8 /* mapContainerViewDelegateProxy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = mapContainerViewDelegateProxy.swift; sourceTree = ""; }; + FD582918287DC39A00CE62E8 /* mapContainerView + Reactive.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "mapContainerView + Reactive.swift"; sourceTree = ""; }; + FD582919287DC39A00CE62E8 /* mapContainerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = mapContainerView.swift; sourceTree = ""; }; + FD89904E287DC4F400144E07 /* Config.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -246,7 +252,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2EB23785D4711C41BE97BA3F /* Pods_HealthFoodMe.framework in Frameworks */, + 5886D49E10282855ADBDE143 /* Pods_HealthFoodMe.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -324,6 +330,14 @@ path = Views; sourceTree = ""; }; + 9BB188F7D898EEB7C5ABA8BD /* Frameworks */ = { + isa = PBXGroup; + children = ( + 142C37AC02B7DBB941359F4B /* Pods_HealthFoodMe.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; A9325272287D24CD001EDF50 /* Search */ = { isa = PBXGroup; children = ( @@ -376,19 +390,11 @@ path = Object; sourceTree = ""; }; - AED78D77F3472DE575D5B1A2 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 14DC488961BE98CD8C010993 /* Pods_HealthFoodMe.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; E3F60CBC9B890A7FB4D4AAAF /* Pods */ = { isa = PBXGroup; children = ( - FB08F925E37E9FAB6970F6A9 /* Pods-HealthFoodMe.debug.xcconfig */, - E71673C053B2E49E39F1AADB /* Pods-HealthFoodMe.release.xcconfig */, + 489A65A68E12AA2585E17522 /* Pods-HealthFoodMe.debug.xcconfig */, + 0CC83077EBB8A80956139111 /* Pods-HealthFoodMe.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -407,7 +413,7 @@ EB085ED828716E1900361837 /* HealthFoodMe */, EB085ED728716E1900361837 /* Products */, E3F60CBC9B890A7FB4D4AAAF /* Pods */, - AED78D77F3472DE575D5B1A2 /* Frameworks */, + 9BB188F7D898EEB7C5ABA8BD /* Frameworks */, ); sourceTree = ""; }; @@ -565,6 +571,7 @@ EB6A44E32873BABE00749582 /* MainMapScene */ = { isa = PBXGroup; children = ( + FD582916287DC2C500CE62E8 /* Views */, EB6A44E42873BACA00749582 /* VC */, EB6A44E52873BACD00749582 /* ViewModel */, ); @@ -869,8 +876,8 @@ EBF66A8B287227F500DE0ED1 /* Environment */ = { isa = PBXGroup; children = ( + FD89904E287DC4F400144E07 /* Config.swift */, EBF66A8C287227F500DE0ED1 /* NetworkConstants.swift */, - 695758B6287D7B6700E36789 /* Config.swift */, ); path = Environment; sourceTree = ""; @@ -984,6 +991,16 @@ path = Entity; sourceTree = ""; }; + FD582916287DC2C500CE62E8 /* Views */ = { + isa = PBXGroup; + children = ( + FD582919287DC39A00CE62E8 /* mapContainerView.swift */, + FD582917287DC39A00CE62E8 /* mapContainerViewDelegateProxy.swift */, + FD582918287DC39A00CE62E8 /* mapContainerView + Reactive.swift */, + ); + path = Views; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -991,12 +1008,12 @@ isa = PBXNativeTarget; buildConfigurationList = EB085EEA28716E1B00361837 /* Build configuration list for PBXNativeTarget "HealthFoodMe" */; buildPhases = ( - EA402D2917C481F372EF3E0F /* [CP] Check Pods Manifest.lock */, + 40BAC3ABC541EA4CA066481E /* [CP] Check Pods Manifest.lock */, EB085ED228716E1900361837 /* Sources */, EB085ED328716E1900361837 /* Frameworks */, EB085ED428716E1900361837 /* Resources */, EB6A44C5287365E400749582 /* ShellScript */, - F5536ACFA7D238A1253C5861 /* [CP] Embed Pods Frameworks */, + 096883CAE67A2496108CA711 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -1067,29 +1084,24 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - EA402D2917C481F372EF3E0F /* [CP] Check Pods Manifest.lock */ = { + 096883CAE67A2496108CA711 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-HealthFoodMe-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - EB6A44C5287365E400749582 /* ShellScript */ = { + 40BAC3ABC541EA4CA066481E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1097,31 +1109,36 @@ inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-HealthFoodMe-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "${PODS_ROOT}/SwiftLint/swiftlint\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - F5536ACFA7D238A1253C5861 /* [CP] Embed Pods Frameworks */ = { + EB6A44C5287365E400749582 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + ); outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-HealthFoodMe/Pods-HealthFoodMe-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "${PODS_ROOT}/SwiftLint/swiftlint\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -1133,6 +1150,7 @@ EBF66AFF287227F500DE0ED1 /* makeAlert.swift in Sources */, EBF66AF3287227F500DE0ED1 /* applyShadow.swift in Sources */, EB6A44D628737CC400749582 /* MainDetailEntity.swift in Sources */, + FD89904F287DC4F400144E07 /* Config.swift in Sources */, EB6A4515287425F900749582 /* DetailTabTVC.swift in Sources */, EBF66AE5287227F500DE0ED1 /* NetworkConstants.swift in Sources */, EB6A44F32873BED500749582 /* MainMapEntity.swift in Sources */, @@ -1146,6 +1164,7 @@ EBF66AC5287227F500DE0ED1 /* UITextField+.swift in Sources */, EBF66AE6287227F500DE0ED1 /* AuthService.swift in Sources */, EBF66AFB287227F500DE0ED1 /* setImage.swift in Sources */, + FD58291C287DC39A00CE62E8 /* mapContainerView.swift in Sources */, EBF66AF6287227F500DE0ED1 /* setRootViewController.swift in Sources */, EBF66AD4287227F500DE0ED1 /* UICollectionViewRegisterable.swift in Sources */, EB6A44D128737CC400749582 /* MainDetailUseCase.swift in Sources */, @@ -1154,6 +1173,7 @@ EBF66AF8287227F500DE0ED1 /* JsonCoder.swift in Sources */, EBF66AFA287227F500DE0ED1 /* getClassName.swift in Sources */, EBF66AE4287227F500DE0ED1 /* HeaderType.swift in Sources */, + FD58291A287DC39A00CE62E8 /* mapContainerViewDelegateProxy.swift in Sources */, EBF66ADB287227F500DE0ED1 /* LaunchInstructor.swift in Sources */, EBF66B01287227F500DE0ED1 /* PostDetail.swift in Sources */, EBF66ABC287227F500DE0ED1 /* UserDefaults+.swift in Sources */, @@ -1171,7 +1191,7 @@ EBF66AC1287227F500DE0ED1 /* UIStackView+.swift in Sources */, EBF66AF1287227F500DE0ED1 /* ShowToast.swift in Sources */, EBF66AC4287227F500DE0ED1 /* UIButton+.swift in Sources */, - 695758B7287D7B6700E36789 /* Config.swift in Sources */, + FD58291B287DC39A00CE62E8 /* mapContainerView + Reactive.swift in Sources */, EBF66AF0287227F500DE0ED1 /* BaseVC.swift in Sources */, EBF66B082872AF5B00DE0ED1 /* SampleEntity.swift in Sources */, EBF66B03287227F500DE0ED1 /* SignUp.swift in Sources */, @@ -1360,7 +1380,7 @@ }; EB085EEB28716E1B00361837 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FB08F925E37E9FAB6970F6A9 /* Pods-HealthFoodMe.debug.xcconfig */; + baseConfigurationReference = 489A65A68E12AA2585E17522 /* Pods-HealthFoodMe.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1383,7 +1403,7 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.healthFoodMe.release; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = HealthFoodMe_Dev; + PROVISIONING_PROFILE_SPECIFIER = healthFood_dev; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; @@ -1392,7 +1412,7 @@ }; EB085EEC28716E1B00361837 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E71673C053B2E49E39F1AADB /* Pods-HealthFoodMe.release.xcconfig */; + baseConfigurationReference = 0CC83077EBB8A80956139111 /* Pods-HealthFoodMe.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1415,7 +1435,7 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.healthFoodMe.release; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = HealthFoodMe_Dist; + PROVISIONING_PROFILE_SPECIFIER = healthfood_distribution; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; diff --git a/HealthFoodMe/HealthFoodMe/Domain/Model/Map/MainMapScene/MainMapModel.swift b/HealthFoodMe/HealthFoodMe/Domain/Model/Map/MainMapScene/MainMapModel.swift index 791f5cad..e0640faa 100644 --- a/HealthFoodMe/HealthFoodMe/Domain/Model/Map/MainMapScene/MainMapModel.swift +++ b/HealthFoodMe/HealthFoodMe/Domain/Model/Map/MainMapScene/MainMapModel.swift @@ -7,6 +7,13 @@ import Foundation -struct MainMapModel { +struct MapPointDataModel { + let latitude: Double + let longtitude: Double + let type: PointerType +} +enum PointerType { + case normalFood + case healthFood } diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/Contents.json b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/Contents.json b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/Contents.json new file mode 100644 index 00000000..1ab86bd9 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "icn_diet.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icn_diet@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icn_diet@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet.png new file mode 100644 index 00000000..d5f186af Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet@2x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet@2x.png new file mode 100644 index 00000000..18fd676b Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet@2x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet@3x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet@3x.png new file mode 100644 index 00000000..b3060245 Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet.imageset/icn_diet@3x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/Contents.json b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/Contents.json new file mode 100644 index 00000000..9ab3e3f9 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "icn_diet_selected.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icn_diet_selected@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icn_diet_selected@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected.png new file mode 100644 index 00000000..ce8c4a15 Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected@2x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected@2x.png new file mode 100644 index 00000000..fa63d47c Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected@2x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected@3x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected@3x.png new file mode 100644 index 00000000..adf03c22 Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_diet_selected.imageset/icn_diet_selected@3x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/Contents.json b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/Contents.json new file mode 100644 index 00000000..8399f172 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "icn_normal.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icn_normal@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icn_normal@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal.png new file mode 100644 index 00000000..5aca2f2f Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal@2x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal@2x.png new file mode 100644 index 00000000..33c06c47 Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal@2x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal@3x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal@3x.png new file mode 100644 index 00000000..8ba2db0d Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal.imageset/icn_normal@3x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/Contents.json b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/Contents.json new file mode 100644 index 00000000..24ac3d3d --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "icn_normal_seleted.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icn_normal_seleted@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icn_normal_seleted@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted.png new file mode 100644 index 00000000..2818daf9 Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted@2x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted@2x.png new file mode 100644 index 00000000..35f5db0b Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted@2x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted@3x.png b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted@3x.png new file mode 100644 index 00000000..a8603b2c Binary files /dev/null and b/HealthFoodMe/HealthFoodMe/Global/Resources/Assets.xcassets/Map/icn_normal_seleted.imageset/icn_normal_seleted@3x.png differ diff --git a/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerView + Reactive.swift b/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerView + Reactive.swift new file mode 100644 index 00000000..050e8591 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerView + Reactive.swift @@ -0,0 +1,26 @@ +// +// NaverMapContainerView + Reactive.swift +// NaverMap + RxDelegate +// +// Created by 송지훈 on 2022/07/12. +// + +import NMapsMap +import RxCocoa +import RxSwift + +extension Reactive where Base: NaverMapContainerView { + internal var pointList: Binder<[MapPointDataModel]> { + return Binder(self.base) { containerView, points in + containerView.pointList.accept(points) + } + } +} + +extension Reactive where Base: NaverMapContainerView { + internal var currentSelectPoint: Binder { + return Binder(self.base) { containerView, point in + containerView.setSelectPoint.accept(point) + } + } +} diff --git a/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerView.swift b/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerView.swift new file mode 100644 index 00000000..06ae2649 --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerView.swift @@ -0,0 +1,128 @@ +// +// NaverMapContainerView.swift +// NaverMap + RxDelegate +// +// Created by 송지훈 on 2022/07/12. +// + +import Foundation +import NMapsMap +import RxRelay +import RxSwift + +final class NaverMapContainerView: UIView{ + + private let disposeBag = DisposeBag() + private var markers = [NMFMarker]() + private var previousMarker: NMFMarker? = nil + private var selectedMarker: NMFMarker? = nil + var naverMapView = NMFNaverMapView() + var delegate: NMFMapViewTouchDelegate? + var pointList = PublishRelay<[MapPointDataModel]>() + var setSelectPoint = PublishRelay() + var disableSelectPoint = PublishRelay() + + override init(frame: CGRect) { + super.init(frame: frame) + bindRelay() + setUI() + moveCameraPosition(NMGLatLng(lat: 37.5666102, lng: 126.9783881)) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + bindRelay() + setUI() + moveCameraPosition(NMGLatLng(lat: 37.5666102, lng: 126.9783881)) + } +} + +extension NaverMapContainerView { + private func setUI() { + naverMapView = NMFNaverMapView(frame: self.frame) + naverMapView.showLocationButton = true + naverMapView.mapView.positionMode = .compass + + addSubview(naverMapView) + + naverMapView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + } + + private func moveCameraPosition(_ point: NMGLatLng) { + let cameraUpdate = NMFCameraUpdate(scrollTo: point) + cameraUpdate.animation = .fly + cameraUpdate.animationDuration = 2 + naverMapView.mapView.moveCamera(cameraUpdate) + } + + private func bindRelay() { + pointList.subscribe(onNext: { [weak self] pointList in + guard let self = self else { return } + self.setPointMarkers(pointList) + }).disposed(by: self.disposeBag) + + setSelectPoint.subscribe(onNext: { [weak self] selectedPoint in + self?.setClickedMarker(selectedPoint) + }).disposed(by: self.disposeBag) + + disableSelectPoint.subscribe(onNext: { [weak self] in + self?.disableAllMarker() + }).disposed(by: self.disposeBag) + + } + + private func setPointMarkers(_ points: [MapPointDataModel]) { + DispatchQueue.global(qos: .default).async { + for point in points { + let marker = NMFMarker() + marker.position = NMGLatLng.init(lat: point.latitude, lng: point.longtitude) + self.setMarkState(mark: marker, selectState: false) + marker.touchHandler = { _ in + if let seletedMark = self.selectedMarker { + self.setMarkState(mark: seletedMark, selectState: false) + } + self.setMarkState(mark: marker, selectState: true) + self.setSelectPoint.accept(point) + self.selectedMarker = marker + return true + } + self.markers.append(marker) + } + DispatchQueue.main.async { [weak self] in + guard let self = self else { return } + for marker in self.markers { + marker.mapView = self.naverMapView.mapView + } + } + } + } + + private func setClickedMarker(_ selectedPoint: MapPointDataModel) { + let NMGPosition = NMGLatLng(lat: selectedPoint.latitude, + lng: selectedPoint.longtitude) + guard let marker = markers.filter({ point in + return point.position == NMGPosition + }).first else { return } + moveCameraPosition(NMGPosition) + if let seletedMark = self.selectedMarker { + setMarkState(mark: seletedMark, selectState: false) + } + setMarkState(mark: marker, selectState: true) + self.selectedMarker = marker + } + + private func disableAllMarker() { + guard selectedMarker != nil else { return } + setMarkState(mark: selectedMarker!, selectState: false) + } + + private func setMarkState(mark: NMFMarker, selectState: Bool) { + let iconName = selectState ? "icn_normal_seleted" : "icn_normal" + mark.iconImage = NMFOverlayImage.init(image: UIImage(named: iconName) ?? UIImage()) + } +} + + diff --git a/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerViewDelegateProxy.swift b/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerViewDelegateProxy.swift new file mode 100644 index 00000000..c89af5ce --- /dev/null +++ b/HealthFoodMe/HealthFoodMe/Presentation/Map/MainMapScene/Views/mapContainerViewDelegateProxy.swift @@ -0,0 +1,37 @@ +// +// NaverMapContainerViewDelegateProxy.swift +// NaverMap + RxDelegate +// +// Created by 송지훈 on 2022/07/12. +// + +import NMapsMap +import RxCocoa +import RxSwift + +final class NaverMapContainerViewDelegateProxy: DelegateProxy,DelegateProxyType, NMFMapViewTouchDelegate { + static func registerKnownImplementations() { + self.register { (object) -> NaverMapContainerViewDelegateProxy in + NaverMapContainerViewDelegateProxy(parentObject: object, delegateProxy:self) + } + } + + static func currentDelegate(for object: NaverMapContainerView) -> NMFMapViewTouchDelegate? { + return object.naverMapView.mapView.touchDelegate + } + + static func setCurrentDelegate(_ delegate: NMFMapViewTouchDelegate?, to object: NaverMapContainerView) { + object.naverMapView.mapView.touchDelegate = delegate + } +} + +extension Reactive where Base: NaverMapContainerView { + var delegate: DelegateProxy { + return NaverMapContainerViewDelegateProxy.proxy(for: self.base) + } + + var mapViewClicked: Observable { + return delegate.methodInvoked(#selector(NMFMapViewTouchDelegate.mapView(_:didTapMap:point:))) + .map { _ in return ()} + } +}