web-dev-qa-db-ja.com

タップした場所からCGPointを取得する方法は?

私はiPad用のグラフ電卓アプリに取り組んでおり、ユーザーがグラフビューの領域をタップして、タッチしたポイントの座標を表示するテキストボックスをポップアップ表示できる機能を追加したいと考えました。これからCGPointを取得するにはどうすればよいですか?

27
jkolber

あなたには2つの方法があります...

1。

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
  UITouch *touch = [[event allTouches] anyObject];
  CGPoint location = [touch locationInView:touch.view];
}

ここでは、現在のビューからポイントで位置を取得できます...

2。

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setDelegate:self];
[self.view addGestureRecognizer:tapRecognizer];

ここで、このコードは、特定のオブジェクトまたはメインビューのサブビューで何かを行うときに使用します

47
Paras Joshi

これを試して

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
  UITouch *touch = [touches anyObject];

  // Get the specific point that was touched
  CGPoint point = [touch locationInView:self.view]; 
  NSLog(@"X location: %f", point.x);
  NSLog(@"Y Location: %f",point.y);

}

ユーザーがタッチダウンした場所ではなく、画面から指を離した場所を見たい場合は、「touchesEnded」を使用できます。

20
Dima

uIGestureRecognizerをマップビューでサブクラス化してタッチを手動でインターセプトする代わりに使用する方がおそらくより簡単です。

ステップ1:最初に、ジェスチャービューをマップビューに追加します。

 UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(tapGestureHandler:)];
 tgr.delegate = self;  //also add <UIGestureRecognizerDelegate> to @interface
 [mapView addGestureRecognizer:tgr];

ステップ2:次に、shouldRecognizeSimultaneouslyWithGestureRecognizerを実装し、YESを返すことで、タップジェスチャレコグナイザーがマップと同時に動作できるようにします(そうしないと、ピンのタップはマップによって自動的に処理されません)。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer
    :(UIGestureRecognizer *)otherGestureRecognizer
{
   return YES;
}

ステップ3:最後に、ジェスチャーハンドラーを実装します。

- (void)tapGestureHandler:(UITapGestureRecognizer *)tgr
{
   CGPoint touchPoint = [tgr locationInView:mapView];

   CLLocationCoordinate2D touchMapCoordinate 
    = [mapView convertPoint:touchPoint toCoordinateFromView:mapView];

   NSLog(@"tapGestureHandler: touchMapCoordinate = %f,%f", 
    touchMapCoordinate.latitude, touchMapCoordinate.longitude);
}
6
Kupendiran iOS

Swift 4の答えを投げたいだけです。APIの見た目がかなり異なるからです。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = event?.allTouches?.first {
        let loc:CGPoint = touch.location(in: touch.view)
        //insert your touch based code here
    }
}

OR

let tapGR = UITapGestureRecognizer(target: self, action: #selector(tapped))
view.addGestureRecognizer(tapGR)

@objc func tapped(gr:UITapGestureRecognizer) {
    let loc:CGPoint = gr.location(in: gr.view)  
    //insert your touch based code here
}

どちらの場合も、locにはビューでタッチされたポイントが含まれます。

6
Rob Norback

UIGestureRecognizerまたはUITouchオブジェクトを使用する場合は、locationInView:メソッドは、ユーザーがタッチした特定のビュー内でCGPointを取得します。

3
diederikh
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
    print("tap working")
    if gestureRecognizer.state == UIGestureRecognizerState.Recognized { 
        `print(gestureRecognizer.locationInView(gestureRecognizer.view))`
    }
}
0
user3108511