UIAppearance の基礎
これですべての UILabel
の textColor
が茶色に変わります。
(現実的には UILabel
の textColor
を UIAppearance
で設定するのは稀だと思いますが、あくまでサンプルとして)
UILabel.appearance().textColor = .brown
特定のView上にあるUILabelのtextColorを変える
View階層が1つだけの時
すべての ViewA
上の UILabel
を変えたいなら、こんなふうに書けば良いですね。
UILabel.appearance(whenContainedInInstancesOf: [ViewA.self]).textColor = .red
View階層が2つ以上の時
SampleViewController
上の ViewA
上の UILabel
だけを変えたい時など、
階層が2つ以上の時は、対象となるViewから親View/ViewControllerを順に配列の要素に加えます。
UILabel.appearance(whenContainedInInstancesOf: [ViewA.self, SampleViewController.self]).textColor = .red
優先度
例えば以下のような階層構造の時
SampleViewController
┣ UILabel
┣ ViewA
┃ ┗ UILabel
┗ ViewB
┗ ViewA
┗ UILabel
このように設定するとどうなるでしょうか。
UILabel.appearance().textColor = .brown
UILabel.appearance(whenContainedInInstancesOf: [SampleViewController.self]).textColor = .magenta
UILabel.appearance(whenContainedInInstancesOf: [ViewA.self]).textColor = .blue
UILabel.appearance(whenContainedInInstancesOf: [ViewB.self, SampleViewController.self]).textColor = .red
この場合、より外側の要素での指定が優先され、以下のように解決されます。
ViewA
上の UILabel
は blue
にはならず、
SampleViewController
上の UILabel
を magenta
にする処理が優先されます。
SampleViewController
上の ViewB
の UILabel
を red
にする処理は、指定した順に解決され問題なく実行されます。