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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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回答

1035閲覧

ラベルだけに反応し、ラベルだけが動かしたいです

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/05 12:35

MacOS Catalina 10.15.4
Xcode 11.6
Swift version 4

ラベルだけをドラッグして移動させる方法が分かりません。
こちらのサイト等を参考にしたのですが、背景をドラッグすると背景まで動いてしまいます。
また、こちらのサイトを参考に以下のようにしてみたのですが、近い挙動が得られるものの背景をドラッグしてもラベルが動いてしまいます。
欲しい挙動としては、ラベルだけに反応し、ラベルだけが動くということです。
苦し紛れに、ラベルにUITapGestureRecognizerをセットして、、、と考えてみたのですが明らかに間違っており、良い方法がないか悶えております。

大変お手数ですが、どなたかご教示頂けませんでしょうか。
宜しくお願い致します。

Swift4

1import UIKit 2 3 class ViewController: UIViewController{ 4 5 6 var dx : CGFloat = 0 7 var dy : CGFloat = 0 8 9 @IBOutlet weak var label: UILabel! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14 15 // ドラッグ時に呼ばれる 16 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 17 // タッチイベントを取得 18 let touchEvent = touches.first! 19 20 // ドラッグ前の座標, Swift 1.2 から 21 let preDx = touchEvent.previousLocation(in: self.view).x 22 let preDy = touchEvent.previousLocation(in: self.view).y 23 24 // ドラッグ後の座標 25 let newDx = touchEvent.location(in: self.view).x 26 let newDy = touchEvent.location(in: self.view).y 27 28 // ドラッグしたx座標の移動距離 29 dx = newDx - preDx 30 print("x:(dx)") 31 32 // ドラッグしたy座標の移動距離 33 dy = newDy - preDy 34 print("y:(dy)") 35 36 // 移動分を反映させる 37 label.frame.origin.x += dx 38 label.frame.origin.y += dy 39 40} 41 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下参考サイトの様に、「UIPanGestureRecognizer」を利用する方法は如何でしょうか。
質問者様の現在のコードから大分変わってしまいますが、ドラッグを実現できる様になると思います。
※「UITapGestureRecognizer」と「UIPanGestureRecognizer」は似ているのですが、利用方法が異なります。

UIViewをパンジェスチャー(ドラッグ)で移動させる


以下サンプルソース

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 // ラベル定義 6 @IBOutlet weak var label: UILabel! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // "UIPanGestureRecognizer"を生成し、ラベルに登録 12 let panGetsture = UIPanGestureRecognizer(target: self, action: #selector(panAction)) 13 self.label.addGestureRecognizer(panGetsture) 14 15 // 以下の処理を入れることでタッチ許可する 16 self.label.isUserInteractionEnabled = true 17 } 18 19 20 // ラベルドラッグ時処理 21 @objc func panAction(sender: UIPanGestureRecognizer) { 22 print(#function) 23 24 // ラベルをドラッグした量だけ動かす 25 let point: CGPoint = sender.translation(in: self.label ) 26 let movedPoint = CGPoint(x:self.label.center.x + point.x, y:self.label.center.y + point.y) 27 self.label.center = movedPoint 28 29 // ドラッグで移動した距離をリセット 30 sender.setTranslation(CGPoint.zero, in: self.label) 31 } 32}

↓実行結果
ラベルドラッグ

投稿2020/08/05 13:22

tsuki01

総合スコア1751

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

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

Dave

2020/08/06 10:43

早速ご回答ありがとうございます。無事期待通りの挙動をしてくれました。 UIPanGestureRecognizerというのあるのですね、勉強になります。 引き続き精進します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問