我想在我当前的项目中实现会话时间功能。因此,我试图子类化UIWindow
并覆盖touchesBegan
和touchesEnded
方法。
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 {}
}
但问题是touchesBegan
和touchesEnded
没有被调用。我不知道我做错了什么。
不会为您的窗口调用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)
如果您需要考虑除轻击以外的其他触摸,请同时使用UIPanGestureRecognizer
和UITapGestureRecognizer
。
如果你的子视图有自己的手势识别器,添加这个扩展
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
通知,例如UIApplicationDidEnterBackgroundNotification
和UIApplicationDidFinishLaunchingNotification
。
应用程序通知的完整列表在UIApplication
类引用的底部可用。您可以创建一个会话跟踪器类,在不干扰代码其他部分的情况下清晰地监听这些会话跟踪器。