【问题标题】:How to dismiss UIView on tap Swift4如何在点击 Swift4 时关闭 UIView
【发布时间】:2019-08-05 11:52:59
【问题描述】:

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

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

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

我想要的是添加一个点击手势,允许我在每次点击视图外部时隐藏 view2,并且由于这些视图是可拖动的,我希望第二个视图在隐藏时不可点击(这样如果我touch 在我看来,我不会冒险移动它。 这是我尝试过的:

  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)
    

这些都不行,怎么办?

【问题讨论】:

  • 确保在代码中某处调用 closeView() 函数。
  • 我在 viewDidLoad 中调用了它我没有把它放在我的代码中对不起,但它不起作用...
  • 我不清楚您想做什么,但是您是否尝试在隐藏视图时将 userInteractionEnabled 设置为 false
  • @Gihan 我希望点击手势在我点击屏幕的任何部分时隐藏视图,另外我希望 UIView 在隐藏时不可点击。是的,我试过了,不行……
  • 但在代码中,您在 else 中将其设置为 true

标签: ios swift uiview uikit uigesturerecognizer


【解决方案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
    }

【讨论】:

    【解决方案2】:

    您的点击手势应该只处理 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
    }
    

    【讨论】:

    • 您是否将手势添加到视图中添加到视图中并加载
    • 我不必将其添加到 view2,我希望在我点击视图中的任意位置(view2 和 view1 除外)后隐藏且无法控制视图...
    • 对不起,我不知道我说得够不够清楚,我不是英文
    • self.view.addGestureRecognizer(gesture!) in viewDidLoad
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多