0
    キリンさんが止まれない!状態で一日開いてしまいましたが、
    今回はキリンさんを止めるべく、UIButton を扱っていきたいと思います

    [今回の内容]
    ■ボタンを押し下げたとき(UIControlEventTouchDown)
    ■ひとつのUIButtonにふたつのアクション
    ■ボタンの内側と外側

    やるべきことは、
    「ボタンを押したら動く」ようになったけど、止められないので、
    ボタンを離したら止まる」ようにすることです

    ■ボタンを押し下げたとき(UIControlEventTouchDown)

    それではまず、現在のボタンがどのようになっているのか確認しましょう
    - (void)loadView の中を見てください
    moveLBT = [[UIButton alloc] initWithFrame:CGRectMake( 70.0, 400.0, 80.0, 50.0)];
    [moveLBT setTitle:@"<-L" forState:UIControlStateNormal];
    [moveLBT setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [moveLBT addTarget:self action:@selector(moveL_touchDown:)
                                        forControlEvents:UIControlEventTouchDown];

    moveLBT.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:moveLBT];
        
    moveRBT = [[UIButton alloc] initWithFrame:CGRectMake(170.0, 400.0, 80.0, 50.0)];
    [moveRBT setTitle:@"R->" forState:UIControlStateNormal];
    [moveRBT setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [moveRBT addTarget:self action:@selector(moveR_touchDown:)
                                        forControlEvents:UIControlEventTouchDown];

    moveRBT.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:moveRBT];

    event

    moveLBT と moveRBT ボタンについて書かれたところの
    それぞれ4〜5行目の中に
    forControlEvents:UIControlEventTouchDown
    と書かれています
    この UIControlEventTouchDown は、「ボタンを押し下げたとき」という意味で、
    この一行は、
    「moveLBT(moveRBT)ボタンを押し下げたとき、moveL_touchDown(moveR_touchDown)を実行する」
    となります

    ...ということは「ボタンを離したとき」もあるんじゃないかな?
    もちろんあります UIControlEventTouchUpInside です
    「離す」って直接的な意味ではないですが
    「(押している)ボタンを上げる」って感じです

    ということで、
    この記述を加えることで、ボタンを離したタイミングを得ることができるのです


    ■ひとつのUIButtonにふたつのアクション

    それでは早速、ボタンを上げたときの動きを加えましょう!

    どこに?どうやって?

    実は、とっても簡単です
    先ほどの4〜5行目と同じ要領で、もうひとつの行を加えてやるだけでいいのです
    アッサリ解決...

    では、あっさり記述していきましょう
    左ボタンと...
    [moveLBT addTarget:self action:@selector(moveL_touchDown:)
                                       forControlEvents:UIControlEventTouchDown];
    [moveLBT addTarget:self action:@selector(moveL_touchUp:)
                                       forControlEvents:UIControlEventTouchUpInside];


    右ボタン...
    [moveRBT addTarget:self action:@selector(moveR_touchDown:)
                                       forControlEvents:UIControlEventTouchDown];
    [moveRBT addTarget:self action:@selector(moveR_touchUp:)
                                       forControlEvents:UIControlEventTouchUpInside];


    event

    加えた行は、
    「moveLBT(moveRBT)ボタンを上げたとき、moveL_touchUp(moveR_touchUp)を実行する」
    となります

    これで、それぞれのボタンは「押したとき」と「離したとき」の
    2つのアクションをもったことになります

    そして、なにげな〜く「moveL_touchUp」「moveL_touchUp」なんて
    実行する内容を書いていますが、もちろんどこにも用意していないので追加します

    - (void) moveL_touchDown:(id)sender
    {   
        moveLFlag = TRUE;
    }
    - (void) moveL_touchUp:(id)sender
    {   
        moveLFlag = FALSE;
    }

    - (void) moveR_touchDown:(id)sender
    {   
        moveRFlag = TRUE;
    }
    - (void) moveR_touchUp:(id)sender
    {   
        moveRFlag = FALSE;
    }
    ※moveL_touchDown の中の moveRFlag = FALSE;
     moveR_touchDown の中の moveLFlag = FALSE; は消してください

    action

    それでは、[Run]してみましょう

    どうですか?

    押したら動いて、離したら止まる

    できましたか?

    たのしいですね〜!!

    ということで、今回はココまで... と言いたいところですが、
    もう少し、念には念を入れた記述をします


    ■ボタンの内側と外側

    では、[Run]している状態で、
    移動ボタンを押して、それを押したまま... カーソルをボタンの外に出して...
    それから、ボタンを離してみましょう

    outside

    !?... キリンさんが止まりません

    「ボタンを押して、離す」と止まります

    ...が、そうでなくて

    「ボタンを押して、指をずらして、そして離す」と止まりません!

    そんなことする?

    そんなヤツおらへんやろ〜

    と思うかもしれませんが、
    いつなんどき、どこのだれが、何をしでかすかわかりません

    ではどうする?

    先ほどサラリと流しましたが、

    UIControlEventTouchUpInside

    よく見ると、「Inside(内側)」と書かれているじゃあ〜りませんか?

    「内側」がある、それじゃ「外側」もあるでしょ?

    あります!

    UIControlEventTouchUpOutside

    その名のとおり「ボタンを押して(そのボタンの)外側で上げる」です
    Insideの方が「ボタンを押して(そのボタンの)内側で上げる」
    ですから、
    内の守りも完璧!外の守りも完璧!
    もうそれ以外のどこで離すこともできません

    では、記述しましょう!
    今回は新しく行を追加する必要はありません

    moveLBT = [[UIButton alloc] initWithFrame:CGRectMake( 70.0, 400.0, 80.0, 50.0)];
    [moveLBT setTitle:@"<-L" forState:UIControlStateNormal];
    [moveLBT setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [moveLBT addTarget:self action:@selector(moveL_touchDown:)
               forControlEvents:UIControlEventTouchDown];
    [moveLBT addTarget:self action:@selector(moveL_touchUp:)
         forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
    moveLBT.backgroundColor = [UIColor whiteColor];
    self.view addSubview:moveLBT];
       
    moveRBT = [[UIButton alloc] initWithFrame:CGRectMake(170.0, 400.0, 80.0, 50.0)];
    [moveRBT setTitle:@"R->" forState:UIControlStateNormal];
    [moveRBT setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [moveRBT addTarget:self action:@selector(moveR_touchDown:)
               forControlEvents:UIControlEventTouchDown];
    [moveRBT addTarget:self action:@selector(moveR_touchUp:)
         forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
    moveRBT.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:moveRBT];

    色つきの部分を追加してください

    event

    |」のところは、「あるいは、または、もしくは」という意味です
    なので、この行の意味するところは、
    「moveLBT(moveRBT)ボタンをボタンの内側で上げたとき、
     または、ボタンの外側で上げたとき、moveL_touchUp(moveR_touchUp)を実行する」
    となります

    それでは、今回最後の[Run]

    ボタンを押して、離して... また押して、今度はボタンの外で、離す!

    どうですか?うまくいきましたか?

    ...

    このように、ボタンのイベント(押したり、離したり)とアクションの組み合わせを
    使い分けることよって、アプリの中でいろいろな動きを表現することができます
    (今回のは単純ですけどね... )

    ...

    さて、次回はどうしましょう

    もうやることない?

    いえいえ、それでは、

    キリンさんの平和な世界に... そっと危険を潜ませて... みましょうか?

    ウヘヘヘヘヘヘヘ...




    コメント
    コメントする








       
    この記事のトラックバックURL
    トラックバック

    Calendar
    S M T W T F S
    1234567
    891011121314
    15161718192021
    22232425262728
    2930     
    << September 2019 >>
    My Apps
    有料アプリ

    無料アプリ

    Selected entries
    Categories
    AdSense
    Sponsored Links
    Archives
    Recent comment
    Links
    Profile
    Search this site.
    Others
    Mobile
    qrcode
    powered
    無料ブログ作成サービス JUGEM