質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

11170閲覧

UIbuttonのタッチイベントTouch Up Insideの範囲について

lyzmfeqpxs54

総合スコア237

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/08/02 08:55

編集2016/08/03 03:15

swiftに関する質問です。

UIbuttonのタッチイベントでTouch Up Insideを選択した場合についてです。そのボタンの画像の範囲でタップし、その後範囲外へ指をタップ状態のまま移動させ、画像の範囲外で指を離した場合に、画像に近い位置だとイベントが有効に判定されてしまいます。タッチ時のハイライトを有効にして、状態を見てみると、画像から一定の位置まで離れればタッチが有効でなくなっているようです。

そこで質問なのですが、Touch Up Insideを選択した場合に、画像をタップ後、指を離さずにその画像から少しでも外れた場合にタップ処理を無効にするためには、どうすればよいのでしょうか。
ご教示のほど、お願いいたします。

以下にコードを追記しました。

swift

1 2 // Buttonを生成する. 3 let maruBtn = UIButton() 4 5 // サイズを設定する. 6 maruBtn.frame = CGRectMake(100 ,100 ,100 ,100) 7 8 //表示画像の設定 9 let maruBtnImage:UIImage = UIImage(named: "maru.png")! 10 maruBtn.setBackgroundImage(maruBtnImage, forState: .Normal) 11 maruBtn.addTarget(self, action: #selector(KenteiViewController.maruBtnTap(_:)), forControlEvents:.TouchUpInside) 12 13func maruBtnTap(sender: UIButton){ 14 15 //押した時の処理をいろいろ書いてます 16 17}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ドラッグ中に範囲外に出た時点でキャンセルするようにしてみました。
TouchUpInsideはそのままで、TouchDragInsideのActionを追加して下さい。

swift

1@IBAction func touchDragInside(sender: UIButton, forEvent event: UIEvent) { 2 if let touches = event.touchesForView(sender) { 3 for touch in touches { 4 if !sender.bounds.contains(touch.locationInView(sender)) { 5 sender.cancelTrackingWithEvent(event) 6 print("out of bounds") 7 break 8 } 9 } 10 } 11}

Action

投稿2016/08/03 02:13

編集2016/08/03 02:20
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

TouchUpInsideのイベントは確かに部品のちょっと外側でタッチを離してもイベントが発生するようですね。
そこで、TouchUpInsideイベントをもらった時に、タッチしていた場所がボタンの内側か外側か判定して
内側だった時だけ処理すればいいと思います。
TouchUpInsideイベントでタッチしていた場所を取得するには、イベントを接続する時に表示されるダイアログで、以下のようにArgumentsに「Sender and Event」を指定します。
イメージ説明

すると、次のようなパラメータ形式のイベント処理メソッドが生成されますので

swift

1 @IBAction func touchUpInside_button(sender: AnyObject, forEvent event: UIEvent) { 2 }

あとは、eventパラメータの中にあるタッチ座標を取り出して、それがボタンの範囲内かどうか判断すればいいです。
サンプルコードを示します。

swift

1 @IBAction func touchUpInside_button(sender: AnyObject, forEvent event: UIEvent) { 2 let button = sender as! UIButton 3 let touch = event.touchesForView(button)?.first 4 let point = touch?.locationInView(button) 5 if CGRectContainsPoint(button.bounds, point!) { 6 print("ボタンの内側") 7 } else { 8 print("ボタン外側") 9 10 } 11 }

投稿2016/08/02 13:24

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lyzmfeqpxs54

2016/08/03 03:17

早速のご回答ありがとうございます。 大変恐縮なのですが質問をよろしいでしょうか。 現在ストーリーボードは使用せずコードのみで作成しております。 コードは追記したとおりなのですが、この場合どのようにコーディングすればよいかご教示いただけないでしょうか。 勉強が足らず申し訳ありません。 よろしくお願い申し上げます。
TakeOne

2016/08/03 03:46

コードでボタンイベントを登録しているんだったら、addTargetで登録しているんだと思いますので、 そのactionパラメータに指定するセレクタを #selector(touchUpInside_button(_:event:)) と指定したら func touchUpInside_button(sender: AnyObject, forEvent event: UIEvent) が呼び出されます。
lyzmfeqpxs54

2016/08/03 06:49

maruBtn.addTarget(self, action: #selector(KenteiViewController.maruBtnTap(_:event:)), forControlEvents:.TouchUpInside) func maruBtnTap(sender: AnyObject, forEvent event: UIEvent){ } としているのですが、下記エラーが出てしまいます。大変恐縮ですが、間違っている箇所をご指摘いただけないでしょうか。 Type 'KenteiViewController' has no member 'maruBtnTap(_:event:)'
fuzzball

2016/08/03 08:14 編集

selector内の event を forEvent にして下さい。 #selector(KenteiViewController.maruBtnTap(_:forEvent:)) Xcodeの補完を利用して入力すると間違えずに済みますよ。
lyzmfeqpxs54

2016/08/03 08:47

無事解決いたしました!。 皆様方のご教示のおかげです。本当にありがとうございました。
TakeOne

2016/08/03 08:57

すみません。タイプミスしていました。fuzzballさん、フォローありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問