単純なものなら、下の図のように startLayer と batonLayer が baseLayer 内で切り替わることで十分表現できる。
![Fig.1](https://stat.ameba.jp/user_images/f3/8c/10089757729.jpg?caw=800)
後は、反応時間を表示するために startLayer の文字列を置き換えられれば完璧か?
![Fig.2](https://stat.ameba.jp/user_images/0d/21/10089758003.jpg?caw=800)
となると、調べることは
CATextLayerの文字列は変更可能か
CALayerは表示したり隠したりできるか
の2点になる。
文字列はstringを再設定できるかってことになるし、表示/非表示はCore Animation プログラミングガイド 日本語訳版にそれらしい項目として
hidden
があった。
さっそく実験してみましょう。
今回はawakeFromNibで全レイヤの準備をして、クリックで呼び出されるtestで表示状態を切り替える。そのための状態変数は
running
をそのまま利用。
こいつが TRUE の時は batonLayer を表示している状態とする。
したがってtest側でやることは
running == TRUE:
running を FALSE にする。
batonLayer を隠す。
startLayer を表示する。
startLayer の文字列を設定する。
running == FALSE:
running を TRUE にする。
startLayer を隠す。
batonLayer を表示する。
となる。
awakeFromNib側で作ったレイヤにtest側でアクセスするには専用の変数を用意するか、すでに利用している view 変数から
CALayer* layer = [view layer]
で baseLayer を取りだし
NSArray* list = [layer sublayers]
で baseLayerに登録されてるレイヤリストを取りだし
CALayer* layer = [list objectAtIndex:インディックス]
で startLayer 、batonLayer を取り出すことになる。インディックスは先に baseLayer に追加した方が 0、後が 1 となる。
CATextLayer* startLayer = [[[view layer] sublayers] objectAtIndex:0];
CALayer* batonLayer = [[[view layer] sublayers] objectAtIndex:1];
こんな感じ。あとは
static int count = 1;
startLayer.string = [NSString stringWithFormat:@"count = %d", count++];
というふうに文字を設定。
static int count = 1;
[NSString stringWithFormat:@"count = %d", count++];
に関してはC言語知ってる人ならstatic intは問題ないよね。stringWithFormatはprintfみたいなもんです。C言語知らない人で確認せずにはいられない人は、staticに関してはC言語講座:第10章あたり読んでみてね。
stringWithFormat はソースのstringWithFormatを選んだ状態でオプションキーを押しながらダブルクリックだ!
レイヤを隠したり表示したりは
startLayer.hidden = NO;
batonLayer.hidden = YES;
サンプルではpositionも設定したりしてる。position はCore Animation プログラミングガイドのレイヤジオメトリと変換で説明されてる。
ま、いつものように下のサンプル実行してみりゃわかるよ。
------------
サンプルプロジェクト:swap.zip
Core Animation プログラミングガイド 日本語訳版
![Fig.1](https://stat.ameba.jp/user_images/f3/8c/10089757729.jpg?caw=800)
後は、反応時間を表示するために startLayer の文字列を置き換えられれば完璧か?
![Fig.2](https://stat.ameba.jp/user_images/0d/21/10089758003.jpg?caw=800)
となると、調べることは
CATextLayerの文字列は変更可能か
CALayerは表示したり隠したりできるか
の2点になる。
文字列はstringを再設定できるかってことになるし、表示/非表示はCore Animation プログラミングガイド 日本語訳版にそれらしい項目として
hidden
があった。
さっそく実験してみましょう。
今回はawakeFromNibで全レイヤの準備をして、クリックで呼び出されるtestで表示状態を切り替える。そのための状態変数は
running
をそのまま利用。
こいつが TRUE の時は batonLayer を表示している状態とする。
したがってtest側でやることは
running == TRUE:
running を FALSE にする。
batonLayer を隠す。
startLayer を表示する。
startLayer の文字列を設定する。
running == FALSE:
running を TRUE にする。
startLayer を隠す。
batonLayer を表示する。
となる。
awakeFromNib側で作ったレイヤにtest側でアクセスするには専用の変数を用意するか、すでに利用している view 変数から
CALayer* layer = [view layer]
で baseLayer を取りだし
NSArray* list = [layer sublayers]
で baseLayerに登録されてるレイヤリストを取りだし
CALayer* layer = [list objectAtIndex:インディックス]
で startLayer 、batonLayer を取り出すことになる。インディックスは先に baseLayer に追加した方が 0、後が 1 となる。
CATextLayer* startLayer = [[[view layer] sublayers] objectAtIndex:0];
CALayer* batonLayer = [[[view layer] sublayers] objectAtIndex:1];
こんな感じ。あとは
static int count = 1;
startLayer.string = [NSString stringWithFormat:@"count = %d", count++];
というふうに文字を設定。
static int count = 1;
[NSString stringWithFormat:@"count = %d", count++];
に関してはC言語知ってる人ならstatic intは問題ないよね。stringWithFormatはprintfみたいなもんです。C言語知らない人で確認せずにはいられない人は、staticに関してはC言語講座:第10章あたり読んでみてね。
stringWithFormat はソースのstringWithFormatを選んだ状態でオプションキーを押しながらダブルクリックだ!
レイヤを隠したり表示したりは
startLayer.hidden = NO;
batonLayer.hidden = YES;
サンプルではpositionも設定したりしてる。position はCore Animation プログラミングガイドのレイヤジオメトリと変換で説明されてる。
ま、いつものように下のサンプル実行してみりゃわかるよ。
------------
サンプルプロジェクト:swap.zip
Core Animation プログラミングガイド 日本語訳版