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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

1006閲覧

ボタンでラベルを生成し、それぞれをドラッグして移動できるようにしたいです。

Dave

総合スコア22

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/08/07 00:08

MacOS Catalina 10.15.4
Xcode 11.6
Swift version 4

先日こちらで質問させて頂き、Storyboardに設定している1つのラベルをドラッグして動かす方法をご教示頂きました。
そこから少し発展させて、ボタンでラベルを生成して、それぞれをドラッグ動かしたいです。
うんうん悩みながらやってみたこととしては、生成したラベルを配列に組み込み、それぞれにUIPanGestureRecognizerを付与してみたのですが、生成した1つ目のラベルしか動かせず、イメージ通りにいきません。

大変恐縮ながら、良い書き方をご教示頂けませんでしょうか。
何卒宜しくお願い致します。

Swift4

1import UIKit 2 3 class ViewController: UIViewController{ 4 5     //ラベル配列を準備 6 var labelarray : [UILabel] = [] 7 8 @IBOutlet weak var label: UILabel! 9 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14 15     //Labelを生成するFunc 16 func createseat(){ 17 18 var label = UILabel() 19 label.backgroundColor = UIColor.white 20 label.layer.borderWidth = 2 21 labelarray.append(label) 22 23 //カバーの座標とサイズを設定 24 label.frame = CGRect(x: 50*labelarray.count, 25 y: 50*labelarray.count, 26 width: 100, 27 height: 100) 28 29 // "UIPanGestureRecognizer"を生成し、ラベルに登録 30 let panGetsture = UIPanGestureRecognizer(target: self, action: #selector(panAction)) 31 label.addGestureRecognizer(panGetsture) 32 33 // 以下の処理を入れることでタッチ許可する 34 label.isUserInteractionEnabled = true 35 36 //viewにカバーを追加 37 self.view.addSubview(label) 38 39 } 40 41 // ラベルドラッグ時処理 42 @objc func panAction(sender: UIPanGestureRecognizer) { 43 44 45 for n in 0..<labelarray.count{ 46 47 // ラベルをドラッグした量だけ動かす 48                 //ここの(in:...)の引数をどう指定すれば良い変わらず、苦し紛れに配列を使用しました 49 let point: CGPoint = sender.translation(in: labelarray[n] ) 50 let movedPoint = CGPoint(x:labelarray[n].center.x + point.x, y:labelarray[n].center.y + point.y) 51 labelarray[n].center = movedPoint 52 53 // ドラッグで移動した距離をリセット 54 sender.setTranslation(CGPoint.zero, in: labelarray[n]) 55 56 } 57 } 58 59 60 61 //ボタンを押してラベルを生成 62 @IBAction func setseat(_ sender: Any) { 63 64 createseat() 65 66 } 67 68 69 } 70

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

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

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

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

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

guest

回答1

0

ベストアンサー

前回に続き回答失礼します。
「panAction」メソッドの内容を以下の様に修正したら、個別にドラッグ出来ませんでしょうか。
コードのコメントにも記載しましたが、引数の"sender"にViewが含まれているので、そのViewに対して移動処理を行えばドラッグが可能になるかと思います。

※ドラッグ用のメソッド内以外の処理に関しては、何か修正あれば適宜変更をお願いいたします。
(ドラッグ時に配列を使わなくしたので、配列の定義を削除するなどあれば)

Swift

1@objc func panAction(sender: UIPanGestureRecognizer) { 2 3 // ※引数の"sender"に、viewが含まれている。 4 // そのため"sender.view"と記載することで、UIPanGestureRecognizerを付与したView(Label)が取得できるはず。 5 let point: CGPoint = sender.translation(in: sender.view ) 6 let movedPoint = CGPoint(x:sender.view!.center.x + point.x, y:sender.view!.center.y + point.y) 7 sender.view?.center = movedPoint 8 9 // ドラッグで移動した距離をリセット 10 sender.setTranslation(CGPoint.zero, in: sender.view) 11}

↓実行結果
実行結果

投稿2020/08/07 01:25

編集2020/08/07 01:50
tsuki01

総合スコア1751

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

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

Dave

2020/08/07 03:12

前回に続きありがとうございます! sender: UIPanGestureRecognizerで、送られてくるのがUIPanGestureRecongnizeということで完全に「???」と思っていたのですが、UIPanGestureRecongnizeが付与されたviewのことなんですね! 大変勉強になります。これでまた一歩前に進めました。 本当にありがとうございます。 また何かあれば、良ければ宜しくお願い致します!
tsuki01

2020/08/07 08:57

ご確認ありがとうございました。 少し語弊があったかもしれないので、念の為"sender"に関して補足させてください。 ・「panAction(sender: UIPanGestureRecognizer)」の引数でくる"sender"は、UIPanGestureRecognizerのインスタンス ・UIPanGestureRecognizerがプロパティとして、"GestureRecognizerがアタッチされているView"を保持している ※継承元であるUIGestureRecognizerのドキュメントを見ると、上記に関連した記載が載っていました。 https://developer.apple.com/documentation/uikit/uigesturerecognizer 以上となります。もしお時間あればご確認ください(もともと上記の認識であったら申し訳ありません)
Dave

2020/08/08 05:13

わざわざ補足頂きありがとうございます。 完全に理解がずれていましたので、大変助かりました。 引き続き宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問