我想在当前项目中实现会话时间功能。因此,我试图继承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 delegate中我做了这个
private let baseWindow = BaseWindow()
var window: UIWindow? {
get {
return baseWindow
}
set {}
}
但问题是touchesBegan
并且touchesEnded
未被调用。我无法弄清楚我做错了什么。
答案 0 :(得分:5)
除非没有其他人捕获触摸事件,否则不会为您的窗口调用touchesBegan(_:with:)
API。通常情况并非如此,因为您希望UI元素接收触摸。
您希望在窗口子类中实现的是sendEvent(:_)
并将您的逻辑放在那里。不要忘记调用超级实现来传递事件。
使用这种方法的小型ceveat是你会听到一些不是触摸事件的事件,但这可能不是问题,因为它们大多是用户生成的。
答案 1 :(得分:0)
我试图将UIWindow子类化并覆盖touchesBegan方法,当窗口有一个rootViewController检查演示项目时,touchesEnded会调用这些方法。 Sample app TouchTest
同时检查此方法 - (void)sendEvent:(UIEvent *)event
根据文档:您可以调用此方法将自定义事件分派给窗口的响应程序链。 窗口对象将触摸事件分派到发生触摸的视图中,并将其他类型的事件分派给最合适的目标对象
答案 2 :(得分:0)
跟踪会话的更好方法是注册UIApplication
通知,例如UIApplicationDidEnterBackgroundNotification
和UIApplicationDidFinishLaunchingNotification
。
UIApplication
class reference底部提供了完整的应用程序通知列表。您可以创建一个会话跟踪器类,它可以干净地侦听这些内容,而不会干扰代码的其他部分。
答案 3 :(得分:-2)
而不是继承UIWindow
。您可以在UITapGestureRecognizer
的窗口中添加AppDelegate
。
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
}
}
并做
gestureRecogniger.delegate = self