2011-09-10 19 views
28

大きいUIButtonUIButtonTypeCustom、ボタンターゲットUIControlEventTouchUpInsideがあります。私の質問は、どのようにタッチが発生したUIButtonのどこを決定することができますです。この情報が必要なので、タッチ位置からポップアップを表示できます。私が試したことは次のとおりです。UIButton TouchUpInsideタッチ位置

UITouch *theTouch = [touches anyObject]; 
CGPoint where = [theTouch locationInView:self]; 
NSLog(@" touch at (%3.2f, %3.2f)", where.x, where.y); 

などさまざまな繰り返しがあります。ボタンのターゲットメソッドはsenderを経由して、そこから情報を取得:button.touchUpLocation

UIButton *button = sender; 

だから私のようなものを使用することができます方法はありますか?

私はオンラインを見て、事前のおかげので、これに似た何かを見つけることができませんでした。

+0

何touchUpLocationはありませんが、UIButtonは、あなたが得ることができないコントロールですUIButtonクリックの位置。 http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIButton_Class/UIButton/UIButton.html –

+1

私は文字通りtouchUpLocationを意味するものではありませんでした、私はPraveenさん-K @その – Andrew

+2

のようなものを意味し、それが間違っています。 UIKitは、アクションをトリガしたUIEventという2番目のパラメータを取るアクションをサポートしています。それから、あなたはタッチのリストを得ることができ、各タッチには位置があります。下記のコードを見てください。ただし、UIButtonには最後のクリックの位置を返すメソッドはありません。 – Caleb

答えて

56
UITouch *theTouch = [touches anyObject]; 
CGPoint where = [theTouch locationInView:self]; 
NSLog(@" touch at (%3.2f, %3.2f)", where.x, where.y); 

このコードは、おそらくあなたのビューコントローラ内のアクション内にあることを除いて、正しいアイデアでしょうか?表示されている場合は、selfはボタンではなくビューコントローラを参照します。ボタンへのポインタを-locationInView:に渡す必要があります。

ここでは、あなたのビューコントローラで試すことができますテストアクションです:

- (IBAction)buttonPressed:(id)sender forEvent:(UIEvent*)event 
{ 
    UIView *button = (UIView *)sender; 
    UITouch *touch = [[event touchesForView:button] anyObject]; 
    CGPoint location = [touch locationInView:button]; 
    NSLog(@"Location in button: %f, %f", location.x, location.y); 
} 
+1

私の問題を完全に解決していただきありがとうございます。私はそれができないと思ったので、これは素晴らしいことです。 – Andrew

+1

コードの偉大なスニペット何 - 'からイベントを取得する方法はあります – SomaMan

+0

:-)人間の自然の中で自分の信念を再確認するこれらの事が現れ、時々は - (IBAction)のbuttonPressed:(ID)sender' ...? (つまり、私は巨大なプロジェクトを持っており、すべてのボタンを 'forEvent:'に変更することなく、これをボトルネックにしたいと思います。)ありがとう! – Olie

0

あなたのボタンにジェスチャー認識を追加しようとしましたか?

+0

ジェスチャー認識プログラムを使った私の過去の経験では、サブビューでは動作しないので、私はそれを試しませんでした。私は何か間違っていると確信しています。しかし、それはジェスチャーのようなものではなかった。ビューがタップされたときとは異なり、ボタンが押されたときを知りたいと思っていました。しかし、あなたの答えに感謝 – Andrew

+0

@ジャン=デニスMuysあなたの提案の詳細を与えるつもりでない限り、この答えはコメントでなければなりません。また、私はこのケースでは上向き投票の答えがより適切だと思いますが、ジェスチャ認識子を追加することは同様に一貫性のある解決策でなければなりません。正しく設定すると、イベントを使用した場合とまったく同じように動作します。また –

4

はスウィフト3.0の場合:

@IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) 
{ 
     let myButton:UIButton = sender as! UIButton 
     let touches: Set<UITouch>? = event.touches(for: myButton) 
     let touch: UITouch? = touches?.first 
     let touchPoint: CGPoint? = touch?.location(in: myButton) 
     print("touchPoint\(touchPoint)") 
} 
関連する問題