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

如何解决SWIFT:在当前视图之外检测触摸

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

解决方法

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

掌握如何执行此操作的一般概念似乎有些困难,因此这里是基本原理的简单演示。这是一个 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会检测到该点击,这是我们替代表视图控制器的方法。但是,如果您在外部轻按,则整个对象将被忽略(这是目标的另一部分)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?