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

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

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

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

Swift

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

Q&A

解決済

1回答

2310閲覧

タッチ→ドラッグ(移動)の処理を各ラベルに対して行いたい(switchや配列を用いて)

TRON1216.

総合スコア37

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/05/24 10:07

編集2018/05/26 14:27

立ち位置のアプリを作ろうとしています。

  • やりたいこと

 計10個あるラベル(番号が書かれた丸)のうち、いずれかのラベルをタッチしてドラッグするとそのラベルが移動するという処理

  • やってみたこと

 各ラベルに.tagをつけて、switchで書いてみた

  • 問題点

 プログラムの実行はできるがラベルが全く(どれも)動かない

間違っているところやご指摘があれば是非教えていただきたいです。よろしくお願いいたします。
なお、コードに関しましては、投稿の文字数の関係からラベルの数を2つにし、タッチ→ドラッグ(移動)の処理の部分だけ載せています。

/* ラベルを作る */ for n in 0...1 { mylabel[n] = UILabel(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) mylabel[n].text = "1" mylabel[n].textAlignment = NSTextAlignment.center //画面長い方の中心に来るように設定違うかも mylabel[n].layer.masksToBounds = true mylabel[n].center = self.view.center //画面の短い方の中心に来るように設定 mylabel[n].layer.cornerRadius = 20.0 switch n { case 0 : mylabel[0].backgroundColor = UIColor.red //mylabel[0].center = self.view.center mylabel[0].tag = 0 //消したいラベルをタグで指定するために必要*/ case 1 : mylabel[1].backgroundColor = UIColor.blue mylabel[1].tag = 1 //消したいラベルをタグで指定するために必要*/ default: break } self.view.addSubview(mylabel[n]) } /* タッチを感知した際に呼ばれるメソッド. */ override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //print("touchesBegan") print("touchesBeganが呼ばれました") // Labelアニメーション. UIView.animate(withDuration: 0.06, // アニメーション中の処理. animations: { () -> Void in func myFunc(sender: UILabel){ switch sender.tag{ case 0: self.mylabel[0].transform = CGAffineTransform(scaleX: 0.9, y: 0.9) case 1: self.mylabel[1].transform = CGAffineTransform(scaleX: 0.9, y: 0.9) default: break } } }) { (Bool) -> Void in } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { print("touchesMovedが呼ばれました") // タッチイベントを取得. let aTouch: UITouch = touches.first! func myFunc(sender: UILabel){ switch sender.tag{ case 0: let location_0 = aTouch.location(in: mylabel[0]/*self.view*/) let prevLocation_0 = aTouch.previousLocation(in: mylabel[0]/*self.view*/) var myFrame_0: CGRect = mylabel[0]/*self.view*/.frame let deltaX_0: CGFloat = location_0.x - prevLocation_0.x let deltaY_0: CGFloat = location_0.y - prevLocation_0.y myFrame_0.origin.x += deltaX_0 myFrame_0.origin.y += deltaY_0 Finallocation1 = myFrame_0.origin.x Finallocation2 = myFrame_0.origin.y mylabel[0]/*self.view*/.frame = myFrame_0 case 1: let location_1 = aTouch.location(in: mylabel[1]/*self.view*/) let prevLocation_1 = aTouch.previousLocation(in: mylabel[1]/*self.view*/) var myFrame_1: CGRect = mylabel[1]/*self.view*/.frame let deltaX_1: CGFloat = location_1.x - prevLocation_1.x let deltaY_1: CGFloat = location_1.y - prevLocation_1.y myFrame_1.origin.x += deltaX_1 myFrame_1.origin.y += deltaY_1 Finallocation1 = myFrame_1.origin.x Finallocation2 = myFrame_1.origin.y mylabel[1]/*self.view*/.frame = myFrame_1 default: break } } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { print("touchesEndedが呼ばれました") // Labelアニメーション. UIView.animate(withDuration: 0.1, // アニメーション中の処理. animations: { () -> Void in func myFunc(sender: UILabel){ switch sender.tag{ case 0: self.mylabel[0].transform = CGAffineTransform(scaleX: 0.4, y: 0.4) self.mylabel[0].transform = CGAffineTransform(scaleX: 1.0, y: 1.0) case 1: self.mylabel[1].transform = CGAffineTransform(scaleX: 0.4, y: 0.4) self.mylabel[1].transform = CGAffineTransform(scaleX: 1.0, y: 1.0) default: break } } }) { (Bool) -> Void in } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

イメージ説明
イメージ説明
以下は、回答者様のご指摘により変更したことを書きました。書き方や各場所がまだ理解できておらず、まだ解決していない状態です。

labelT.isUserInteractionEnabled = true

if let labelT = touches.first?.view as? UILabel { //labelに対してあんなことや、こんなことを‥ }

を用いて各Touchesのメソッドの中身を変えました。

/* タッチを感知した際に呼ばれるメソッド. */ override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { //print("touchesBegan") print("touchesBeganが呼ばれました") // Labelアニメーション. UIView.animate(withDuration: 0.06, // アニメーション中の処理. animations: { () -> Void in if let labelT = touches.first?.view as? UILabel { labelT.isUserInteractionEnabled = true labelT.transform = CGAffineTransform(scaleX: 0.9, y: 0.9) //labelに対してあんなことや、こんなことを‥ } }) { (Bool) -> Void in } } /* ドラッグを感知した際に呼ばれるメソッド. (ドラッグ中何度も呼ばれる) */ override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { print("touchesMovedが呼ばれました") //label.isUserInteractionEnabled = true // タッチイベントを取得. let aTouch: UITouch = touches.first! // 移動した先の座標を取得. if let labelT = touches.first?.view as? UILabel { labelT.isUserInteractionEnabled = true let location = aTouch.location(in: labelT/*self.view*/) let prevLocation = aTouch.previousLocation(in: labelT/*self.view*/) var myFrame: CGRect = labelT/*self.view*/.frame let deltaX: CGFloat = location.x - prevLocation.x let deltaY: CGFloat = location.y - prevLocation.y myFrame.origin.x += deltaX myFrame.origin.y += deltaY Finallocation1 = myFrame.origin.x Finallocation2 = myFrame.origin.y labelT/*self.view*/.frame = myFrame //labelに対してあんなことや、こんなことを‥ } } /* 指が離れたことを感知した際に呼ばれるメソッド. */ override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { print("touchesEndedが呼ばれました") //label.isUserInteractionEnabled = true // Labelアニメーション. UIView.animate(withDuration: 0.1, // アニメーション中の処理. animations: { () -> Void in if let labelT = touches.first?.view as? UILabel { labelT.isUserInteractionEnabled = true labelT.transform = CGAffineTransform(scaleX: 0.4, y: 0.4) labelT.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) //labelに対してあんなことや、こんなことを‥ } }) { (Bool) -> Void in } print("移動先の座標は、x=(Finallocation1)、y=(Finallocation2)です") }

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

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

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

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

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

fuzzball

2018/05/25 00:07

ボタンが一つなら動かせるのでしょうか?
TRON1216.

2018/05/25 06:31

このコード(ラベルを複数作り、switchで分岐)では一つも動かせません。しかし、ラベルを一個だけ作り、移動させるということはできました。
guest

回答1

0

ベストアンサー

とりあえず二点ほど。

#1 UILabelはデフォルトではタッチ無効

swift

1label.isUserInteractionEnabled = true

を追加してください。(一つでは出来ているということですので書き忘れでしょうか?)

#2 タッチしたUILabel

各touches*の中で func myFunc(sender: UILabel){ ~ } と書いていますが、これは関数を定義しているだけで実行されていません。

タッチしたUILabelを取得しようとしているのだと思いますが、タッチしたUILabelはUITouchから取れますので変な小細工は不要です。

swift

1if let label = touches.first?.view as? UILabel { 2 //labelに対してあんなことや、こんなことを‥ 3}

投稿2018/05/25 07:14

編集2018/05/25 07:19
fuzzball

総合スコア16731

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

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

TRON1216.

2018/05/26 14:14

丁寧な回答大変嬉しく思います。やってみたのですが、うまくいきません。#1で指摘している文は各Touchesの中に書いたのですが合ってますでしょうか、、?#2も書いたのですが、うまくいかないので修正したコードを載せます。確認よろしくお願いいたします。
fuzzball

2018/05/26 15:09

ちょっと考えてみて下さい。 「タッチを有効にする処理」をタッチ処理の中に書いて意味があると思いますか?
TRON1216.

2018/05/26 16:20

確かに、、 やってみます!
TRON1216.

2018/05/26 16:33

無事それぞれのラベルを動かすことができました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問