頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


UIButtonのタップと長押しを検出する

頭と尻尾はくれてやる! ナビゲーションバーのボタンを変更する
↑この続き、というか関連なんだけどさ。
ボタンを文字じゃなくてアイコンにしたら何のボタンなのかはっきりしないかも、って時があるでしょ。開発者側としてはもう少し情報を与えたいなって時が。

そしたらいいなってUIを見つけてね。Feedlyってアプリなんだ。Google Readerの代替サービスで一躍脚光を浴びたとかなんとか。いや、俺もGoogle Reader終了発表で使い始めたクチなんだけどね。
このiOSアプリ版のナビゲーションバーがこんな感じなんだ。

Feedlyのナビゲーションバー

正直よくわからないアイコンもあるでしょ?
ところがこのアプリのいいところは、アイコンを長押しすると、、、

ステータスバーに表示された情報

↑ステータスバーにヒントが表示されるんだよ。
ステータスバーをこんな風に使ってガイドライン的にいいのか?って思わないでもないけど、なかなかいいアイデアだと思うんだ。

これを実装するにはどうするんだろう?って試してみたんだ。
二つやったことないことがあって、一つは長押しの検出、もう一つはステータスバーの上層に表示させるってこと。

まずはボタンの長押しを検出する方法。
もちろん、通常のタップも検出して欲しいんだ。
二つ検出するなんて何かややこしそうと思っていたんだけどさ、、、案外あっさりだよ。
{
    //ボタン設定
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(320-44, 0, 44, 44);
    [button setImage:[UIImage imageNamed:@"button.png"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonTappedHandler:) forControlEvents:UIControlEventTouchUpInside];
    [self.navigationController.navigationBar addSubview:button];
        
    //ボタンの長押し設定部分
    UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressedHandler:)];
    [button addGestureRecognizer:gestureRecognizer];
    [gestureRecognizer release];
}

//通常のタップ時の処理
-(void)buttonTappedHandler:(UIButton *)button
{
    NSLog(@"%s",__func__);
}

//長押し関連処理
-(void)longPressedHandler:(UILongPressGestureRecognizer *)gestureRecognizer
{
    NSLog(@"%s",__func__);

    switch (gestureRecognizer.state) {
        case UIGestureRecognizerStateBegan://長押しを検知開始
        {
            NSLog(@"UIGestureRecognizerStateBegan");
        }
            break;
        case UIGestureRecognizerStateEnded://長押し終了時
        {
            NSLog(@"UIGestureRecognizerStateEnded");
        }
            break;
        default:
            break;
    }
}
これでこのボタンは通常のタップと長押しの場合の両方でそれぞれ指定いしたメソッドをコールしてくれる。
しかも、長押しの場合にはタップの方をコールしないという、なんともよくわかってるじゃないかって感じ。

テスト結果

↑普通にタップした後に長押ししてみた場合の結果。長押し終了後に通常のタップ時の処理は呼ばれなかったよ。
ほら、gestureRecognizerあたりの処理でsingle tapとdouble tapを区別するのに勘違いすんじゃねーぞ、って処理が必要だったでしょ?ああいうのが必要なのかなって思ってたんだけど要らないとは助かるね。

次にステータスバーに何かを表示させるという方法なんだけど、長くなったので今回はここまでってことで。



<< 巖手屋の南部せんべい人気No1のいかせんべいを食べてみた   TopPage  ナビゲーションバーのボタンを変更する >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/758-c4c7b8af




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad