私はiPad用のグラフ電卓アプリに取り組んでおり、ユーザーがグラフビューの領域をタップして、タッチしたポイントの座標を表示するテキストボックスをポップアップ表示できる機能を追加したいと考えました。これからCGPointを取得するにはどうすればよいですか?
あなたには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];
ここで、このコードは、特定のオブジェクトまたはメインビューのサブビューで何かを行うときに使用します
これを試して
- (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」を使用できます。
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);
}
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
にはビューでタッチされたポイントが含まれます。
UIGestureRecognizer
またはUITouch
オブジェクトを使用する場合は、locationInView:
メソッドは、ユーザーがタッチした特定のビュー内でCGPoint
を取得します。
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
print("tap working")
if gestureRecognizer.state == UIGestureRecognizerState.Recognized {
`print(gestureRecognizer.locationInView(gestureRecognizer.view))`
}
}