为什么我收到此消息:[SystemGestureGate] <0x102210320> 手势:系统手势门超时

fly*_*yer 46 uigesturerecognizer ios swift

我的 iOS Swift 5 (Xcode 14.1) 应用程序正在运行。上次 Xcode 更新后,我注意到当我在导航控制器内的堆栈中推送带有表视图的特定视图控制器时,我收到以下警告:

[SystemGestureGate] <0x102210320> 手势:系统手势门超时

当我向后滑动以弹出有问题的视图控制器时,它的行为不稳定,有时弹出得很好。我所说的“不稳定”是指有时它会部分显示目标视图控制器,有时会在滑动中间冻结一两秒等。当我尝试再次推入有问题的视图控制器时(出现警告后),它会冻结应用程序。

视图控制器、堆栈、表格和单元格没有自定义手势识别器。

我在应用程序的其他地方没有看到这个警告(包括带有堆栈和表格的视图控制器)。

我的问题是:

  1. 什么是“SystemGestureGate:系统手势门超时”?我在网上没有找到关于这个错误的实质性信息。
  2. 会产生此类警告的条件是什么?

我怀疑我正在使用的表有问题,正在进一步调查。

我采取的一些故障排除步骤:

  • 当我完全删除桌子时,警告和行为就会消失。
  • 当我部分删除表格(一两个部分)时,警告和行为会随机发生(我找不到模式)。
  • 我放置了断点,发现错误发生在 之后viewWillAppear,但之前viewDidAppear

我期望视图控制器将以与导航控制器中所有其他视图控制器相同的方式滑动来弹出。

小智 24

我今天遇到了同样的错误。它似乎是在长按屏幕底部附近的按钮(或者可能是任何手势处理元素)时发生的。

这是我测试过的一个愚蠢的观点:

struct vertButtons: View {
  @State var i = 0
  func action() {i=(i+1)%10}
  var body: some View {
    VStack {
        Text(String(i))
            .font(.title)
        Spacer()
        Button(action: {action()}) {
            Text("Good Button") // This one is fine
                .font(.title)
        }
        Spacer()
        Button(action: {action()}) {
            Text("Good Button") // This one is fine
                .font(.title)
        }
        Spacer()
        Button(action: {action()}) {
            Text("Good Button") // This one is fine
                .font(.title)
        }
        Spacer()
        Button(action: {action()}) {
            Text("\"Bad\" Button") // Long-press produces "gesture gate timeout"
                .font(.title)
        }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

长按“坏”按钮会产生错误(“手势:系统手势门超时”),而对任何“好”按钮执行相同操作则不会。计数器文本用于表明错误消息不会干扰长按释放后执行的按钮操作。

我最好的猜测是,iOS 包含或包含一些功能(“系统手势门”),旨在防止应用程序手势处理和屏幕底部的特殊系统手势之间的干扰,并且最近的 iOS 更新引入了一个错误导致它超时而不是执行其应该执行的操作的功能。

该错误对该测试视图或我的实际应用程序中的预期功能没有影响,所以我想知道您的问题是否还有其他原因。

我希望我能给出更权威的答案,但希望这对您有所帮助。需要注意的是,我对 Swift 和 SwiftUI 非常陌生。

  • 我认为这与剪辑有更多关系。我看到它在其他情况下发生(添加点击手势以在屏幕上查看更高的位置)。我注意到 UILabel 包含无法从给定的约束中得出内在大小。就好像 iOS 中的一个内部事件流检测到手势一样,但由于框架或自动布局,事件无法通过视图遍历进行足够远的追踪以完成。 (2认同)