通过将自己添加到keyWindow,我创建了一个用作黑色叠加层的视图。 它按预期显示,但未触发敲击手势。
class Menu{
let backView = UIView()
let menuWidth:CGFloat = 150
let menuView: UICollectionView = {
let layout = UICollectionViewFlowLayout()
let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
cv.backgroundColor = .white
return cv
}()
init(){
if let window = UIApplication.shared.keyWindow{
backView.frame = window.frame
backView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissHandler)))
backView.backgroundColor = UIColor(white: 0, alpha: 0.5)
backView.alpha = 0
menuView.frame = CGRect(x: -1*menuWidth, y: 0, width: menuWidth, height: window.frame.height)
}
}
func show(){
if let window = UIApplication.shared.keyWindow{
window.addSubview(backView)
//window.addSubview(menuView)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseIn, animations: {
self.backView.alpha = 1
self.menuView.frame = CGRect(x: 0, y: 0, width: self.menuWidth, height: window.frame.height)
}, completion: nil)
}
}
@objc func dismissHandler(){
if let window = UIApplication.shared.keyWindow{
UIView.animate(withDuration: 0.5, animations: {
self.backView.alpha = 0
self.menuView.frame = CGRect(x: -1*self.menuWidth, y: 0, width: self.menuWidth, height: window.frame.height)
}){(isSuccess) in
if(isSuccess){
self.backView.removeFromSuperview()
self.menuView.removeFromSuperview()
}
}
}
}
我检查了窗口和后视图的帧大小,但它们是相同的。知道为什么它不起作用吗?
解决: 问题是我在本地范围内制作了它的实例。非常感谢matt给我答案。
答案 0 :(得分:4)
在您的原始问题中,您没有说明如何使用Menu类本身来实现任何操作。但这可能是问题所在。
例如,假设您创建了Menu类实例,但不以某种方式维护它。然后您可以创建叠加层,但之后,菜单实例消失了,因此点击手势识别器随后没有target
可以与之通信。
换句话说,您已获得此点击手势配置代码:
backView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissHandler)))
...但是当用户点按并且点击手势识别器尝试发送其消息时,您的self
已经不存在。