2012-08-07 7 views
9

iPad上でiOS 5用に開発したXCode 4.4を使用しています。カスタムボタンを作成するときにストーリーボードのレイアウトを使用しています。カスタムUIButtonでタップ座標を取得するにはどうすればよいですか?

私はタッチイベントが正しく動作し、ロギングしていますが、今はカスタムボタンのタップのx/y座標を取得したいと思います。

可能であれば、iPadの画面全体に対してではなく、カスタムボタンの相対的な座標にしたいと思います。私が言ったように

- (IBAction)getButtonClick:(id)sender { 

     NSLog(@"Image Clicked."); 
    } 

、私は画像をタップしたときに正しく記録されます.Mファイルに

- (IBAction)getButtonClick:(id)sender; 

と私のコード:

はここで.hファイルに私のコードです。

タップの座標はどのように取得できますか?

私はインターネットからいくつかの異なる例を試しましたが、ログボックスに数字の束(多分座標)が表示されると、常にフリーズします。私はiOS開発にはまったく新しいので、できるだけシンプルにしてください。ありがとう!

+1

0受け入れ答えは次のような構文を除いて同じが変更されます動作しますか? –

+0

Arternが正しい質問をしています。あなたは本当にボタン内の座標を知る必要があるのですか、どのボタンがクリックされたのかを知りたいだけですか(その場合、Vladimirの優れた「送信者とイベント」の提案は必要ありません)どのボタンがクリックされたかを判断するために「送信者」に。 – Rob

+2

イメージをUIButtonとして表示しているため、そのイメージ上でユーザーがタップした場所を知る必要があるため、座標が必要です。私はすでにどのボタンがクリックされたかを知る方法を知っています。 – twbbas

答えて

28

ボタンアクションメソッドの別の変形を使用することができますタッチ位置を取得するには:あなたのアクションハンドラで次にあなたを

myAction:forEvent:enter image description hereあなたは、引数フィールドに、IBインタフェース・ノート「の送信者とイベント」オプションからそれを作成した場合に)例えば、イベントパラメータからタッチ位置を得ることができます(画面を参照して)あなたの全体的な座標の

- (IBAction)myAction:(UIButton *)sender forEvent:(UIEvent *)event { 
    NSSet *touches = [event touchesForView:sender]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:sender]; 
    NSLog(@"%@", NSStringFromCGPoint(touchPoint)); 
} 
+1

詳細な回答ありがとうございます。しかし、私はオンラインから他のコードを試してみたときに同じエラーが発生しています。 "インスタンスに送信された認識不能なセレクタ0xde26e40 2012-08-07 10:29:36.126違い[41044:707] ***キャッチされていない例外 'NSInvalidArgumentException'によりアプリを終了しています、理由: ' - [DifferencesViewController getButtonClick:]:インスタンス0xde26e40 ''にはどのようなアイデアがありますか? – twbbas

+1

@ user1262552、あなたはまだボタンアクションにgetButtonClick:メソッドを付けて、ストーリーボードファイルやコードをチェックして、ボタン操作がビューコントローラの既存メソッドに結びついていることを確認してください。 – Vladimir

+0

そして、画像をタップするとアプリがフリーズしているようです。 – twbbas

0

を、あなたはあなたのタッチの座標を含むCGPointを作成する必要があります。しかし、それをするには、最初に触れる必要があります。だからタッチイベントを取得し、次にlocationInViewメソッドを使ってその点を作ることから始めます。さて、ユーザーがタッチしたとき、または指を離したときにいつタッチを記録するかによって、touchesBeganまたはtouchesEndedメソッドでこのコードを実装する必要があります。 touchesEndedを実行し、すべてのタッチイベントを含むNSSetカレンダー「タッチ」を渡したとします。

UITouch *tap = [touches anyObject]; 
CGPoint touchPoint = [tap locationInView:self.view]; 

"touchPoint"には、ユーザーが指を持ち上げるポイントが含まれるようになりました。座標をプリントアウトするには、あなただけの、その点のxとyプロパティにアクセス:

CGFloat pointX = touchPoint.x; 
CGFloat pointY = touchPoint.y; 
NSLog(@" Coordinates are: %f, %f ", pointX, pointY); 

という感じのはず出力座標。これで、使用しているボタンを参照するようにするには、ポイントからボタンの座標の値を手動で減算することをお勧めします。それは単純な解決策のようですが、正直なところ、オブジェクトに基づいてビューを作成し、self.viewの代わりにlocationInViewに渡さない限り、別のオブジェクトへの参照で座標を取得する方法がわかりません。

タッチの詳細については、チュートリアルhereの素晴らしいセットがあります。

1

Incift of Swift 3。

スウィフト3.0:あなたは、座標を必要とするのはなぜ

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