触摸事件没有被触发



我想在我当前的项目中实现会话时间功能。因此,我试图子类化UIWindow并覆盖touchesBegantouchesEnded方法。

class BaseWindow: UIWindow {
    convenience init() {
        self.init(frame: UIScreen.mainScreen().bounds)
    }
    private var sessionTimeOutTimer: NSTimer?
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        sessionTimeOutTimer?.invalidate()
    }
    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        sessionTimeOutTimer = NSTimer.scheduledTimerWithTimeInterval(60, target: CIAppManager.sharedManger(), selector: #selector(CIAppManager.sessionTimeOut), userInfo: nil, repeats: false)
    }
}

在app委托中我做了这个

private let baseWindow = BaseWindow()
var window: UIWindow? {
    get {
        return baseWindow
    }
    set {}
}

但问题是touchesBegantouchesEnded没有被调用。我不知道我做错了什么。

不会为您的窗口调用touchesBegan(_:with:) API,除非没有其他人捕获触摸事件。这通常不会发生,因为你希望你的UI元素接收触摸。

你想在你的窗口子类实现的是sendEvent(:_),并把你的逻辑在那里。别忘了调用super实现来传递事件。

这种方法的一个小问题是,你会听到一些事件不是触摸事件,但这可能不是问题,因为它们大多是用户生成的

代替子类化UIWindow。您可以在AppDelegate的窗口中添加UITapGestureRecognizer

let gestureRecogniger = UITapGestureRecognizer(target: self, action: #selector(yourSelector)) // Implement your selector
gestureRecogniger.cancelsTouchesInView = false
window?.addGestureRecognizer(gestureRecogniger)

如果您需要考虑除轻击以外的其他触摸,请同时使用UIPanGestureRecognizerUITapGestureRecognizer

如果你的子视图有自己的手势识别器,添加这个扩展

extension AppDelegate: UIGestureRecognizerDelegate {
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

和do

gestureRecogniger.delegate = self

我试图子类化UIWindow并覆盖方法touchesBegan, touchesEnded这些方法在窗口有一个rootViewController检查演示项目时被调用。示例应用程序TouchTest

也检查这个方法 - (void) sendEvent:(UIEvent *)事件

根据文档:您可以调用此方法将自定义事件分派到窗口的响应器链。窗口对象将触摸事件分派给发生触摸的视图,并将其他类型的事件分派给最合适的目标对象

跟踪会话的更好方法是注册UIApplication通知,例如UIApplicationDidEnterBackgroundNotificationUIApplicationDidFinishLaunchingNotification

应用程序通知的完整列表在UIApplication类引用的底部可用。您可以创建一个会话跟踪器类,在不干扰代码其他部分的情况下清晰地监听这些会话跟踪器。

相关内容

  • 没有找到相关文章

最新更新