値によってプログレスバーを色分け
プログレスバーのオプションの1つにティントカラーがあります。それを設定することでバーの中身のある部分の色を変更できます。例えば、バッテリーの残量をプログレスバーで表示しているとすれば、残量がゼロに近づいたら赤、それよりもう少し余っていれば黄、余裕がある場合には緑、フルでは白などといった色分けが可能でしょう。
プログレスバーの色分けを実現するには、switch文を使ってその値(progress)に応じてcaseで場合分けすればよさそうです。Swiftでは、caseの値を固定した値だけでなく範囲で指定できるので、このような場合に非常に便利です。さらに範囲の指定は整数だけでなく実数でも可能です。この例のように0.0~1.0の間で変化する値についても、値を変換したりする必要もなくそのまま適用できます。
この例では、値が0.0~0.2で赤、0.3~0.5で黄、0.6~0.9で緑、1.0で白を、プログレスバーのtintColorプロパティに代入しています。ステッパーを操作して、プログレスバーが色分けされることを確認してください。
デイトピッカーの値=日付と時刻をラベルに表示
デイトピッカー(UIDatePicker)を実際に操作してみると、ほかのコントロール類とはかなり異なったものという印象を受けるでしょう。しかし、プログラムによってビューの上に配置したり、ユーザーの操作を検出して設定値を取得したりするうえでは違いはほとんどなく、同じように扱うことができます。状態の変化もvalueChangedという一般的なイベントで通知されます。
とはいえ、デイトピッカーから得られる値は単純な数値ではありません。デイト(Date)と呼ばれる構造を持ったデータのオブジェクトです。これまでの例のように、その値を色に変換したり、プログレスバーの長さで表現したりすることは難しくなっています。デイトの値を確かめるとしたら、それを年月日、曜日、時分秒を表す文字列として表示するのが最も簡単です。そのために、descriptionというプロパティが用意されています。
文字列をiOS画面に表示するためには、ラベル(UILabel)を使うのが一般的です。すでに述べたように、これはコントロールではなく一種のビューですが、表示に関する扱いには特に異なる部分はありません。画面にデイトピッカーとラベルと配置しデイトピッカーの値が変化したら、そのdateプロパティのさらにdescriptionプロパティの値をラベルのテキストとして表示するようにしてみましょう。
このプログラムを動かすと、まず画面の上部にデイトピッカーが表示されます。これはその場で指先でドラッグしたり、フリックしたりして操作できます。その操作に応じてダイヤルを回転させたりするプログラムはもちろん不要です。デイトピッカーの下のグレーのストライプのように見える部分がラベルです。デイトピッカーを操作して日時、時、分を選ぶと、その値が表示されるはずです。
ロケールを日本に合わせて日付と時刻を表示
しかしよく見ると、デイトピッカーで設定した日時と、ラベルに表示される日時が微妙にずれていることに気づくでしょう。さらによく見ると、そのずれが常に9時間であることにも気づくかもしれません。もし、日本標準時(JST)が世界標準時(GMT)から9時間進んでいるということを知っていたら、このずれ幅には納得できるはずです。デイトピッカーで設定しているのは日本標準時で、ラベルに表示しているのはそれに対応する世界標準時なのです。表示の最後に+0000と付いているのは、時差がゼロ、つまり世界標準時であることを示しているのです。
デイトピッカーは、OSの国、時差の設定に従って、日本語で日本標準時を表示しています。ここは、ラベルに表示するデイトの国、場所を日本に合わせて設定したいところです。それは、ロケールという構造を持ったデータによって同時に指定できます。また、デイトのオブジェクトには、ロケールを指定してデイトを文字列に変換するメソッドも備わっています。それを利用して日時の表示部分を書き換えてみましょう。OSに設定されているロケールはLocale.currentで取得できるので、descriptionメソッドのwith引数にそれを指定するだけでいいのです。
これを実際に動かしてみるとラベルの表記が日本語になり、時刻もデイトピッカーで設定したものに一致するようになりました。また最後にはていねいに「日本標準時」の時差表記も加わっています。
次回の予定
UIKitのコントロール類(UIControlのサブクラス)の中で今回を含めてもまだ取り上げていないものとしては、ページコントロールとテキストフィールドの2つがあります。前者はプレイグラウンドで作る簡潔なサンプルには不向きな面があります。テキストフィールドについては、また別の機会に取り上げることになるでしょう。次回は基本的なUIKitの話から脱却して、動きのあるダイナミックな効果を発揮するフレームワークを取り上げるつもりです。