代码之家  ›  专栏  ›  技术社区  ›  casperson

如何指定同一类型的uiGestureRecognizer的优先级?

  •  0
  • casperson  · 技术社区  · 6 年前

    我有一个基本的 UIView 与另一 UIVIEW 嵌套在里面。想象一个盒子里面有一个小盒子。甚至可能是 UIImageView 里面。只是某种类型的视图。这两个视图中的每一个都需要 UITapGestureRecognizer .当我在内部视图外的任何位置点击时,我执行一个操作。当我点击内部视图时,我想做一个不同的动作。

    示例:我有一个外部容器视图和一个内部容器视图 UIIVIEVIEW . 如果我轻击内部视图之外的外部视图,那么我将进入下一个屏幕。如果我点击内部图像视图,那么它会在弹出窗口中将图像显示为更大的版本。

    我很难确定优先顺序。我知道有重叠的 UITapGestureRecognizers 内部视图的位置,但我想指定内部视图识别器始终优先于外部视图。

    Apple指定如何区分位于 https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers/preferring_one_gesture_over_another 但这并不表示使用相同的两个手势识别器和相同的委托。这是如何实现的?也许我没有正确理解这些文件。

    我将手势识别器附加到代码中的视图,当我将手势识别器添加到不同的视图、将外部视图识别器添加到内部视图识别器之前以及相反时,我尝试交换。但是,它仍然每次只注册外部视图tap手势识别器。

    下面是一些代码。我在Interface Builder中创建了视图,并将其输出到特定视图中。 campaignContentView 是父视图,并且 pictureImageView linkDetailsView 是子视图。有时我只是展示一张应该做一件事的图片。其他时候,我有一个与缩略图相关联的链接,点击其中任何一个都应该做另一件事。

    @IBOutlet weak var campaignContentView: UIView!
    @IBOutlet weak var pictureImageView: UIImageView!
    @IBOutlet weak var linkDetailsView: UIView!
    
    private func addNewGestureRecognizer(_ view: UIView) {
            let tapView = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedView(_:)))
            campaignContentView.addGestureRecognizer(tapView)
    
            switch view {
            case linkDetailsView:
                let tapLinkDetails = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
                let tapLinkPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedLink(_:)))
                view.addGestureRecognizer(tapLinkDetails)
                pictureImageView.addGestureRecognizer(tapLinkPicture)
            case pictureImageView:
                let tapPicture = UITapGestureRecognizer(target: self, action: #selector(CampaignActionContentView.tappedPicture(_:)))
                view.addGestureRecognizer(tapPicture)
            default:
                print("No new gesture necessary")
            }
        }
    

    我也在打电话 bringSubviewToFront(pictureImageView) bringSubviewToFront(linkDetailsView) 因此。事实证明,手势识别器 链接详图 实际上工作正常,只是不是 图片图像视图

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mocha    6 年前

    这不回答如何指定优先级,但我可以解决 你的 问题。我认为你不需要使用手势优先权,除非一个视图有两个附加的手势。在您的例子中,您有两个具有自己姿态的视图。

    我认为你真正的问题是你的内在观点不在你的外在观点之上。我建议查看视图层次结构调试器。我在一个视图中创建了一个视图,并能够确定自己的点击手势。

    我在操场上做了一个简单的两个动作盒…

    import UIKit
    import PlaygroundSupport
    
    class MyViewController : UIViewController {
        override func loadView() {
            let view = UIView()
            view.backgroundColor = .white
    
            let innerView = UIView()
            innerView.backgroundColor = UIColor.red
    
            view.addSubview(innerView)
            innerView.translatesAutoresizingMaskIntoConstraints = false
            innerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
            innerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            innerView.widthAnchor.constraint(equalToConstant: 100).isActive = true
            innerView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    
            self.view = view
    
            let outTapGesture = UITapGestureRecognizer(target: self, action: #selector(outterViewTapped))
            let innerTapGesture = UITapGestureRecognizer(target: self, action: #selector(innerViewTapped))
    
            view.addGestureRecognizer(outTapGesture)
            innerView.addGestureRecognizer(innerTapGesture)
        }
    
         @objc func outterViewTapped() {
           print("Outter tapped!")
         }
    
         @objc func innerViewTapped() {
           print("Inner tapped!")
         }
    }
    // Present the view controller in the Live View window
    PlaygroundPage.current.liveView = MyViewController()