【问题标题】:use tag to combine @objc func methods使用标签组合@objc func方法
【发布时间】:2019-11-11 20:48:48
【问题描述】:

我的代码使用 UIPan gestureRecongnizzer 声明了 2 个不同的 @objc func 方法。我认为有一种方法可以使用标签仅使用 1 个 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)


}

【问题讨论】:

  • 你为什么不把sg也移到前面呢?这是故意的吗?

标签: swift tags uipangesturerecognizer func


【解决方案1】:

手势识别器有一个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)
}

【讨论】:

  • 他只在pgGestureMethod的情况下输入self.view.bringSubviewToFront(pg)
  • @dimpiax 我认为这只是一个错字。我不明白为什么 onlypg 移到前面有什么用处。我想我们应该让 OP 澄清一下。
  • 演示复杂方法的意义,可能新手会发现区分手势以在一个功能中具有特定操作很有用。
  • @dimpiax 好吧,无论如何处理起来都很简单。查看编辑。
【解决方案2】:

欢迎来到 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)
  }
}

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 2021-02-10
    • 2014-07-31
    • 1970-01-01
    • 2011-07-25
    • 2010-12-22
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多