是否有可能在iOS的中心位置检测屏幕上发生的手势,例如,我认为在AppDelegate中。我知道我们可以为每个视图设置手势识别器。但我想在一个中心位置知道所有的平移/滚动行为都在发生。因此,当手势行为发生时,可以设置一些标志。
答案 0 :(得分:1)
你可以这样:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
window?.addGestureRecognizer(tap)
return true
}
func tapped() {
print("tapped")
}
然而,这并不总是有效,因为您添加的任何交互式UI元素都会拦截手势。但是有一个解决方案可以让你找到总是:
(...)
let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
tap.delegate = self
window?.addGestureRecognizer(tap)
(...)
然后实现委托:
extension AppDelegate: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return true
}
}
这样它不会破坏应用程序的任何正常行为,但您将能够检测手势识别器委托方法中的所有触摸。
答案 1 :(得分:0)
View或View Controller是您应该放置触摸事件或手势的地方,因为它在逻辑上很好地组织或维护您的代码。
但是,有时候,特别是在可可开发中,你可能会有几个具有完全相同功能的事件。例如您可以在应用程序中使用功能按钮,也可以在cocoa应用程序的顶部栏中使用相同的功能菜单项。在这种情况下,您应该将代码放在一个位置以共享代码。
您可以将更改标记代码放在委托中,并从视图或视图控制器中的手势代码中调用它。
答案 2 :(得分:0)
带有Scene Delegate的iOS 13 +
user3581248在这里让我处于正确的轨道,我已经为iOS 13更新了它。
// SceneDelegate
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
setupGlobalAccessToDebugScreen()
}
func setupGlobalAccessToDebugScreen() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapped))
tapGesture.delegate = self
tapGesture.numberOfTapsRequired = 6
self.window?.addGestureRecognizer(tapGesture)
}
@objc func tapped() {
// your action
}
// pass taps on to regular controls, don't block them
extension SceneDelegate: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return true
}
}