UITap 手势未被识别
UITap Gesture Not being recognized
我有一个带有按钮的视图控制器,该按钮具有以下操作。
@IBAction func sourceButton(_ sender: Any) {
let menu = sourceMenu()
menu.openMenu()
}
源菜单 class 是一个具有以下代码的 NSObject class。
class sourceMenu: NSObject {
let blackView = UIView()
public func openMenu(){
if let window = UIApplication.shared.windows.filter({ [=11=].isKeyWindow }).first {
blackView.frame = window.frame
blackView.backgroundColor = UIColor(white: 0, alpha: 0.5)
blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissMenu)))
window.addSubview(blackView)
UIView.animate(withDuration: 0.5) {
self.blackView.alpha = 1
}
}
}
@objc public func dismissMenu(){
UIView.animate(withDuration: 0.5) {
self.blackView.alpha = 0
}
}
}
当我点击视图控制器时,函数 dismissMenu 没有被调用。有任何想法吗?
谢谢。
这个问题我遇到过一次。我为自己找到的解决方案是强烈引用 UITapGestureRecognizer
。所以你应该做的是:
// Define a gesture variable in class
class sourceMenu: NSObject {
var gestureRecognizer: UITapGestureRecognizer
}
// Use the variable in `openMenu` function
gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissMenu))
blackView.addGestureRecognizer(gestureRecognizer)
}
希望对您有所帮助。
问题实际上是您的对象正在从内存中释放,因为它只存在于您的功能块中。一旦函数完成执行,您的内存就会被清除。您需要在呈现 UIViewController
中创建一个实例,以便 arc
使其保持活动状态,因为视图控制器将引用它。你应该像这样声明一个 属性。
class ViewController: UIViewController {
let menu = sourceMenu()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func tapAction(_ sender: Any) {
menu.openMenu()
}
}
您也可以通过简单地执行 UIApplication.shared.keyWindow
来获取对 keyWindow 的引用
此外,您在 window 上显示此内容而不是使用视图控制器的原因是什么?如果这是每个控制器都应该能够呈现的内容,为什么不进行扩展呢?我会避免展示 window 的观点,因为它可能会导致隐藏的问题。
我有一个带有按钮的视图控制器,该按钮具有以下操作。
@IBAction func sourceButton(_ sender: Any) {
let menu = sourceMenu()
menu.openMenu()
}
源菜单 class 是一个具有以下代码的 NSObject class。
class sourceMenu: NSObject {
let blackView = UIView()
public func openMenu(){
if let window = UIApplication.shared.windows.filter({ [=11=].isKeyWindow }).first {
blackView.frame = window.frame
blackView.backgroundColor = UIColor(white: 0, alpha: 0.5)
blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.dismissMenu)))
window.addSubview(blackView)
UIView.animate(withDuration: 0.5) {
self.blackView.alpha = 1
}
}
}
@objc public func dismissMenu(){
UIView.animate(withDuration: 0.5) {
self.blackView.alpha = 0
}
}
}
当我点击视图控制器时,函数 dismissMenu 没有被调用。有任何想法吗? 谢谢。
这个问题我遇到过一次。我为自己找到的解决方案是强烈引用 UITapGestureRecognizer
。所以你应该做的是:
// Define a gesture variable in class
class sourceMenu: NSObject {
var gestureRecognizer: UITapGestureRecognizer
}
// Use the variable in `openMenu` function
gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissMenu))
blackView.addGestureRecognizer(gestureRecognizer)
}
希望对您有所帮助。
问题实际上是您的对象正在从内存中释放,因为它只存在于您的功能块中。一旦函数完成执行,您的内存就会被清除。您需要在呈现 UIViewController
中创建一个实例,以便 arc
使其保持活动状态,因为视图控制器将引用它。你应该像这样声明一个 属性。
class ViewController: UIViewController {
let menu = sourceMenu()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func tapAction(_ sender: Any) {
menu.openMenu()
}
}
您也可以通过简单地执行 UIApplication.shared.keyWindow
此外,您在 window 上显示此内容而不是使用视图控制器的原因是什么?如果这是每个控制器都应该能够呈现的内容,为什么不进行扩展呢?我会避免展示 window 的观点,因为它可能会导致隐藏的问题。