これはすべて、アプリケーションで使用される色に適用されます。
最終更新日:2019年2月16日
色定数
手始めに、多かれ少なかれ標準的な推奨事項をいくつか示したいと思います。
まず、すべての要素の色は、 「ストーリーボード」 / 「インターフェイスビルダー」 ではなく、コードですぐに設定するのが最適です。 もちろん、これは、3つの要素と1つの配色の1つの画面を備えたアプリケーションではありません。 しかし、この場合でも、将来どのように状況が変化するかは確実にわかりません。
第二に、すべての色は別のファイルで取り出される定数によって決定される必要があります。 または、対応する「表示」コードの隣の別のグループに。
第三に、色はカテゴリに分類する必要があります。 つまり 「最初の画面の2番目のボタンの色」ではなく、「メインタイプのボタンの背景色」のように操作します。
デザイナー(または自分の好みの感覚)が任意の要素の色を変更する信号を受け取った場合、長い間探す必要はありません-複数の場所で変更するだけです(アプリケーションのいずれかを忘れて、アプリケーションをiTunes Connectに送信した後、頭をつかむ) )-2。
したがって、たとえば、次のような内容の
Colors.swift
ファイルが
Colors.swift
ます。
import UIKit enum ButtonAppearance { static let backgroundColor = UIColor.white static let borderColor = UIColor.gray static let textColor = UIColor.black }
(率直に言って、単一の
case
ない
enum
型は、定数を宣言するための私のお気に入りの型構造です。この使用により、型をインスタンス化し、通常は意図した方法以外の方法で型を使用する機能が自動的に奪われます。)
色の使用は次のようになります。
let someButton = UIButton() someButton.backgroundColor = ButtonAppearance.backgroundColor someButton.layer.borderColor = ButtonAppearance.borderColor.cgColor
カラーモデル
さらに進んで、アプリケーションで使用されるさまざまな色を表すモデルを作成することをお勧めします。
struct SchemeColor { private let color: UIColor func uiColor() -> UIColor { return color } func cgColor() -> CGColor { return color.cgColor } }
便宜上、
UIColor
extension
を記述することもできます。
extension UIColor { func schemeColor() -> SchemeColor { return SchemeColor(color: self) } }
この場合、定数は次のようになります。
enum ButtonAppearance { static let backgroundColor = UIColor.white.schemeColor() static let borderColor = UIColor.gray.schemeColor() static let textColor = UIColor.black.schemeColor() }
コードでは、色は次のように設定されます。
let someButton = UIButton() someButton.backgroundColor = ButtonAppearance.backgroundColor.uiColor() someButton.layer.borderColor = ButtonAppearance.borderColor.cgColor()
そして最後に、なぜこのような追加の困難が必要になるのか-これは...
カラースキーム
アプリケーションに2つのカラースキーム(暗い色と明るい色)を持たせたいとします。 カラースキームのリストを保存するには、
enum
定義します:
enum ColorSchemeOption { case dark case light }
この場合、配色モデルを「シングルトン」として表すための型を作成するのは恥ずべきことではないと思います。
struct ColorScheme { static let shared = ColorScheme() private (set) var schemeOption: ColorSchemeOption private init() { /* , option. , UserDefaults , . */ } }
SchemeColor
内で定義して
private
ます。
SchemeColor
自体を変更して、アプリケーションが使用するカラースキームを認識し、目的の色を返すようにする必要があります。
struct SchemeColor { let dark: UIColor let light: UIColor func uiColor() -> UIColor { return colorWith(scheme: ColorScheme.shared.schemeOption) } func cgColor() -> CGColor { return uiColor().cgColor } private func colorWith(scheme: ColorSchemeOption) -> UIColor { switch scheme { case .dark: return dark case .light: return light } } // ColorScheme }
色定数は次のようになります。
enum ButtonAppearance { static let backgroundColor = SchemeColor(dark: Dark.backgroundColor, light: Light.backgroundColor) static let borderColor = SchemeColor(dark: Dark.borderColor, light: Light.borderColor) static let textColor = SchemeColor(dark: Dark.textColor, light: Light.textColor) private enum Light { static let backgroundColor = UIColor.white static let borderColor = UIColor.gray static let textColor = UIColor.black } private enum Dark { static let backgroundColor = UIColor.lightGray static let borderColor = UIColor.gray static let textColor = UIColor.black } }
(
UIColor
の
extension
はもう必要ないようです。)
そして、これらすべてのものの使用は同じように見えます:
let someButton = UIButton() someButton.backgroundColor = ButtonAppearance.backgroundColor.uiColor() someButton.layer.borderColor = ButtonAppearance.borderColor.cgColor()
一部の要素の色を変更するには、対応する定数を変更するだけで十分です。 また、別のカラースキームを追加するには、カラー定数でこのカラースキームの色のセットである
ColorSchemeOption
に
case
を追加し、
ColorSchemeOption
を更新する
SchemeColor
ます。
もちろん、後者はまだ改善できます。 たとえば、回路の数が増えた場合、かさばる初期化子を「ビルダー」に置き換える方が便利でしょう。
おそらく今度はすべて! 素敵なコードがあります!