contextに任意のオブジェクトを指定し、 setAnimationDidStopSelector等でユーザ情報をやり取りする方法

はじめに

(良いタイトルが思い浮かばなかったので、長くなりました。。)

最近身の回りがやけに慌ただしいので、さっぱり記事が書けていない、ゆう@あんのうんです。 1日が48時間あれば良いのに…。

UIViewのAnimationについて

さて、今回はQiitaの方にも投稿させて頂いた、UIViewのAnimationについての記事です。 UIViewでAnimationをさせる方法の一つに、タイトル通りの、[UIView beginAnimations:context]があるのですが、Animation終了時等に、オブジェクトを渡して何かしたいと言うのがママあります。 そんな時、@property等に指定するのも良いのですが、contextにオブジェクトを代入してやり取り等できる方法があるので、その紹介です。


実際にbeginAnimations:contextは

+ (void)beginAnimations:(NSString *)animationID context:(void *)context

とcontextはvoid*型になっているので何でも渡せるようになっています。 以下は、contextを用いてユーザ情報を渡すSampleです。

// beginAnimations:context sample

- (void)animationStart {
    NSDictionary *userInfo = @{@"key":@"val"};
    
    [UIView beginAnimations:@"animation" context:(__bridge_retained void*)(userInfo)];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.27f];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
    /* animation処理 */
    [UIView commitAnimations];
}

次にAnimationが終了した際に呼ばれるメソッドの中身で、実際にcontextを受け取り解釈します。

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    NSDictionary *contextObj = (__bridge_transfer NSDictionary*)context;
    NSLog(@"%@", contextObj[@"key"]);
}

実行結果

val

勘違いし易いのが(私も最初はそうでした)、beginAnimationsはグラフィックスコンテキストではありません。 上述の通り、アニメーションのデリゲートメソッドで受け取り、その後の条件判定用にユーザが好きに指定するものです。