回答編集履歴

2 修正

_Kentarou

_Kentarou score 8383

2016/04/22 01:03  投稿

> ボタンをタップしたらUIViewを出して
ボタンをスワイプしたらそのボタンが指に沿って移動する・・・
要件を満たしているか分かりませんが、ここからアレンジすればやりたい事ができるようになると思います。
下記のコードをViewControllerにそのまま貼り付けると動くと思います。
ボタンを押すと左に赤いViewがaddされます、そしてUIButtonはドラッグで移動できます。
ボタン1とボタン2がありそれぞれ押すと左に黄色、緑色のViewがaddされます、そしてUIButtonはドラッグで移動できます。
```swift
import UIKit
class ViewController: UIViewController {
   
   var viewCount: CGFloat = 0
   let button = CustomButton(type: .Custom)
   
   let button1 = CustomButton(type: .Custom)
   let button2 = CustomButton(type: .Custom)
   
   override func viewDidLoad() {
       super.viewDidLoad()
       
       // ボタンを生成
       button.frame = CGRectMake(100, 100, 200, 50)
       button.setTitle("Button", forState: .Normal)
       button.setTitleColor(UIColor.blueColor(), forState: .Normal)
       button.backgroundColor = UIColor.yellowColor()
       button.addTarget(self, action: #selector(ViewController.buttonPressed(_:)), forControlEvents: .TouchUpInside)
       button.userInteractionEnabled = true
       button.tag = 999
       button.vc = self
       view.addSubview(button)
       // ボタン1を生成
       button1.frame = CGRectMake(100, 100, 200, 50)
       button1.setTitle("Button1", forState: .Normal)
       button1.setTitleColor(UIColor.blueColor(), forState: .Normal)
       button1.backgroundColor = UIColor.yellowColor()
       button1.addTarget(self, action: #selector(ViewController.buttonPressed(_:)), forControlEvents: .TouchUpInside)
       button1.userInteractionEnabled = true
       button1.tag = 1
       view.addSubview(button1)
       
       // ボタン2を生成
       button2.frame = CGRectMake(100, 200, 200, 50)
       button2.setTitle("Button2", forState: .Normal)
       button2.setTitleColor(UIColor.blueColor(), forState: .Normal)
       button2.backgroundColor = UIColor.greenColor()
       button2.addTarget(self, action: #selector(ViewController.buttonPressed(_:)), forControlEvents: .TouchUpInside)
       button2.userInteractionEnabled = true
       button2.tag = 2
       view.addSubview(button2)
   }
   
   func buttonPressed(sender: UIButton) {
       if !button1.isMoveing && sender.tag == 1 {  
           // ボタン1押下時のイベント  
           generateLabel("1", color: UIColor.yellowColor())  
       }  
       
       if !button.isMoveing {
           // 赤いViewを画面に追加
           let v = UIView(frame: CGRectMake(10, 10 + viewCount * 40 , 30, 30))
           v.backgroundColor = UIColor.redColor()
           view.addSubview(v)
           viewCount += 1
       if !button2.isMoveing && sender.tag == 2 {
           // ボタン2押下時のイベント
           generateLabel("2", color: UIColor.greenColor())
       }
   }
   
   func generateLabel(text: String, color: UIColor) {  
       let v = UILabel(frame: CGRectMake(10, 10 + viewCount * 40 , 30, 30))  
       v.text = text  
       v.textAlignment = .Center  
       v.backgroundColor = color  
       view.addSubview(v)  
       viewCount += 1  
   }  
}  
 
 
// CustomButton Class  
class CustomButton: UIButton {  
     
   var isMoveing: Bool = false  
   var position: CGPoint!  
     
   override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {  
       super.touchesBegan(touches, withEvent: event)  
       position = self.frame.origin  
   }  
   
   override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
       super.touchesMoved(touches, withEvent: event)  
       
       // タッチイベントを取得
       isMoveing = true
       
       let touchEvent = touches.first!
       let tag = touchEvent.view?.tag  
       
       if tag == 999 {  
           moveView(touchEvent, vi: button)  
       }  
   }  
     
     
   func moveView<T: UIView>(touchEvent: UITouch, vi: T) {  
       // ドラッグ前の座標
       let preDx = touchEvent.previousLocationInView(self.view).x
       let preDy = touchEvent.previousLocationInView(self.view).y
       let preDx = touchEvent.previousLocationInView(superview).x
       let preDy = touchEvent.previousLocationInView(superview).y
       
       // ドラッグ後の座標
       let newDx = touchEvent.locationInView(self.view).x
       let newDy = touchEvent.locationInView(self.view).y
       let newDx = touchEvent.locationInView(superview).x
       let newDy = touchEvent.locationInView(superview).y
       
       // ドラッグしたx座標の移動距離
       let dx = newDx - preDx
       
       // ドラッグしたy座標の移動距離
       let dy = newDy - preDy
       
       // 画像のフレーム
       var viewFrame: CGRect = vi.frame
       var viewFrame: CGRect = self.frame
       
       // 移動分を反映させる
       viewFrame.origin.x += dx
       viewFrame.origin.y += dy
       vi.frame = viewFrame
   }
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       
   }
}
// CustomButton Class
class CustomButton: UIButton {
   
   var vc: UIViewController!
   var isMoveing: Bool = false
   
   override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
       super.touchesMoved(touches, withEvent: event)
       isMoveing = true
       vc.touchesMoved(touches, withEvent: event)
       self.frame = viewFrame
   }
   
   override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
       super.touchesEnded(touches, withEvent: event)
       isMoveing = false
       vc.touchesEnded(touches, withEvent: event)
       if position == self.frame.origin {
           self.sendActionsForControlEvents(.TouchUpInside)
       }
   }
}
```
![image](0c3411f1a8e4f5a745bc6ea65aa36490.png)
![image](16bb305b1d24dbac219aaf207bee24e2.png)
1 追記

