アプリ版:「スタンプのみでお礼する」機能のリリースについて

iPhoneアプリの開発を行っています。
その中で、あるView(下記ソースではtestView)の中でフリックが行われた場合に
特定の動作をさせるようにしたいと考え、下記のソース引用の通り実装しました。

ViewControllerの中にUIView(testView)を配置し、その中に、UIButton(testButton)
を配置し、フリックが行われた際の開始位置と終了位置を取得しています。

ですが、下記実装ですと、フリックの開始位置が、testButton上である場合、
ViewController.m 上の、touchesBegan、touchesEnded を通りません。

カスタムのボタンを作って試してみたところ、ButtonのtouchesBegan、
touchesEndedには入ってきており、testButtonが非活性の場合には、
ViewController.m 上の、touchesBegan、touchesEnded を通って
いるようですので、ボタン側のイベントが反応し、ViewController.m
に入ってこず終了しているものと思っています。

これを、testView上のどの位置でフリック開始された場合でも同様の
処理をさせたいのですが、何か良い解決方法をご存知でしたら、
ぜひ、お知恵をお借りしたいです。

プログラム初心者のため、つたない質問で申し訳ありません。
よろしくお願いいたします。

■ViewController.h の実装
-----------------------------------------
@interface ViewController : UIViewController
{
// フリック開始位置、終了位置
CGPoint _tBegan, _tEnded;
}
// ビュー
@property (weak, nonatomic) IBOutlet UIView *testView;
//
@property (weak, nonatomic) IBOutlet UIButton *testButton;

■ViewController.m の実装
-----------------------------------------
// タッチ開始
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch * touchBegan = [touches anyObject];
_tBegan = [ touchBegan locationInView: self.testView ];
}

// タッチ終了
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch * touchEnded = [touches anyObject];
_tEnded = [ touchEnded locationInView: self.testView ];

NSInteger distanceHorizontal = ABS( _tEnded.x - _tBegan.x );
NSInteger distanceVertical = ABS( _tEnded.y - _tBegan.y );

NSLog(@"%d", distanceHorizontal);
NSLog(@"%d", distanceVertical);

NSLog(@"X:%f->%f", _tBegan.x,_tEnded.x);
NSLog(@"Y:%f->%f", _tBegan.y,_tEnded.y);

if ( distanceHorizontal > distanceVertical ) {
if ( _tEnded.x > _tBegan.x ) {
NSLog(@"RIGHT Flick");
// スタート位置がmoveView内の場合、右フリックに応じた処理を記述予定
} else {
NSLog(@"LEFT Flick");
// スタート位置がmoveView内の場合、左フリックに応じた処理を記述予定
}
} else {
if ( _tEnded.y > _tBegan.y ) {
NSLog(@"DOWN Flick");
// 下向きフリックに応じた処理を記述予定
} else {
NSLog(@"UP Flick");
// 上向きフリックに応じた処理を記述予定
}
}
}

A 回答 (1件)

    • good
    • 0
この回答へのお礼

riding_heart様

ご回答ありがとうございます。

こんなに簡単に実装できるジェスチャ監視の方法があったのですね!
ターゲットとなるViewも明示できて、とても便利ですね。

今回は、
UISwipeGestureRecognizer
を利用して、実現してみました。

長押しやPanやPinchなども活用することで、
さまざまな動作が実現できそうです。

touchesBegan、Endedのほうにばかり頭がいき、
調査不足になってしまっていました・・・。

初歩的な質問でご迷惑をおかけして申し訳ありません。
ご回答ありがとうございました。

お礼日時:2013/02/22 22:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!