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

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

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

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

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

button

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

Q&A

解決済

1回答

761閲覧

ドラッグ&ドロップのドロップ時の処理の書き方がわかりません

katw

総合スコア1

iOS

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

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

button

HTMLで用いる<button>タグです。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/14 19:14

編集2021/02/15 08:53

前提・実現したいこと

Button1をドラッグしてドロップした位置がButton2上だったら実行する処理を書きたいです。

発生している問題

ドロップ時(指を離した時)の処理の書き方がわかりません。

該当のソースコード

Swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 var button1x: CGFloat? 7 var button1y: CGFloat? 8 var button2x: CGFloat? 9 var button2y: CGFloat? 10 11 @IBOutlet weak var nowLabel: UILabel! 12 13 @IBOutlet weak var button1: UIButton! 14 @IBOutlet weak var button2: UIButton! 15 16 @IBOutlet weak var button1ConterX: NSLayoutConstraint! 17 @IBOutlet weak var button1ConterY: NSLayoutConstraint! 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 22 button2x = button2.frame.origin.x 23 button2y = button2.frame.origin.y 24 } 25 26 @IBAction func button1Pan(_ sender: UIPanGestureRecognizer) { 27 28 //移動量を取得する。 29 let move:CGPoint = sender.translation(in: view) 30 31 //button1の位置の制約に移動量を加算する。 32 button1ConterX.constant += move.x 33 button1ConterY.constant += move.y 34 35 //画面表示を更新する。 36 view.layoutIfNeeded() 37 38 //変数に現在座標を入れる 39 button1x = sender.view!.frame.origin.x 40 button1y = sender.view!.frame.origin.y 41 42 nowLabel.text = "ドラッグ中です" 43 44 //移動量を0にする。 45 sender.setTranslation(CGPoint(x: 0, y: 0), in:view) 46 } 47 48 /* ドロップ時に書きたい処理 49 if button2x!-30 < button1x! && button2x!+30 > button1x! && 50 button2y!-30 < button1y! && button2y!+30 > button1y! { 51 nowLabel.text = "button2上でドロップしました" 52 } else { 53 nowLabel.text = "ドロップしました" 54 } 55 */ 56 57} 58

試したこと

ドラッグ時、何をドラッグしているのかわかるようにしたかったので、Button1にUIPanGestureRecognizerをつけました。しかし、ドロップ時の処理がわかりませんでした。
(ソースコードはその時のものです。)

なので、UIPanGestureRecognizerはあきらめて、ドラッグ中何をつかんでいるのか分からなくなってしまうのですが、TouchUpOutsideを使いました。しかし、指を離した位置の座標の取得方法がわかりませんでした。

(Button1はTouchUpOutsideを使いたかったのでButtonにしました。LabelでもImageでも大丈夫です。)

補足情報(FW/ツールのバージョンなど)

Xcode12.3
swift5.3.2

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

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

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

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

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

TsukubaDepot

2021/02/14 23:42

うまくゆかないコードでも良いので、ご提示いただけますでしょうか。
katw

2021/02/15 08:56

ご指摘ありがとうございます。 コード載せました!
guest

回答1

0

ベストアンサー

UIPanGestureRecognizer(実際には親クラスの UIGestureRecognizer) の state をみると、ジェスチャの状態が確認できますので、たとえば次のような感じで実現できると思います。

The current state a gesture recognizer is in.

Swift

1@IBAction func button1Pan(_ sender: UIPanGestureRecognizer) { 2 switch sender.state { 3 case .began, .changed: 4 //移動量を取得する。 5 let move:CGPoint = sender.translation(in: view) 6 7 //button1の位置の制約に移動量を加算する。 8 button1ConterX.constant += move.x 9 button1ConterY.constant += move.y 10 11 //画面表示を更新する。 12 view.layoutIfNeeded() 13 14 //変数に現在座標を入れる 15 button1x = sender.view!.frame.origin.x 16 button1y = sender.view!.frame.origin.y 17 18 nowLabel.text = "ドラッグ中です" 19 20 //移動量を0にする。 21 sender.setTranslation(CGPoint(x: 0, y: 0), in:view) 22 case .ended: 23 if button2x!-30 < button1x! && button2x!+30 > button1x! && 24 button2y!-30 < button1y! && button2y!+30 > button1y! { 25 nowLabel.text = "button2上でドロップしました" 26 } else { 27 nowLabel.text = "ドロップしました" 28 } 29 30 default: 31 print("それ以外の処理") 32 } 33 }

投稿2021/02/15 09:38

TsukubaDepot

総合スコア5086

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

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

katw

2021/02/15 10:37

無事できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問