SWIFT:在当前视图之外检测触摸

时间:2020-09-12 20:28:52

标签: ios swift xcode uitableview uitouch

这是一个相对简单的问题。我有一个tableViewController,它在用户按下按钮后出现,但是它不能覆盖整个屏幕,因此可以看到一些以前的视图控制器。当touchLocation.x属性(触摸CGPoint位置的x坐标)超过某个点时,我试图使用touchesEnded消除tableViewController。问题是,当触摸超过x点(在tableViewController外部)时,touchesEnded实际上不会接收任何东西或被调用,因为它在视图外部,因此不会调用dismiss函数。有谁知道如何检测当前视图之外的触摸,从而使当前视图之外的任何触摸都可以消除当前视图?谢谢

1 个答案:

答案 0 :(得分:1)

您需要在表格视图后方有一个清晰的视图,并覆盖整个屏幕,以检测表格视图之外的点击。

掌握如何执行此操作的一般概念似乎有些困难,因此这里是基本原理的简单演示。这是一个 complete 项目;只需复制所有内容并将其粘贴到新的香草项目的视图控制器中即可:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .yellow
        let b = UIButton(type: .system)
        b.setTitle("Present", for: .normal)
        b.sizeToFit()
        b.addTarget(self, action: #selector(tap), for: .touchUpInside)
        b.frame.origin = CGPoint(x: 100, y: 100)
        self.view.addSubview(b)
    }
    @objc func tap() {
        self.present(VC2(), animated: true)
    }
}

class VC2: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
        self.modalPresentationStyle = .overFullScreen
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        self.view.backgroundColor = .clear
        let tgr = UITapGestureRecognizer(target: self, action: #selector(tap))
        self.view.addGestureRecognizer(tgr)
        let child = VC3()
        self.addChild(child)
        self.view.addSubview(child.view)
        child.didMove(toParent: self)
        child.view.frame.size.width = 0.7*self.view.bounds.width
        child.view.frame.size.height = 0.7*self.view.bounds.height
        child.view.center = CGPoint(x:self.view.bounds.midX, y:self.view.bounds.midY)
        child.view.autoresizingMask = [.flexibleTopMargin, .flexibleBottomMargin, .flexibleLeftMargin, .flexibleRightMargin]
    }
    @objc func tap() {
        print("farewell")
        self.dismiss(animated: true)
    }
}

class VC3: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
    }
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    override func viewDidLoad() {
        self.view.backgroundColor = .green
        let tgr = UITapGestureRecognizer(target: self, action: #selector(tap))
        self.view.addGestureRecognizer(tgr)
    }
    @objc func tap() {
        print("ouch, stop that")
    }
}

运行项目,您将看到带有“当前”按钮的黄色视图;点击礼物按钮。屏幕中央会出现一个绿色视图。请注意,黄色视图在其后仍然可见(这是目标的一部分)。假设那是表格视图。如果您点击它,则VC3会检测到该点击,这是我们替代表视图控制器的方法。但是,如果您在外部轻按,则整个对象将被忽略(这是目标的另一部分)。

相关问题