※ ChatGPTを利用し、要約された質問です(原文:UIButtonを始点とするフリックの取得について)
UIButtonを始点とするフリックの取得について
このQ&Aのポイント
iPhoneアプリの開発において、特定のView内でフリックが行われた場合に特定の動作をさせるための実装方法について質問します。
現在の実装では、ボタン上でのフリックが正しく検知されず、ボタンのイベントが反応しないようです。
どの位置でフリックが行われても同様の処理を実行させるための解決方法を教えてください。
UIButtonを始点とするフリックの取得について
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");
// 上向きフリックに応じた処理を記述予定
}
}
}
お礼
riding_heart様 ご回答ありがとうございます。 こんなに簡単に実装できるジェスチャ監視の方法があったのですね! ターゲットとなるViewも明示できて、とても便利ですね。 今回は、 UISwipeGestureRecognizer を利用して、実現してみました。 長押しやPanやPinchなども活用することで、 さまざまな動作が実現できそうです。 touchesBegan、Endedのほうにばかり頭がいき、 調査不足になってしまっていました・・・。 初歩的な質問でご迷惑をおかけして申し訳ありません。 ご回答ありがとうございました。