11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

xibとColor Assetの組み合わせはヤバイ

Last updated at Posted at 2019-10-01

はじめに

xibで View などの色にColor Assetの色を指定している場合、コードで色を変更すると想定外の挙動をすることがあります。

環境

  • Xcode 10.3
  • swift 5.0

準備

  1. Assets.xcassetsにColor Assetを作成する
    適当に下記のように色を作成。
color_asset 2. xibでViewControllerを作成し、Color Assetの色を指定する 下記のように作成(赤色がColor Asset)。Labelの背景色はwhiteを指定。 view view_hierarchy 3. xibでTableViewCellを作成し、Color Assetの色を指定する Labelを一つ置き、textColorにColor Assetを指定。 cell 4. コードで色を変更する 下記のように `viewDidload` と `cellForRowAt` で色を変更。
override func viewDidLoad() {
  super.viewDidLoad()

  // Do any additional setup after loading the view.
  label.textColor = .blue
  colorView.backgroundColor = .blue
  label.backgroundColor = .green
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "ColorTableViewCell", for: indexPath) as! ColorTableViewCell
  cell.label.text = "Test \(indexPath.row)"
  cell.label.textColor = .blue
  cell.label.backgroundColor = .green
  return cell
}

問題点

上記の準備をしたものを実行する。

期待値

期待値としては下記のような表示。
expect

結果

しかし、結果は下記のような表示。
result
Color Assetの色を指定していないLabelの背景色は変更されていますが、Color Assetの色を指定した部分は色が変わっていない!!

解決策

無難な解決策としてはxibの色指定をColor Assetをやめて Custom を設定すること!!

Color Assetの色を指定しているとxibが読み込まれた後に再度色が設定されるらしい...

とりあえず viewDidload viewWillAppear はダメで viewDidAppear で設定すると期待通り設定できました。
セルの場合 awakeFromNib で設定してもダメでした。

2019/12/15追記

この記事DispatchQueue.main.async を使うと viewDidload でも色変更ができるというのをみつけました。試してみたところ色がちゃんと変更されました。が、ただ DispatchQueue.main.async を使うとなんでここで使ってるんだ?とあとで見た人が思うので下記のようにコメントをつけた方がいいでしょう:laughing:

override func viewDidLoad() {
  super.viewDidLoad()

  // よくわからんけど動いた
  DispatchQueue.main.async {
    self.label.textColor = .blue
    self.colorView.backgroundColor = .blue
    self.label.backgroundColor = .green
  }
}

さいごに

セルのラベルの色を条件によって変えようと思ったら初期表示のときに色が変わらない!!というのに直面し色々調べた結果、Color Assetが原因なのに気づきました。

Color Assetは便利だけど思わぬ挙動があるので気をつけましょう:innocent::innocent::innocent:

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?