This library lets a developer being awared of Dark Mode via a variable
DarkMode.style
. Also, with this library it is possible to change the value of Dark Mode in runtime easily with standalone lib DarkModeSwitching.
changeDarkModeManually(.off) // .on or .auto
Sample screen for changing Dark Mode option here for macOS and here for iOS.
Using "Exact" with the Version field is strongly recommended.
Make a copy of the file PerseusDarkModeSingle.swift
then put it into a place required of a host project.
Cartfile should contain:
github "perseusrealdeal/PerseusDarkMode" == 1.1.5
Some Carthage usage tips placed here.
Podfile should contain:
target "ProjectTarget" do
use_frameworks!
pod 'PerseusDarkMode', '1.1.4'
end
dependencies: [
.package(url: "https://github.com/perseusrealdeal/PerseusDarkMode.git",
.exact("1.1.5"))
],
Project in the Navigator > Package Dependencies > Add Package Dependency
Using "Exact" with the Version field is strongly recommended.
Override the following method of the first screen to let Perseus know that system's appearance changed:
class MainViewController: UIViewController {
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13.0, *) {
AppearanceService.processTraitCollectionDidChange(previousTraitCollection)
}
}
}
Also, if Dark Mode is released with Settings bundle put the statements into the app's delegate:
extension AppDelegate: UIApplicationDelegate {
func applicationDidBecomeActive(_ application: UIApplication) {
// Update Dark Mode from Settings
if let choice = isDarkModeSettingsChanged() {
// Change Dark Mode value in Perseus Dark Mode library
AppearanceService.DarkModeUserChoice = choice
// Update appearance in accoring with changed Dark Mode Style
AppearanceService.makeUp()
}
}
}
Used functions are distributed via standalone file DarkModeSwitching.swift
.
Call the method AppearanceService.makeUp()
with the app's delegate if appearance changing is going to take place:
extension AppDelegate: UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ... code
// Call AppearanceService.makeUp() method if AppearanceService.register(:, :)
// is taken into account
AppearanceService.makeUp()
// ... otherwise call AppearanceService.recalculateStyleIfNeeded()
// to load DarkMode.style from user defaults
// AppearanceService.recalculateStyleIfNeeded()
}
}
Copy the file DarkModeSwitching.swift
into a host project for having fun with manual changing Dark Mode value.
Each time if Dark Mode changed the mentioned method #selector(makeUp)
called, but registering is required:
class MainViewController: UIViewController {
// At any view controller where changing is required
override func viewDidLoad() {
super.viewDidLoad()
AppearanceService.register(stakeholder: self, selector: #selector(makeUp))
}
@objc private func makeUp() {
print("^_^ \(AppearanceService.DarkModeUserChoice)"
switch DarkMode.style {
case .light:
// make drawings for light mode
break
case .dark:
// make drawings for dark mode
break
}
}
}
There is another way to be notified of Dark Mode—KVO.
DarkModeImageView
class is an expressive sample of Dark Mode KVO usage for both macOS and iOS as well.
Copyright © 7530 - 7531 Mikhail Zhigulin of Novosibirsk.
LICENSE for details.
PerseusDarkMode
was written at Novosibirsk by Mikhail Zhigulin i.e. me, [email protected].
Mostly I'd like thank my lovely parents for supporting me in all my ways.
link |
Stars: 3 |
Last commit: 39 weeks ago |
PR #30 goes with
Happy coding ^_^
P.S. Using exact version is recommended.
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics