【问题标题】:`touchesBegan:withEvent:` is delayed at left edge of screen`touchesBegan:withEvent:` 在屏幕左边缘延迟
【发布时间】:2016-10-02 02:16:49
【问题描述】:

我遇到了一个问题,当您触摸屏幕的左边缘时,第一次调用 UIViewUIViewController 时出现延迟。这似乎是 iOS 10 的一个新问题,并且只发生在具有 3D Touch 的设备(iPhone 6s 和更新版本)上。事实上,如果您在 General->Accessibility 中禁用 3D Touch,问题就会消失。

但是,当您使用 UIGestureRecognizers 时,该问题似乎不会发生。我目前的解决方法是创建一个 UIGestureRecognizer 子类来覆盖 touches* 方法并将它们转发给我的旧实现。

这只是一个错误还是有办法摆脱延迟?

【问题讨论】:

    标签: ios iphone ios10 touchesbegan 3dtouch


    【解决方案1】:

    尝试将此添加到 viewdidappear 方法中。这可能会解决问题。它也发生在我身上,但我从堆栈溢出中得到了这段代码,解决了我的问题。希望对你也有帮助

    let window = view.window!
    let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer
    let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer
    gr0.delaysTouchesBegan = false
    gr1.delaysTouchesBegan = false
    

    【讨论】:

    • 嗯,我知道这将如何解决眼前的问题,但搞乱系统手势识别器似乎会导致更多问题
    • 我做了更多调查,这似乎是目前最好的解决方案。这些手势识别器是 _UISystemGestureGateGestureRecognizer 的实例,似乎主要用于确保您的应用程序与控制中心或 3D 触摸应用程序切换等系统手势更好地交互。对于左边缘,我相信添加延迟是为了防止用户尝试切换应用程序时发生意外的应用程序交互,但在我的情况下,我需要在左边缘进行响应式触摸,如果在用户尝试切换应用程序时触发触摸就可以了.
    【解决方案2】:

    和 danialias 一样,我正在开发一款游戏。我找到的解决方案(目前正在运行,在启用了 3D Touch 的 iPhone 上进行了测试,到目前为止这是一个真正的问题..)适用于两个游戏/应用程序:

    UITapGestureRecognizer 似乎不会受到这种延迟的影响,因此只需在视图中添加一个,并使用它来处理点击。

    在我的游戏中,我存储触摸并在每次间隔更新时处理它们,所以我覆盖了

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    

    我在那里存储了 UITouch 实例并返回 NO。

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        [self.touches addObject:touch];
        return NO;
    }
    

    【讨论】:

      【解决方案3】:

      Purteeek 解决方案在我的情况下似乎也很有效。这是 SpriteKit 的 Objective-C 实现:

      - (void)didMoveToView:(SKView *)view {
      
          UIGestureRecognizer* gr0 = view.window.gestureRecognizers[0];
          UIGestureRecognizer* gr1 = view.window.gestureRecognizers[1];
      
          gr0.delaysTouchesBegan = false;
          gr1.delaysTouchesBegan = false;
      
      }
      

      这不会与其他手势识别器混淆,并且系统 3D Touch 仍然可以正常工作。我想知道为什么这不是默认行为。

      【讨论】:

        【解决方案4】:

        在 iOS 13.2 中。看来这个技巧是不可能的:

        [Warning] Trying to set delaysTouchesBegan to NO on a system gate gesture
        recognizer - this is unsupported and will have undesired side effects
        

        看起来唯一的解决方案是在“设置”中禁用 3D 触摸。

        【讨论】:

          【解决方案5】:

          这对我有用

          override func viewDidAppear(_ animated: Bool) {
              super.viewDidAppear(animated)
          
              if let window = view.window,
                  let recognizers = window.gestureRecognizers {
                  recognizers.forEach { r in
                      r.delaysTouchesBegan = false
                      r.cancelsTouchesInView = false
                      r.isEnabled = false
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-30
            相关资源
            最近更新 更多