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");
// 上向きフリックに応じた処理を記述予定
}
}
}
No.1ベストアンサー
- 回答日時:
riding_heart様
ご回答ありがとうございます。
こんなに簡単に実装できるジェスチャ監視の方法があったのですね!
ターゲットとなるViewも明示できて、とても便利ですね。
今回は、
UISwipeGestureRecognizer
を利用して、実現してみました。
長押しやPanやPinchなども活用することで、
さまざまな動作が実現できそうです。
touchesBegan、Endedのほうにばかり頭がいき、
調査不足になってしまっていました・・・。
初歩的な質問でご迷惑をおかけして申し訳ありません。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) MID関数について 2 2022/04/22 09:13
- Windows 10 windowsの回復ドライブや復元ポイントを使用した場合の戻る位置を教えてください。 5 2023/08/19 14:52
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- Excel(エクセル) 【Excel】 開始時間からある日時までの経過時間を計算する関数を教えて下さい 5 2023/06/11 22:22
- 建設業・製造業 こういう職場どう思いますか? 勤務開始時間前に現場に入り、まずは掃除をしがてら業務中の作業者仲間にあ 1 2023/06/18 15:33
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- 英語 提示文の自然な副詞の位置と、位置によるニュアンスの違いについて 4 2022/06/16 13:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
VB6 コマンドボタン クリック...
-
VBA kernel32 の意味
-
Excel VBA で処理中断(DoEvents...
-
エクセルVBAでクリップボード内...
-
VBスクリプトで「お待ち下さい...
-
VBSで応答不要のメッセージボッ...
-
Application.ScreenUpdating=Fa...
-
メッセージBOXの「はい」「いい...
-
シャットダウン時のExcel強制終...
-
InvalidateRectがうまくいかない
-
VBA メッセージボックスを自動...
-
c#でボタンのアクションが終わ...
-
C#で処理中画面を表示したい。
-
beforecloseの中からの抜け出し方
-
終了処理について
-
MFCのメニューバーのイベント取得
-
ループを使わずに、特定時間に...
-
マウスのクリックを無視したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBSで応答不要のメッセージボッ...
-
ACCESS側からEXCELの書式を設定...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
手動かプログラムでの起動かの判断
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
シャットダウン時のExcel強制終...
-
VBA、UserFormを前面に出力して...
-
<input type="file">タグで「キ...
-
Excel VBA 実行中に一瞬フリー...
-
「キャンセル」ボタン付きの処...
-
EXCEL VBA「Application.Displa...
おすすめ情報