diff --git a/Segno/Segno.xcodeproj/project.pbxproj b/Segno/Segno.xcodeproj/project.pbxproj index 6e7acd3..d6573f5 100644 --- a/Segno/Segno.xcodeproj/project.pbxproj +++ b/Segno/Segno.xcodeproj/project.pbxproj @@ -72,6 +72,7 @@ 7940FB31292E065100276EFC /* DiaryDetailEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7940FB30292E065100276EFC /* DiaryDetailEndpoint.swift */; }; 7940FB33292E065F00276EFC /* DiaryDetailUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7940FB32292E065F00276EFC /* DiaryDetailUseCase.swift */; }; 79767E64293E2A1200E489DD /* DiaryDeleteEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79767E63293E2A1200E489DD /* DiaryDeleteEndpoint.swift */; }; + 98003E0E293F20F6009FBC35 /* DarkModeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98003E0D293F20F6009FBC35 /* DarkModeManager.swift */; }; 9825F41B29377875005F2163 /* ChangeNicknameUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9825F41A29377875005F2163 /* ChangeNicknameUseCase.swift */; }; 9825F41D29377ACF005F2163 /* SettingsRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9825F41C29377ACF005F2163 /* SettingsRepository.swift */; }; 982A2A472924AE74006F6ACD /* UserDefaultsKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982A2A462924AE74006F6ACD /* UserDefaultsKey.swift */; }; @@ -162,6 +163,7 @@ 7940FB30292E065100276EFC /* DiaryDetailEndpoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiaryDetailEndpoint.swift; sourceTree = ""; }; 7940FB32292E065F00276EFC /* DiaryDetailUseCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiaryDetailUseCase.swift; sourceTree = ""; }; 79767E63293E2A1200E489DD /* DiaryDeleteEndpoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiaryDeleteEndpoint.swift; sourceTree = ""; }; + 98003E0D293F20F6009FBC35 /* DarkModeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DarkModeManager.swift; sourceTree = ""; }; 9825F41A29377875005F2163 /* ChangeNicknameUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChangeNicknameUseCase.swift; sourceTree = ""; }; 9825F41C29377ACF005F2163 /* SettingsRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsRepository.swift; sourceTree = ""; }; 982A2A462924AE74006F6ACD /* UserDefaultsKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsKey.swift; sourceTree = ""; }; @@ -253,6 +255,7 @@ 4F317791291BEB490019BDFC /* Data */ = { isa = PBXGroup; children = ( + 98003E0C293F20E7009FBC35 /* Manager */, 4FCAC5C3292B792200BF9CDD /* Session */, 4F3177A0291BF1810019BDFC /* Repository */, 4F31779F291BF1780019BDFC /* Network */, @@ -477,6 +480,14 @@ path = Font; sourceTree = ""; }; + 98003E0C293F20E7009FBC35 /* Manager */ = { + isa = PBXGroup; + children = ( + 98003E0D293F20F6009FBC35 /* DarkModeManager.swift */, + ); + path = Manager; + sourceTree = ""; + }; 9894EAF629375272005F2B15 /* Utility */ = { isa = PBXGroup; children = ( @@ -592,6 +603,7 @@ 66A8CF6D29379A9900C17F84 /* UserDetailEndpoint.swift in Sources */, 4FEBFAAD291CF62E00E78139 /* DiaryDetail.swift in Sources */, 4FEBFAB1291CFB5500E78139 /* SHMediaItem+.swift in Sources */, + 98003E0E293F20F6009FBC35 /* DarkModeManager.swift in Sources */, 66A8CF692937945300C17F84 /* UserDetailUseCase.swift in Sources */, 988414AE2922235B007C9132 /* LocalUtilityRepository.swift in Sources */, 66A8CF612935F44100C17F84 /* MyPageViewModel.swift in Sources */, diff --git a/Segno/Segno/Application/SceneDelegate.swift b/Segno/Segno/Application/SceneDelegate.swift index a60dffe..d483b1c 100644 --- a/Segno/Segno/Application/SceneDelegate.swift +++ b/Segno/Segno/Application/SceneDelegate.swift @@ -19,6 +19,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let navigationController = UINavigationController() coordinator = AppCoordinator(navigationController) coordinator?.start() + setDarkMode() window?.rootViewController = navigationController window?.makeKeyAndVisible() @@ -29,5 +30,10 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { func sceneWillResignActive(_ scene: UIScene) { } func sceneWillEnterForeground(_ scene: UIScene) { } func sceneDidEnterBackground(_ scene: UIScene) { } + + private func setDarkMode() { + let mode = DarkModeManager.shared.getDarkMode() + DarkModeManager.shared.changeDarkMode(to: mode) + } } diff --git a/Segno/Segno/Data/Manager/DarkModeManager.swift b/Segno/Segno/Data/Manager/DarkModeManager.swift new file mode 100644 index 0000000..dc42f81 --- /dev/null +++ b/Segno/Segno/Data/Manager/DarkModeManager.swift @@ -0,0 +1,41 @@ +// +// DarkModeManager.swift +// Segno +// +// Created by YOONJONG on 2022/12/06. +// + +import UIKit + +import RxSwift + +class DarkModeManager { + static let shared = DarkModeManager() + + let repository: LocalUtilityRepository + + private init() { + self.repository = LocalUtilityRepositoryImpl() + } + + func getDarkMode() -> Int { + if let mode = repository.getUserDefaultsObject(forKey: .darkmode) as? Int { + debugPrint("SettingsUseCase - getDarkMode : 키가 있습니다 - \(mode)") + return mode + } else { + repository.setUserDefaults(DarkMode.system.rawValue, forKey: .darkmode) + debugPrint("SettingsUseCase - getDarkMode : 키가 없어 \(DarkMode.system.rawValue) 로 설정합니다.") + return DarkMode.system.rawValue + } + } + + func changeDarkMode(to mode: Int) { + repository.setUserDefaults(mode, forKey: .darkmode) + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene, + let window = windowScene.windows.first else { return } + + window.overrideUserInterfaceStyle = UIUserInterfaceStyle(rawValue: mode) ?? .unspecified + debugPrint("SettingsUseCase - changeDarkMode : \(mode)로 설정") + + } +} diff --git a/Segno/Segno/Data/Repository/LocalUtilityRepository.swift b/Segno/Segno/Data/Repository/LocalUtilityRepository.swift index bc2c4e9..3eb9d8e 100644 --- a/Segno/Segno/Data/Repository/LocalUtilityRepository.swift +++ b/Segno/Segno/Data/Repository/LocalUtilityRepository.swift @@ -88,13 +88,11 @@ final class LocalUtilityRepositoryImpl: LocalUtilityRepository { } func setUserDefaults(_ value: Any, forKey defaultsKey: UserDefaultsKey) { - let defaults = UserDefaults.standard - defaults.set(value, forKey: defaultsKey.rawValue) + UserDefaults.standard.set(value, forKey: defaultsKey.rawValue) } func getUserDefaultsObject(forKey defaultsKey: UserDefaultsKey) -> Any? { - let defaults = UserDefaults.standard - if let object = defaults.object(forKey: defaultsKey.rawValue) { + if let object = UserDefaults.standard.object(forKey: defaultsKey.rawValue) { return object } else { return nil diff --git a/Segno/Segno/Domain/UseCase/SettingsUseCase.swift b/Segno/Segno/Domain/UseCase/SettingsUseCase.swift index 11e3f76..4b0d34e 100644 --- a/Segno/Segno/Domain/UseCase/SettingsUseCase.swift +++ b/Segno/Segno/Domain/UseCase/SettingsUseCase.swift @@ -39,18 +39,10 @@ final class SettingsUseCaseImpl: SettingsUseCase { } func getDarkMode() -> Int { - if let mode = repository.getUserDefaultsObject(forKey: .darkmode) as? Int { - debugPrint("SettingsUseCase - getDarkMode : 키가 있습니다 - \(mode)") - return mode - } else { - repository.setUserDefaults(DarkMode.system.rawValue, forKey: .darkmode) - debugPrint("SettingsUseCase - getDarkMode : 키가 없어 \(DarkMode.system.rawValue) 로 설정합니다.") - return DarkMode.system.rawValue - } + return DarkModeManager.shared.getDarkMode() } func changeDarkMode(to mode: Int) { - repository.setUserDefaults(mode, forKey: .darkmode) - debugPrint("SettingsUseCase - changeDarkMode : \(mode)로 설정") + DarkModeManager.shared.changeDarkMode(to: mode) } } diff --git a/Segno/Segno/Presentation/View/NicknameCell.swift b/Segno/Segno/Presentation/View/NicknameCell.swift index 953e5e9..4bcd8ae 100644 --- a/Segno/Segno/Presentation/View/NicknameCell.swift +++ b/Segno/Segno/Presentation/View/NicknameCell.swift @@ -34,7 +34,7 @@ final class NicknameCell: UITableViewCell { let label = UILabel() label.text = Metric.nicknameLabelText label.font = .appFont(.surroundAir, size: Metric.textSize) - label.textColor = .appColor(.grey2) + label.textColor = .appColor(.grey3) return label }() diff --git a/Segno/Segno/Presentation/ViewController/SettingsViewController.swift b/Segno/Segno/Presentation/ViewController/SettingsViewController.swift index ef1a8b8..be7a060 100644 --- a/Segno/Segno/Presentation/ViewController/SettingsViewController.swift +++ b/Segno/Segno/Presentation/ViewController/SettingsViewController.swift @@ -21,6 +21,12 @@ enum SettingsCellActions: Int { } final class SettingsViewController: UIViewController { + private enum Metric { + static let settingString: String = "설정" + static let darkModeSettingString: String = "다크 모드 설정" + static let cancelMessage: String = "취소" + } + private let disposeBag = DisposeBag() private let viewModel: SettingsViewModel private lazy var tableView: UITableView = { @@ -50,7 +56,7 @@ final class SettingsViewController: UIViewController { } private func setupView() { - title = "설정" + title = Metric.settingString view.backgroundColor = .appColor(.background) } @@ -118,21 +124,26 @@ final class SettingsViewController: UIViewController { guard let action = SettingsCellActions(rawValue: indexPath.row) else { return } switch action { case .darkmode: // 다크 모드 설정 - guard let cell = self?.tableView.cellForRow(at: indexPath) as? SettingsActionSheetCell else { return } - let actionSheet = UIAlertController(title: "다크 모드 설정", message: nil, preferredStyle: .actionSheet) + guard let cell = self?.tableView.cellForRow(at: indexPath) as? SettingsActionSheetCell, + let self = self else { return } + let actionSheet = UIAlertController(title: Metric.darkModeSettingString, message: nil, preferredStyle: .actionSheet) actionSheet.addAction(UIAlertAction(title: DarkMode.system.title, style: .default, handler: { _ in - self?.viewModel.changeDarkMode(to: DarkMode.system.rawValue) + self.viewModel.changeDarkMode(to: DarkMode.system.rawValue) cell.configure(right: DarkMode.system.title) })) actionSheet.addAction(UIAlertAction(title: DarkMode.light.title, style: .default, handler: { _ in - self?.viewModel.changeDarkMode(to: DarkMode.light.rawValue) + self.viewModel.changeDarkMode(to: DarkMode.light.rawValue) cell.configure(right: DarkMode.light.title) })) actionSheet.addAction(UIAlertAction(title: DarkMode.dark.title, style: .default, handler: { _ in - self?.viewModel.changeDarkMode(to: DarkMode.dark.rawValue) + self.viewModel.changeDarkMode(to: DarkMode.dark.rawValue) cell.configure(right: DarkMode.dark.title) })) - self?.present(actionSheet, animated: true) + actionSheet.addAction(UIAlertAction(title: Metric.cancelMessage + , style: .cancel, handler: { _ in + self.dismiss(animated: true) + })) + self.present(actionSheet, animated: true) default: break } diff --git a/Segno/Segno/Resource/Assets.xcassets/background.colorset/Contents.json b/Segno/Segno/Resource/Assets.xcassets/background.colorset/Contents.json index a671a08..4e1df85 100644 --- a/Segno/Segno/Resource/Assets.xcassets/background.colorset/Contents.json +++ b/Segno/Segno/Resource/Assets.xcassets/background.colorset/Contents.json @@ -20,12 +20,12 @@ } ], "color" : { - "color-space" : "srgb", + "color-space" : "display-p3", "components" : { "alpha" : "1.000", - "blue" : "0.976", - "green" : "0.976", - "red" : "0.976" + "blue" : "0.114", + "green" : "0.114", + "red" : "0.114" } }, "idiom" : "universal" diff --git a/Segno/Segno/Resource/Assets.xcassets/grey1.colorset/Contents.json b/Segno/Segno/Resource/Assets.xcassets/grey1.colorset/Contents.json index 9992516..82d5de4 100644 --- a/Segno/Segno/Resource/Assets.xcassets/grey1.colorset/Contents.json +++ b/Segno/Segno/Resource/Assets.xcassets/grey1.colorset/Contents.json @@ -20,12 +20,12 @@ } ], "color" : { - "color-space" : "srgb", + "color-space" : "display-p3", "components" : { "alpha" : "1.000", - "blue" : "0.929", - "green" : "0.929", - "red" : "0.929" + "blue" : "0.195", + "green" : "0.195", + "red" : "0.195" } }, "idiom" : "universal" diff --git a/Segno/Segno/Resource/Assets.xcassets/grey2.colorset/Contents.json b/Segno/Segno/Resource/Assets.xcassets/grey2.colorset/Contents.json index 57f37f6..f19359d 100644 --- a/Segno/Segno/Resource/Assets.xcassets/grey2.colorset/Contents.json +++ b/Segno/Segno/Resource/Assets.xcassets/grey2.colorset/Contents.json @@ -20,12 +20,12 @@ } ], "color" : { - "color-space" : "srgb", + "color-space" : "display-p3", "components" : { "alpha" : "1.000", - "blue" : "0.596", - "green" : "0.596", - "red" : "0.596" + "blue" : "0.240", + "green" : "0.240", + "red" : "0.240" } }, "idiom" : "universal" diff --git a/Segno/Segno/Resource/Assets.xcassets/grey3.colorset/Contents.json b/Segno/Segno/Resource/Assets.xcassets/grey3.colorset/Contents.json index 6e96d38..5ed077e 100644 --- a/Segno/Segno/Resource/Assets.xcassets/grey3.colorset/Contents.json +++ b/Segno/Segno/Resource/Assets.xcassets/grey3.colorset/Contents.json @@ -20,12 +20,12 @@ } ], "color" : { - "color-space" : "srgb", + "color-space" : "display-p3", "components" : { "alpha" : "1.000", - "blue" : "0.400", - "green" : "0.400", - "red" : "0.400" + "blue" : "0.449", + "green" : "0.449", + "red" : "0.449" } }, "idiom" : "universal"