如何在Swift4上解雇UIView

问题描述 投票:1回答:2

我每次在另一个视图中按下按钮时都会显示UIView

@IBOutlet weak var view1: UIView!
@IBOutlet weak var view2: UIView! 

@IBAction func showView(_ sender: Any) {
    view2.isHidden = false
}

我想要的是添加一个轻击手势,允许我每次点击视图外都隐藏view2,并且由于这些视图是可拖动的,我希望第二个视图在隐藏时不能被点击(这样如果我在我的下面触摸我不会冒险移动它。这就是我试过的:

  1. var gesture : UITapGestureRecognizer? override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(closeView), name: NSNotification.Name("CloseView"), object: nil) gesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.closeView)) } @objc func closeView() { if view2.isHidden == false { view2.isUserInteractionEnabled = true view2.isHidden = false self.view.removeGestureRecognizer(gesture!) } else { view2.isHidden = true view2.isUserInteractionEnabled = true self.view.addGestureRecognizer(gesture!) } }
  2. let closeTapGesture = UITapGestureRecognizer(target: view, action: #selector(getter: view2.isHidden) view.addGestureRecognizer(closeTapGesture)

这项工作都没有,我该怎么办?

ios swift uiview uikit uigesturerecognizer
2个回答
1
投票

你需要检查你是否真的在view2之外点击:

    var gesture : UITapGestureRecognizer?

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(closeView), name: NSNotification.Name("CloseView"), object: nil)


        let gesture = UITapGestureRecognizer(target: self, action: #selector(closeView(_:)))
        view.addGestureRecognizer(gesture)
        self.gesture = gesture
    }

    @objc private func closeView(_ tapGestureRecognizer: UITapGestureRecognizer) {
        let location = tapGestureRecognizer.location(in: view2)
        guard view2.isHidden == false,
              !view2.bounds.contains(location) else {  //We need to have tapped outside of view 2
            return
        }
        view2.isHidden = true
    }

1
投票

您的点击手势应该只处理closeView。

@objc func closeView() {
        view2.isHidden = true
        view2.isUserInteractionEnabled = false
        gesture?.isEnabled = false
    }

然后单击按钮以显示您的view2应该调用它。

func  showView() {
    view2.isHidden = false
    view2.isUserInteractionEnabled = true
    gesture?.isEnabled = true
}
© www.soinside.com 2019 - 2024. All rights reserved.