Для создания целостного и интегрированного опыта требуется тема. Изменение цветов всех представлений для поддержки темы — беспокойный процесс. Чтобы избежать дублирования кода, мы используем свойство tintColor. В SwiftUI этот оттенок цвета переименовывается в AccentColor. В этом уроке мы изучим оба.

tintColor UIKit

  • В UIKit tintColor отражает все элементы управления (например, слайдер кнопок и т. д.) вместе с изображением шаблона.
  • Цвет оттенка, заданный как родительский, распространяется на все его дочерние элементы. Если дочернее представление хочет переопределить оттенок. он может установить различный оттенок.
class ViewController: UIViewController {
 @IBOutlet weak var image: UIImageView! //UIImageView have templet image
 @IBOutlet weak var button2: UIButton!
 @IBOutlet weak var button1: UIButton!
 override func viewDidLoad() {
    super.viewDidLoad()
    button1.tintColor = .green
    self.view.tintColor = .red // parent tint
 }
}

  • Общий оттенок можно настроить таким образом, чтобы все элементы управления (кнопки, ползунок, изображение шаблона и т. д.) имели одинаковый цвет на всем экране.

Используя код, установите оттенок окна:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
       

        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        window?.windowScene = windowScene

        window?.tintColor = UIColor.green //set global tint
    }
}

акцентЦвет SwiftUI

Поведение AccentColor точно такое же, как у SwiftUI, но оно не работает с изображениями.

import SwiftUI

struct ContentView: View {
    @State private var showSwitch   = true
    @State private var temp: Double = 0

    var body: some View {
        VStack(spacing: 10){
            Button("Button") {

            }.padding()

            Image.init("star").padding()

            Image.init(systemName: "heart").foregroundColor(.blue).colorMultiply(.red).padding() //accentColor does not affect Image
            Slider(value: $temp, in: -100...100, step: 1) //Works

            //overrride parent accentColor
            Button("Button2") {

            }.accentColor(.blue).padding()
        }.accentColor(.red)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Настройка глобальной темы:

Измените самый первый вид, как показано ниже, чтобы он отражался во всем приложении:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow ?


      //set theme here 
        let contentView = ContentView().accentColor(.red)

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as ? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }
}
  • Примечание, так как представление никогда не сочетается с ContentView_Previews. Цвета на холсте не будут отражаться. Чтобы цвета отражались на холсте, обновите параметр AccentColor в ContentView_Previews.