2015年2月14日土曜日

フェードアウトした(している)ボタンがクリック出来ない

iPhone アプリで、ボタンに画像を指定した物を配置し、フェードイン・フェードアウトのアニメーションをするものを作成してみた。

実装をして、確認を取るが、自分の悪い癖で、表示の確認をした時点で満足し出来たものとしていた。
が、しかし、あることを思いつく。

「これ、消えた時にクリックできるのかしら?」

こんな疑問点が出てきたが、なんとなく予想が付いたので、腫れ物を触るかの気持ちでタップした所、案の定タップイベントが動かない。。。

どうやら、hidden プロパティを YES、または、alpha を 0 にすると、タップは無効になるようだ。
また、フェードアウトの時は、消えかかっている状態でもタップは無効となる。

地味に、alpha を 0.05 にすると、タップは出来るが、正に亡霊の如く消えずに残っているので見た目が悪い。

ボタンのラベル文字をアニメーションさせるのであれば、最悪ボタン自体ではなく、中のラベルの部分をフェードイン・アウトさせてやれば、ラベルが消えてもタップは可能となる。
しかし、今回は画像で、ボタンの位置をコードで変更している様にしていたのだが、画像をフェードイン・アウトさせると何故かボタン位置が変更前に戻るアニメ付きでフェードイン・アウトするという動きとなった。

数パターンあたってみたが、ボタン単発で表示が消えた時にタップの動作を取得する事は出来なかった。

結論から言うと、今回取った手段としては、フェードイン・アウトさせるオブジェクトの上に透明のボタンを配置して、処理を分離させる様にし実現を行った。

コードは以下のとおり

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self fadeOut];
}


- (IBAction)buttonPush:(id)sender
{
    NSLog(@"Push The Button");
}

- (void)fadeOut
{
    [UIView beginAnimations:@"hideOverlayButtonFadeOut" context:nil];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(fadeIn)];
    [self._button setAlpha:0.0];
    [UIView commitAnimations];
}

- (void)fadeIn
{
    [UIView beginAnimations:@"hideOverlayButtonFadeIn" context:nil];
    [UIView setAnimationDuration:1.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(fadeOut)];
    [self._button setAlpha:1.0];
    [UIView commitAnimations];
} 

ボタンを2つ用意して、ひとつはフェードイン・アウトを行うためのボタン(別段ボタンでなくても良い)を用意して、その上に実際にイベントを取る透明のボタンを配置する。
一応出来たが、一つのボタンの為にもう一つボタンを使用するのが、なんだか面倒。

何かいい方法あるんじゃないだろうか。。。

Written with StackEdit.

0 件のコメント:

コメントを投稿