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");
// 上向きフリックに応じた処理を記述予定
}
}
}
↧