0

ユーザーが押すボタンに応じて、さまざまなアニメーションとサウンドを再生しようとしています。ボタンの形はさまざまですが、ユーザーがボタンを押しているときに音を鳴らし、指を離している間はボタンを止める必要があります。touchesBeganとtouchesMovedだけで簡単にできると思いました。

ただし、ユーザーがボタンに触れているときに指を動かすと(1ピクセルの動きでも)、touchsMovedメソッドが呼び出されます。そこで、いくつかのオプションを試してみましたが、指が動いたら(touchesEndedを自分で呼び出すことで)音を止めることができますが、ユーザーが気付かないうちに指を動かしてしまうため(1ピクセル程度)、完璧な解決策ではありません。 )そして、彼がボタンに触れている間、音を連続して再生することは非常に困難です。

したがって、2つの整数を作成できると思いました。1つに値をtouchesBeganで設定し、次にtouchesMovedでもう1つを設定し、最後にそれらを比較して、移動が同じビュー(ボタン)にあるかどうかを確認します。そうでない場合は、 touchesEndedを呼び出します。ただし、問題が1つあります。それは、ユーザーがボタンを指で押したまま(同じボタン上で)動かしてから持ち上げると、同じビューで開始して移動したため、touchesEndedが呼び出されないことです。 。

ユーザーが指を動かした後に指を離した後、touchesEndedメソッドを呼び出すにはどうすればよいですか?

これが私のコードです(これらのアルファ設定、サウンドの再生などは無視してください):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if ([touch view] == leftArmBtn) {

        leftArmBtn.alpha = 0;
        leftLegBtn.alpha = 0;
        mainImageView.image = [UIImage imageNamed:@"leftArmPush.jpg"];
        [[SoundManagerOAL sharedSoundManagerOAL] playSoundWithKey:@"LEFTARM"];
        touchParent = 1;
    } else if ([touch view] == mouthBtn) {

        mouthBtn.alpha = 0;
        mainImageView.image = [UIImage imageNamed:@"mouthPush.jpg"];
        [[SoundManagerOAL sharedSoundManagerOAL] playSoundWithKey:@"MOUTH"];
        touchParent = 2;
    } else if ([touch view] == rightArmBtn) {

        rightArmBtn.alpha = 0;
        righLegBtn.alpha = 0;
        mainImageView.image = [UIImage imageNamed:@"rightArmPush.jpg"];
        [[SoundManagerOAL sharedSoundManagerOAL] playSoundWithKey:@"RIGHTARM"];
        touchParent = 3;
    } else if ([touch view] == leftLegBtn) {

        leftLegBtn.alpha = 0;
        mainImageView.image = [UIImage imageNamed:@"leftLegPush.jpg"];
        [[SoundManagerOAL sharedSoundManagerOAL] playSoundWithKey:@"LEFTLEG"];
        touchParent = 4;
    } else if ([touch view] == righLegBtn) {

        righLegBtn.alpha = 0;
        mainImageView.image = [UIImage imageNamed:@"rightLegPush.jpg"];
        [[SoundManagerOAL sharedSoundManagerOAL] playSoundWithKey:@"RIGHTLEG"];
        touchParent = 5;
    } else if ([touch view] == vakBtn) {

        vakBtn.alpha = 0;
        mainImageView.image = [UIImage imageNamed:@"vakPush.jpg"];
        [[SoundManagerOAL sharedSoundManagerOAL] playSoundWithKey:@"VAK"];
        touchParent = 6;
    } else {
        touchParent = 0;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];

    if ([touch view] == leftArmBtn) {
        leftLegBtn.alpha = 1;
        leftArmBtn.alpha = 1;
        mainImageView.image = defaultImage;
        [[SoundManagerOAL sharedSoundManagerOAL] stopSoundWithKey:@"LEFTARM"];

    } else if ([touch view] == mouthBtn) {

        mouthBtn.alpha = 1;
        mainImageView.image = defaultImage;

    } else if ([touch view] == rightArmBtn) {

        rightArmBtn.alpha = 1;
        righLegBtn.alpha = 1;
        mainImageView.image = defaultImage;

        [[SoundManagerOAL sharedSoundManagerOAL] stopSoundWithKey:@"RIGHTARM"];
    } else if ([touch view] == leftLegBtn) {

        leftLegBtn.alpha = 1;
        mainImageView.image = defaultImage;

        [[SoundManagerOAL sharedSoundManagerOAL] stopSoundWithKey:@"LEFTLEG"];
    } else if ([touch view] == righLegBtn) {

        righLegBtn.alpha = 1;
        mainImageView.image = defaultImage;

        [[SoundManagerOAL sharedSoundManagerOAL] stopSoundWithKey:@"RIGHTLEG"];
    } else if ([touch view] == vakBtn) {

        vakBtn.alpha = 1;
        mainImageView.image = defaultImage;

    } else {

    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];

    if ([touch view] == leftArmBtn) {
        movingTouch = 1;

    } else if ([touch view] == mouthBtn) {
        movingTouch = 2;

    } else if ([touch view] == rightArmBtn) {
        movingTouch = 3;

    } else if ([touch view] == leftLegBtn) {
        movingTouch = 4;

    } else if ([touch view] == righLegBtn) {
        movingTouch = 5;

    } else if ([touch view] == vakBtn) {
        movingTouch = 6;

    } else {
        movingTouch = 10;
    }

    if (touchParent != movingTouch) {
        [self touchesEnded:touches withEvent:event];
    }

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [self touchesEnded:touches withEvent:event];
}
4

1 に答える 1

0

さて、touchesBegan、touchesMoved、touchesEndedをUIButtonサブクラスに追加しても期待どおりに機能しないことがわかったので、各UIControlアクションのターゲットを追加するように切り替えました。

ここからのコードを使用しましたUIButtonがトリガーされたときにtouchesBegan座標を取得するにはどうすればよいですか?

各ボタンに使用し、少し変更しました-次のように:

UIButton *aButton = [UIButton ......
[aButton addTarget:self action:@selector(aButtonTouch) forControlEvents:UIControlEventTouchDown];
[aButton addTarget:self action:@selector(aButtonTouchEnd) forControleEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];

その後

-(void)aButtonTouch{
//do something
}
-(void)aButtonTouchEnd {
//do something
}
于 2012-10-11T08:59:23.807 に答える