Swift - 在KeyWindow的子视图中无法识别点击手势

时间:2018-04-02 19:12:05

标签: ios swift

通过将自己添加到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给我答案。

1 个答案:

答案 0 :(得分:4)

在您的原始问题中,您没有说明如何使用Menu类本身来实现任何操作。但这可能是问题所在。

例如,假设您创建了Menu类实例,但不以某种方式维护它。然后您可以创建叠加层,但之后,菜单实例消失了,因此点击手势识别器随后没有target可以与之通信。

换句话说,您已获得此点击手势配置代码:

backView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissHandler)))

...但是当用户点按并且点击手势识别器尝试发送其消息时,您的self已经不存在。