используйте тег для объединения методов @objc func - PullRequest
0 голосов
/ 11 ноября 2019

Мой код объявляет 2 разных метода @objc func, использующих UIPan жестRecongnizzer. Я думаю, что есть способ использовать только один метод objc func, используя тег. В настоящее время все функции - это перемещение изображения. Я не знаю, является ли тег наилучшим способом, и я открыт для других решений, я просто хочу 1 функцию. В частности, посмотрите на pgGestureMethod и sgGestureMethod.

   var pg = UIImageView()
var pgGesture = UIPanGestureRecognizer()
var pgCon = [NSLayoutConstraint]()

var sg = UIImageView()
var sgGesture = UIPanGestureRecognizer()
var sgCon = [NSLayoutConstraint]()

    override func viewDidLoad() {
    super.viewDidLoad()
  [pg,sg].forEach({
        $0.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview($0)
        $0.isUserInteractionEnabled = true

    })
    pgGesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.pgGestureMethod(_:)))
    pg.addGestureRecognizer(pgGesture)


    sgGesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.sgGestureMethod(_:)))
    sg.addGestureRecognizer(sgGesture)

}

    @objc func pgGestureMethod(_ sender: UIPanGestureRecognizer){

    self.view.bringSubviewToFront(pg)
    let tranistioon = sender.translation(in: self.view)
    pg.center = CGPoint(x: pg.center.x + tranistioon.x, y: pg.center.y + tranistioon.y)
    sender.setTranslation(CGPoint.zero,in: self.view)


}
@objc func sgGestureMethod(_ sender: UIPanGestureRecognizer){

    let tranistioon = sender.translation(in: self.view)
    sg.center = CGPoint(x: sg.center.x + tranistioon.x, y: sg.center.y + tranistioon.y)
    sender.setTranslation(CGPoint.zero,in: self.view)


}

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Распознаватели жестов имеют свойство view, которое относится к представлению, к которому они добавлены, поэтому вам даже не нужен тег!

Просто используйте один метод одного действиякак это:

@objc func pgGestureMethod(_ sender: UIPanGestureRecognizer){
    // I replaced every "pg" with "sender.view!"
    self.view.bringSubviewToFront(sender.view!)
    let tranistioon = sender.translation(in: self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + tranistioon.x, y: sender.view!.center.y + tranistioon.y)
    sender.setTranslation(CGPoint.zero,in: self.view)
}

Если не писать self.view.bringSubviewToFront(sg) на самом деле намеренно, вы можете просто проверить sender.view!:

@objc func pgGestureMethod(_ sender: UIPanGestureRecognizer){
    if sender.view == pg {
        self.view.bringSubviewToFront(pg)
    }
    let tranistioon = sender.translation(in: self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + tranistioon.x, y: sender.view!.center.y + tranistioon.y)
    sender.setTranslation(CGPoint.zero,in: self.view)
}
0 голосов
/ 11 ноября 2019

добро пожаловать в Stackoverflow.

Итак, в вашем случае вы можете понять, какой жест был вызван из параметра в функции жеста.

class SomeViewController: UIViewController {
  var pg = UIImageView()
  var pgGesture = UIPanGestureRecognizer()
  var pgCon = [NSLayoutConstraint]()

  var sg = UIImageView()
  var sgGesture = UIPanGestureRecognizer()
  var sgCon = [NSLayoutConstraint]()

  override func viewDidLoad() {
    super.viewDidLoad()

    [pg,sg].forEach {[unowned self] in
      $0.translatesAutoresizingMaskIntoConstraints = false
      self.view.addSubview($0)
      $0.isUserInteractionEnabled = true
    }

    pgGesture = UIPanGestureRecognizer(target: self, action: #selector(gestureDidRecognize(_:)))
    pg.addGestureRecognizer(pgGesture)

    sgGesture = UIPanGestureRecognizer(target: self, action: #selector(gestureDidRecognize(_:)))
    sg.addGestureRecognizer(sgGesture)
  }
}

@objc private extension SomeViewController {
  func gestureDidRecognize(_ gesture: UIPanGestureRecognizer){
    guard let gestureView = gesture.view else { return }

    let transition = gesture.translation(in: view)

    switch gesture {
      case pgGesture:
        view.bringSubviewToFront(pg)

      default: break
    }

    gestureView.center = CGPoint(
      x: gestureView.center.x + transition.x, 
      y: gestureView.center.y + transition.y)

    gesture.setTranslation(.zero, in: view)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...