Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SWIFT:检测当前视图外的触摸_Ios_Swift_Xcode_Uitableview_Uitouch - Fatal编程技术网

Ios SWIFT:检测当前视图外的触摸

Ios SWIFT:检测当前视图外的触摸,ios,swift,xcode,uitableview,uitouch,Ios,Swift,Xcode,Uitableview,Uitouch,这是一个相对简单的问题。我有一个tableViewController,它在用户按下按钮后出现,但它没有覆盖整个屏幕,使以前的一些视图控制器可见。当touchLocation.x属性(触摸的CGPoint位置的x坐标)超过某个点时,我试图使用touchSended关闭tableViewController。问题是,当触摸超过x点时(在tableViewController之外),touchesEnded实际上不会接收任何内容或被调用,因为它在视图之外,所以不会调用我的Disclose函数。是否有

这是一个相对简单的问题。我有一个tableViewController,它在用户按下按钮后出现,但它没有覆盖整个屏幕,使以前的一些视图控制器可见。当touchLocation.x属性(触摸的CGPoint位置的x坐标)超过某个点时,我试图使用touchSended关闭tableViewController。问题是,当触摸超过x点时(在tableViewController之外),touchesEnded实际上不会接收任何内容或被调用,因为它在视图之外,所以不会调用我的Disclose函数。是否有人知道如何检测当前视图之外的触摸,以便当前视图之外的任何触摸都会取消所述当前视图?谢谢

您需要在桌子视图后面有一个清晰的视图,覆盖屏幕,可以检测桌子视图之外的点击

似乎很难掌握如何做到这一点的一般概念,因此这里是基本原则的简单演示。这是一个完整的项目;只需将其全部复制并粘贴到一个全新的香草项目的视图控制器中:

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会检测到该点击,它是我们的表视图控制器的替代品。但是如果你在屏幕外点击,整个事情就会被忽略(这是你目标的另一部分)。

用背景色清晰的视图覆盖整个屏幕,这样就有东西可以接收触摸。问题是,我使用自定义幻灯片过渡,将vc的宽度设置为正常宽度的0.7,那么,我添加到tableViewController中的任何清晰视图不也是0.7宽度的一部分吗?另外,当你在tableview中添加一个视图时,它会把它变成一个单元格,我不知道这有什么关系。表格视图的宽度可以是正常宽度的0.7,但周围仍然有一个不可见的视图来拾取触摸。如何将表格视图控制器中的表格视图设置为整个视图的0.7?您需要它是另一个视图控制器的子视图。或者使用普通视图控制器,而不是表视图控制器。