_Kentarou

_Kentarou score 8383

2016/04/03 23:58  投稿

> ボタンをタップしたらUIViewを出して
ボタンをスワイプしたらそのボタンが指に沿って移動する・・・
要件を満たしているか分かりませんが、ここからアレンジすればやりたい事ができるようになると思います。
下記のコードをViewControllerにそのまま貼り付けると動くと思います。
 
ボタンを押すと左に赤いViewがaddされます、そしてUIButtonはドラッグで移動できます。  
```swift
import UIKit
class ViewController: UIViewController {
   
   var viewCount: CGFloat = 0
   let button = CustomButton(type: .Custom)
   override func viewDidLoad() {
       super.viewDidLoad()
       
       // ボタンを生成
       button.frame = CGRectMake(100, 100, 200, 50)
       button.setTitle("Button", forState: .Normal)
       button.setTitleColor(UIColor.blueColor(), forState: .Normal)
       button.backgroundColor = UIColor.yellowColor()
       button.addTarget(self, action: #selector(ViewController.buttonPressed(_:)), forControlEvents: .TouchUpInside)
       button.userInteractionEnabled = true
       button.tag = 999
       button.vc = self
       view.addSubview(button)
   }
   
   func buttonPressed(sender: UIButton) {
       
       if !button.isMoveing {
           // 赤いViewを画面に追加
           let v = UIView(frame: CGRectMake(10, 10 + viewCount * 40 , 30, 30))
           v.backgroundColor = UIColor.redColor()
           view.addSubview(v)
           viewCount += 1
       }
   }
   
   
   override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
       
       // タッチイベントを取得
       let touchEvent = touches.first!
       let tag = touchEvent.view?.tag
       
       if tag == 999 {
           moveView(touchEvent, vi: button)
       }
   }
   
   
   func moveView<T: UIView>(touchEvent: UITouch, vi: T) {
       // ドラッグ前の座標
       let preDx = touchEvent.previousLocationInView(self.view).x
       let preDy = touchEvent.previousLocationInView(self.view).y
       
       // ドラッグ後の座標
       let newDx = touchEvent.locationInView(self.view).x
       let newDy = touchEvent.locationInView(self.view).y
       
       // ドラッグしたx座標の移動距離
       let dx = newDx - preDx
       
       // ドラッグしたy座標の移動距離
       let dy = newDy - preDy
       
       // 画像のフレーム
       var viewFrame: CGRect = vi.frame
       
       // 移動分を反映させる
       viewFrame.origin.x += dx
       viewFrame.origin.y += dy
       vi.frame = viewFrame
   }
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       
   }
}
// CustomButton Class
class CustomButton: UIButton {
   
   var vc: UIViewController!
   var isMoveing: Bool = false
   
   override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
       super.touchesMoved(touches, withEvent: event)
       isMoveing = true
       vc.touchesMoved(touches, withEvent: event)
   }
   
   override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
       super.touchesEnded(touches, withEvent: event)
       isMoveing = false
       vc.touchesEnded(touches, withEvent: event)
   }
}
```
![image](0c3411f1a8e4f5a745bc6ea65aa36490.png)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る