• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UIButtonを始点とするフリックの取得について)

UIButtonを始点とするフリックの取得について

このQ&Aのポイント
  • iPhoneアプリの開発において、特定のView内でフリックが行われた場合に特定の動作をさせるための実装方法について質問します。
  • 現在の実装では、ボタン上でのフリックが正しく検知されず、ボタンのイベントが反応しないようです。
  • どの位置でフリックが行われても同様の処理を実行させるための解決方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1
nanan2407
質問者

お礼

riding_heart様 ご回答ありがとうございます。 こんなに簡単に実装できるジェスチャ監視の方法があったのですね! ターゲットとなるViewも明示できて、とても便利ですね。 今回は、 UISwipeGestureRecognizer を利用して、実現してみました。 長押しやPanやPinchなども活用することで、 さまざまな動作が実現できそうです。 touchesBegan、Endedのほうにばかり頭がいき、 調査不足になってしまっていました・・・。 初歩的な質問でご迷惑をおかけして申し訳ありません。 ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 一つの画面でスクロールとフリックをする方法について

    今、画像を左右に数枚スクロールさせれて、かつ、その画像を上や下にフリックすると各々、上や下に他の画像がでてきて、さらに拡大縮小もできるようなコードを書いているのですが、 ViewContorller(以下、VC)にスクロールと上下のフリックのメソッドを書き、 もう一つのPageView(UIScrollVIewクラスを親にもつ。以下、PV)に画像が拡大縮小するようなメソッドをdelegateを使って書いています。 その際に、VCのほうに書いているスクロールのメソッドがフリックのメソッドを邪魔してうまくフリックのtouchメソッドを呼んでくれません。スクロールメソッドを消すと、フリックが使えますが、そうでないときは、スクロールと拡大縮小だけができます。 調べたところ、        scrollView.canCancelContentTouches=NO;        scrollView.delaysContentTouches=NO; を使うと良いというのでやってみたのですが、うまくいきません。 もし、お分かりになる方がいらっしゃいましたら、大変お手数かけますが、ご教授ください。 以下が VC.mです。 xcodeは5.0バージョンです。 - (void)viewDidLoad { [super viewDidLoad]; UIScrollView *scrollView = [[UIScrollView alloc] init]; //ここに先ほどのを入れてみました。 scrollView.canCancelContentTouches=NO; scrollView.delaysContentTouches=NO; scrollView.frame = self.view.bounds; scrollView.contentSize = CGSizeMake(self.view.frame.size.width * kPageNum, self.view.frame.size.height); scrollView.pagingEnabled = YES; [self.view addSubview:scrollView]; for (int i=0;i<kPageNum;i++) { PageView *page = [[PageView alloc] initWithFrame:self.view.bounds]; //setImageメソッドはPVのほうで定義しています。 [page setImage:[NSString stringWithFormat:@"%d.png", i]]; page.frame = CGRectMake( self.view.frame.size.width * i, 0, self.view.frame.size.width, self.view.frame.size.height ); [scrollView addSubview:page]; } } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; _timestampBegan = event.timestamp; _pointBegan = [touch locationInView:self.view]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { static const NSTimeInterval kFlickJudgeTimeInterval = 0.3; static const NSInteger kFlickMinimumDistance = 10; UITouch *touchEnded = [touches anyObject]; CGPoint pointEnded = [touchEnded locationInView:self.view]; NSInteger distanceHorizontal = ABS(pointEnded.x - _pointBegan.x); NSInteger distanceVertical = ABS(pointEnded.y - _pointBegan.y); if (kFlickMinimumDistance > distanceHorizontal && kFlickMinimumDistance > distanceVertical) { return; } NSTimeInterval timeBeganToEnded = event.timestamp - _timestampBegan; if (kFlickJudgeTimeInterval > timeBeganToEnded) { if (distanceHorizontal > distanceVertical) { if(pointEnded.x>_pointBegan.x) {} //上下のフリックだけなのでここには書いていません。 else{}} else{ if (pointEnded.y > _pointBegan.y) { NSLog(@"あ");//NSLogで反応の仕方をみてます。 } else { NSLog(@"い"); } 初心者のため色々と質問の内容から間違いがあるかもしれませんが、宜しくお願い申し上げます。

  • objective-cで困っています教えてください

    下記のようにUIViewの上にUIImageViewを配置し、そこにUIImageをUIViewContentModeScaleAspectFitで表示させています。 表示している画像タップして、座標をとりたいと考えています。 UIImageView(UIImage)上だけをタップのエリアにしたいのですが、画面全体がタップのエリアになってしまいます。また、画像のアスペクト比を維持しUIImageViewサイズに収まるように表示しているので、タップでとれたUIImageView上の座標と、画像上の座標にズレができてしまいます。UIImageViewサイズに収まるように表示された画像上の位置から元の画像の座標を取得する方法を教えてください。 #import "ViewController.h" @interface ViewController (){ UIImageView *imageView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. CGRect rect = CGRectMake(0,20, 360, 480); imageView = [[UIImageView alloc] initWithFrame:rect]; imageView.backgroundColor = [UIColor redColor]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint p = [[touches anyObject] locationInView:imageView]; float x = p.x; // X座標 float y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); } @end

  • Swiftについて教えてください

    Swiftで分からないことがあり、投稿させていただきました。UIImageViewにタッチの機能をつけてlet stamp = Timage()で呼び出しているサンプルを参考にタッチをピンチジェスチャーに変更してlet stamp = Pimage()で呼び出すと Missing argument for parameter 'coder' in callというエラーがでます。調べて呼び出し文で引数が足りない。ということが分かったのですが、どのようにして呼び出したらいいのかわかりません。Swift初心者なので、具体的に教えていただければありがたいです。よろしくお願いします。 タッチ//////////////////////////////////////////////////////////////////////////////////////////////////////////// import UIKit class Timage: UIImageView { override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { self.superview?.bringSubviewToFront(self) } override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { let touch = touches.first as! UITouch let dx = touch.locationInView(self.superview).x - touch.previousLocationInView(self.superview).x let dy = touch.locationInView(self.superview).y - touch.previousLocationInView(self.superview).y self.center = CGPointMake(self.center.x + dx, self.center.y + dy) } } ピンチジェスチャー/////////////////////////////////////////////////////////////////////////////////////////////////////////////// import UIKit class Pimage: UIImageView { var gestureEnabled = true private var beforePoint = CGPointMake(0.0, 0.0) private var currentScale:CGFloat = 1.0 required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.userInteractionEnabled = true let pinchGesture = UIPinchGestureRecognizer(target: self, action: "Pinch") self.addGestureRecognizer(pinchGesture) } }

    • ベストアンサー
    • Swift
  • objective-cで困っています教えてください

    objective-cをトライ&エラーで試しながら学習をしている初心者です。タッチした所を中心にまず100×100の正方形を表示し、その後スライダーで正方形の大きさを決めてから画像のトリミングをしたいのですが、正方形が表示されないのと、タッチした位置と切り取られる位置がずれています。上記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。宜しくお願いします。 ViewController.mの内容 #import "ViewController.h" @interface ViewController (){ // UILabel *label; // UIImageView *uv; //中心の位置 float v; // X座標 float x; // Y座標 float y; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //写真の表示 CGRect rect_uv = CGRectMake(0,20, 360, 360); UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; // UISliderのインスタンス化 CGRect rect_sd = CGRectMake(50, 400, 200, 10); UISlider *slider = [[UISlider alloc]initWithFrame:rect_sd]; // スライダーの最小値,最大値,値を設定 slider.minimumValue = 0; slider.maximumValue = 500; slider.value = 100; // スライドしている最中に値を調べられるようにする.デフォルトでYESだがサンプルのため slider.continuous = YES; // スライダーの値が変更されたときに呼ばれるメソッドを設定 [slider addTarget:self action:@selector(slider_ValueChanged:) forControlEvents:UIControlEventValueChanged]; // スライダーをビューに追加 [self.view addSubview:slider]; // ラベルの設置 CGRect rect_lb = CGRectMake(300, 400, 100, 30); label = [[UILabel alloc]initWithFrame:rect_lb]; [self.view addSubview:label]; // 標準ボタン例文 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(50, 450, 100, 30); [btn setTitle:@"切り取り" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(trim:) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:btn]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * スライダーの値が変更されたとき */ - (void)slider_ValueChanged:(id)sender { UISlider *slider = sender; // スライダーの値をログに記述 NSLog(@"スライダーの値:%f", slider.value); // ラベルのテキストを設定 //float v = slider.value; v = slider.value; label.text = [NSString stringWithFormat:@"%2.f",v]; //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画 } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.anyObjectメソッドでいずれか1つのタッチを取得 // 2.locationViewメソッドで対象となるビューのタッチした座標を取得 CGPoint p = [[touches anyObject] locationInView:self.view]; x = p.x; // X座標 y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,100,100)); // 四角形の描画 } /** * 切り取りボタンが押されたとき呼ばれるtrimメソッド */ -(void)trim:(UIButton*)button{ // ここに何かの処理を記述する // (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます) // 切り抜き元となる画像を用意する。 //UIImage *srcImage = /* UIImagePickerなどから取得したUIImage */ UIImage *srcImage = [UIImage imageNamed:@"hoge.png"]; // 切り抜く位置を指定するCGRectを作成する。 CGRect trimArea = CGRectMake(x, y, v, v); // CoreGraphicsの機能を用いて、 // 切り抜いた画像を作成する。 CGImageRef srcImageRef = [srcImage CGImage]; CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea); UIImage *trimmedImage = [UIImage imageWithCGImage:trimmedImageRef]; // 画像表示例文 //UIImage *img = [UIImage imageNamed:@"hoge.png"]; UIImageView *iv = [[UIImageView alloc] initWithImage:trimmedImage]; [self.view addSubview:iv]; } @end

  • IEのイベントでのウインドウ位置の取得

    以前に、MdNの「リンクにマウスオーバーするとポップアップで説明が表示される」というサンプルの記述がうまく動作しないという質問で、FairefoxやSafariではその回答でうまく動作するようなのですが、IEの動作がまだ駄目なようなのです。 IEのイベントが発生した時のマウス座標の取得は、Javascriptで、 function OnScreenHelp(x,y){ if(document.all) { /* IEでの処理 */ document.getElementById(strID).style.left = event.x + document.body.scrollLeft + 15; document.getElementById(strID).style.top = event.y + document.body.scrollTop + 0; }else{             /* IE以外の処理 */ document.getElementById(strID).style.left = x + 15 + "px"; document.getElementById(strID).style.top = y + 0 + "px"; } } のような記述になっているのですが、関数OnScreenHelp(x,y)のx,yがbodyの本文内で、event.pageX、event.pageYのようにNN系の記述になっているため、IEではこのx,yの値は使えないので上記のような記述になっているようなのです。上記の記述ではうまくポップアップしてくれないので、 event.xやevent.yの所の記述がまずいのかな?と思って、ちょっと調べてみて、window.event.offsetXやwindow.event.offsetYに変更してやってみたのですが、うまくいきません。ここの所の、IEの記述としては、どのように記述したらよいか分かりかねています。ご経験のある方、ご教示願えたらと思います。 よろしくお願い致します。

  • バイトかけもちを伝えるべきか+交通費多重取得の問題

    大学生です。今X店でバイトをしています。 かけもちでY店にもバイトしようかと考えているところです。 1、かけもちは伝えるべきか? ・X店にY店で働くことを。 ・Y店にX店で今働いていることを。 それぞれ伝えなければならないのでしょうか? できれば隠しておきたいのです(不利益に扱われてしまう可能性があるため)。 給料の問題もあるので、どちらかには伝えなければならないでしょうが、 X店にはなるべく知られたくないです。 2、交通費の多重取得について 家             X店              Y店 A市――――――――B市―――――――――C市 このような位置関係です。別々の日に働くことになれば交通費は問題ないですが、 同じ日にX店とY店で働くときの交通費が問題です。両方からもらえば、余計にもらうことになります。 その日ごとに交通費を申請するのは相手方にも処理の上で迷惑をかけそうなのですが、どうすればよいでしょうか? ある日はX店だけ、ある日はY店だけ、ある日はX店とY店のかけもちとごちゃまぜになりそうなのです。 黙ってれば詐欺になりますか? ご回答よろしくお願いします。

  • 画面出力情報の取得について

    Visual Studio 2010でWindowsフォームアプリケーション(C#)を作成しています。 100ms毎に、PCの画面で出力しているある点(x,y)の色情報(RGB)を取得する、 という処理を行う場合、どのように記述すればよいでしょうか。 100ms毎にスクリーンキャプチャを取得しての処理を考えたのですが、効率的ではないように思い、 質問させていただきました。

  • maximaで方程式解の文字式のままの計算

    数式処理ソフトmaximaで、連立1次方程式を解いたのち、その解を別の式の中に文字式のまま使いたい場合どのようにすればよいのでしょうか。 たとえば、 solve([x+y=2、x-y=3],[x,y]) を解いてx=2.5,y=-0.5と出ている場合に、続けてz=x+2yと記述して計算させ、結果を1.5と表示させたいということです。 普通に記述するだけでは欲しい結果が得られません。 詳しい方ご教示ください。

  • TextOut関数のカレントポジション?

    SetTextAlign関数でTA_UPDATECPを指定するとTextOut、ExtTextOut関数のX、Y位置指定は無視されカレントポジションが示す位置に印刷されるとあります そこで質問です (1)このカレントポジションが示すX、Yの現在値を知る方法はありますか? (2)またそのX、Yの現在値を変更するにはどの様にしたら良いですか? 色々調べましたが、この辺りの記述が見つかりません ご存知でしたらご指導をお願い申し上げます

  • 探索アルゴリズム

    aという対象の位置は(x,y) その周辺10の距離内にいるモノを見つけたい このモノというのはたくさんあるとします。モノの座標は一覧としてもっています。 x+10, x-10,y+10,y-10を境界にifで処理するとモノ一つに対して4度処理を必要として、モノの数だけ処理をする必要があり非効率だと思ったのですが他の効率的な方法が思い浮かびません なにかいい方法はありますか?

    • ベストアンサー
    • CGI