Swiftpack.co - perseusrealdeal/PerseusDarkMode as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by perseusrealdeal.
perseusrealdeal/PerseusDarkMode 1.1.5
Library with Dark Mode for iOS 9.3+, macOS 10.9+; Xcode 10.1+.
⭐️ 3
🕓 39 weeks ago
.package(url: "https://github.com/perseusrealdeal/PerseusDarkMode.git", from: "1.1.5")

Perseus Dark Mode

Actions Status Version Pod Platforms Swift 4.2 License

Integration Capabilities

Standalone Carthage compatible CocoaPods manager Swift Package Manager compatible

Demo Apps and Others

Demo App Demo App PerseusUISystemKit XcodeTemplateProject

In Brief

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.

Reqirements

  • Xcode 10.1+
  • Swift 4.2+
  • iOS: 9.3+, UIKit SDK
  • macOS: 10.9+, AppKit SDK

First-party software

Third-party software

Installation

Using "Exact" with the Version field is strongly recommended.

Step 1: Add PerseusDarkMode to a host project tree

Standalone

Make a copy of the file PerseusDarkModeSingle.swift then put it into a place required of a host project.

Carthage

Cartfile should contain:

github "perseusrealdeal/PerseusDarkMode" == 1.1.5

Some Carthage usage tips placed here.

CocoaPods

Podfile should contain:

target "ProjectTarget" do
  use_frameworks!
  pod 'PerseusDarkMode', '1.1.4'
end

Swift Package Manager

  • As a package dependency so Package.swift should contain the following statements:
dependencies: [
        .package(url: "https://github.com/perseusrealdeal/PerseusDarkMode.git",
            .exact("1.1.5"))
    ],
  • As an Xcode project dependency:

Project in the Navigator > Package Dependencies > Add Package Dependency

Using "Exact" with the Version field is strongly recommended.

Step 2: Make DarkMode ready for using

iOS

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.

iOS and macOS

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.

Usage

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.

License MIT

Copyright © 7530 - 7531 Mikhail Zhigulin of Novosibirsk.

  • The year starts from the creation of the world according to a Slavic calendar.
  • September, the 1st of Slavic year.

LICENSE for details.

Author

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.

GitHub

link
Stars: 3
Last commit: 39 weeks ago
Advertisement: IndiePitcher.com - Cold Email Software for Startups

Release Notes

v1.1.5
39 weeks ago

PR #30 goes with

  • Included Perseus logger.
  • Added minor fixes.

Happy coding ^_^

P.S. Using exact version is recommended.

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics