Ios SWIFT:检测当前视图外的触摸
这是一个相对简单的问题。我有一个tableViewController,它在用户按下按钮后出现,但它没有覆盖整个屏幕,使以前的一些视图控制器可见。当touchLocation.x属性(触摸的CGPoint位置的x坐标)超过某个点时,我试图使用touchSended关闭tableViewController。问题是,当触摸超过x点时(在tableViewController之外),touchesEnded实际上不会接收任何内容或被调用,因为它在视图之外,所以不会调用我的Disclose函数。是否有人知道如何检测当前视图之外的触摸,以便当前视图之外的任何触摸都会取消所述当前视图?谢谢您需要在桌子视图后面有一个清晰的视图,覆盖屏幕,可以检测桌子视图之外的点击 似乎很难掌握如何做到这一点的一般概念,因此这里是基本原则的简单演示。这是一个完整的项目;只需将其全部复制并粘贴到一个全新的香草项目的视图控制器中:Ios SWIFT:检测当前视图外的触摸,ios,swift,xcode,uitableview,uitouch,Ios,Swift,Xcode,Uitableview,Uitouch,这是一个相对简单的问题。我有一个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?您需要它是另一个视图控制器的子视图。或者使用普通视图控制器,而不是表视图控制器。