立ち位置のアプリを作ろうとしています。
- やりたいこと
計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)です") }
回答1件
あなたの回答
tips
プレビュー