Для создания целостного и интегрированного опыта требуется тема. Изменение цветов всех представлений для поддержки темы — беспокойный процесс. Чтобы избежать дублирования кода, мы используем свойство 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.