2017-07-29 83 views
1

因此,我发现如何使用UIPanGestureRecognizer使按钮可拖动。但我知道如何做到这一点的唯一方法是通过在中心存储和拖动按钮。与此相关的问题是,如果您尝试从角落拖动按钮,按钮会立即从角落移至中心。我正在寻找的是一种解决方案,可以让我的手指保持在选定的位置,同时移动时不会立即锁定到中心。拖动UIButton而不将它移动到中心位置[Swift 3]

我目前使用的代码:

func buttonDrag(pan: UIPanGestureRecognizer) { 
    print("Being Dragged") 
    if pan.state == .began { 
     print("panIF") 
     buttonCenter = button.center // store old button center 
    }else { 
     print("panELSE") 
     let location = pan.location(in: view) // get pan location 
     button.center = location // set button to where finger is 
    } 
} 

在此先感谢。

回答

1

这可以通过两种不同的方式来至少做,一个使用GestureRecognizer你的问题的方式等方式继承了UIView贯彻touchesBegantouchesMovedtouchesEndedtouchesCancelled一般适用于任何UIView子类的工作可以UIButtonUILabelUIImageView等等

在用自己的方式,用GestureRecognizer我做一些改变,你仍然需要一个变种,以保持触摸的起源CGPointUIButton所以我们得到的触摸位置相对ative到的UIButton和当拖动继续根据原点触摸位置调整的UIButton原点和运动

方法的位置1 GestureRecognizer在这种情况下

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var button: UIButton! 
    var buttonOrigin : CGPoint = CGPoint(x: 0, y: 0) 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let gesture = UIPanGestureRecognizer(target: self, action: #selector(buttonDrag(pan:))) 
     self.button.addGestureRecognizer(gesture) 
    } 

    func buttonDrag(pan: UIPanGestureRecognizer) { 
     print("Being Dragged") 
     if pan.state == .began { 
      print("panIF") 
      buttonOrigin = pan.location(in: button) 
     }else { 
      print("panELSE") 
      let location = pan.location(in: view) // get pan location 
      button.frame.origin = CGPoint(x: location.x - buttonOrigin.x, y: location.y - buttonOrigin.y) 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

方法2 UIView子类的UIButton子类

使用此UIButton

import UIKit 

class DraggableButton: UIButton { 

    var localTouchPosition : CGPoint? 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesBegan(touches, with: event) 
     let touch = touches.first 
     self.localTouchPosition = touch?.preciseLocation(in: self) 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    super.touchesMoved(touches, with: event) 
    let touch = touches.first 
    guard let location = touch?.location(in: self.superview), let localTouchPosition = self.localTouchPosition else{ 
     return 
    } 

    self.frame.origin = CGPoint(x: location.x - localTouchPosition.x, y: location.y - localTouchPosition.y) 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesEnded(touches, with: event) 
     self.localTouchPosition = nil 
    } 

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
     super.touchesCancelled(touches, with: event) 
     self.localTouchPosition = nil 
    } 

} 

结果

enter image description here

enter image description here

希望这有助于你

相关问题