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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

484閲覧

Swift3 ボタンの範囲外から指をドラッグしてボタンに触れた時にアクションを起こしたいです

Mineo_user

総合スコア8

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2017/10/28 09:16

ButtonA ButtonBの2つのボタンがあり、ButtonAを押した後にそのまま指をドラッグして指がButtonBに触れた時にButtonBのActionを起こしたいです。
もしくはButtonBの範囲外から指をドラッグしてButtonBに触れた時にButtonBのアクションを起こす。
UIButtonのイベントでTouch Drag EnterやTouch Drag Insideなどを使いましたが、こらだとそもそもButtonBを一度押さないと反応しないのでできませんでした。

swift初心者なので、サンプルコードがありましたら、助かります。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

※質問を読み違えていたため、回答を大きく修正しました

UIButtonのアクションではなく、UIPanGestureRecognizerを使います。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var buttonA: UIButton! 6 @IBOutlet weak var buttonB: UIButton! 7 8 var isInButtonB = false; 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(pannedFromA(sender:))) 14 15 buttonA.addGestureRecognizer(panGestureRecognizer) 16 } 17 18 @objc func pannedFromA(sender: UIPanGestureRecognizer){ 19 20 if buttonB.frame.contains(sender.location(in: self.view)) { 21 if !isInButtonB { // ←ButtonBの外側からドラッグしてきた場合のみ 22 print("ButtonBのに触れたら処理実行") 23 } 24 isInButtonB = true 25 26 } else { // ButtonBの内側でドラッグしても何もしない 27 isInButtonB = false 28 } 29 } 30}

投稿2017/11/04 14:29

編集2017/11/09 13:50
ndo

総合スコア115

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

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

Mineo_user

2017/11/06 12:02

ご回答ありがとうございます。 早速試してみましたが、IBActionとボタンとを紐付けしようとすると、結べません。「sender: Any」 を「sender:UIButton」にすると紐付けできるのですが、動作はしません。何か間違っていますでしょうか。
ndo

2017/11/06 13:25 編集

>IBActionとボタンとを紐付けしようとすると、結べません 特に迷うところではないと思うのですが… 一応、回答に画像貼っておきます。 (senderの型はUIButtonにしてもいいですよ)
ndo

2017/11/06 13:36

ちなみに座標についてはビューの階層構造によって違ってくるので、良きにしてください。
Mineo_user

2017/11/08 12:09

ありがとうございました。 ButtonAを押してそのまま指ドラッグしてButtonBで指を離した時にアクションを起こす事はできました。 ただ、元の質問に書いたのですが、ButtonB上で指を離さずに、ドラッグした指がButtonBに触れた時にアクションを起こしたいと思っています。 できますでしょうか?
ndo

2017/11/08 14:34

質問を読み違えていました。失礼しました。 たしかに「ButtonBに触れた時」と書いてますね。 回答本文を大きく修正しました。 ButtonAのアクションは解除して、かわりにUIPanGestureRecognizerを使用してください。 コード全文を記載しますが、細かいところは仕様に応じてカスタマイズしてください。
Mineo_user

2017/11/09 11:43

できました!ありがとうございます。 このコードのすべての文法が理解できてないので、まだ勉強が必要なのですが、良かったらあと一つだけ聞いても良いですか。 ButtonAを押さずに、ButtonBの範囲外の画面のどこからか指をドラッグしてButtonBに触れた時にアクションを起こす場合、どうカスタマイズするのが良いですか。いろいろ試してみたのですが、できませんでした。
ndo

2017/11/09 13:52 編集

GestureRecognizerを付与する対象を、buttonBの親ビューに変えるだけです。 具体的に以下のようにします。 15行目の buttonA.addGestureRecognizer(panGestureRecognizer) を self.view.isUserInteractionEnabled = true self.view.addGestureRecognizer(panGestureRecognizer) の2行に変更するだけです。 self.view.isUserInteractionEnabled = true は、コントロール(UIButtonのようなUIControlを継承したビュー)以外でユーザーの操作を受け付ける際に必要です(先程まで、誤って14行目に残していましたが削除しました)。 コードのわからない箇所の意味をひとつひとつ調べていれば、そのうち自分でも思い通りにコーディングできるようになりますよ。
Mineo_user

2017/11/10 12:20 編集

ありがとうございます。こちらもできました。 これをさらにカスタマイズし、複数のボタン(例えばbuttonA buttonBの二つのボタン)が存在する時の記述方法を最後に教えていたけますか。色々試してもうまくいきませんでした。 何度もすみませんが、よろしくお願いします。
ndo

2017/11/10 15:21 編集

buttonAに触れたらbuttonA用の処理、buttonBに触れたらbuttonB用の処理ということですか? if buttonB.frame.contains(sender.location(in: self.view)) でbuttonBに触れているかどうか判断しているわけですから、ボタンの数だけ条件判断を増やせばよいでしょう。
Mineo_user

2017/11/11 08:11

そうでした!簡単な事でしたね。 今回は色々と丁寧にありがとうございました! また何かありましたらよろしくお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問