`touchesBegan:withEvent:` is delayed at left edge of screen

后端 未结 5 1417
余生分开走
余生分开走 2021-01-06 03:38

I\'m experiencing an issue where the first call to touchesBegan:withEvent: on a UIView or UIViewController is delayed when you touch o

相关标签:
5条回答
  • 2021-01-06 03:57

    try adding this to the viewdidappear method. this might fix the issue. it happened with me as well but i got this code from stack overflow that fixed my issue. hope it helps you too

    let window = view.window!
    let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer
    let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer
    gr0.delaysTouchesBegan = false
    gr1.delaysTouchesBegan = false
    
    0 讨论(0)
  • 2021-01-06 03:57

    This works for me

    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
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-06 03:59

    in iOS 13.2. it seems that trick is not possible:

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

    Looks like the only solution is disable 3D touch in Settings.

    0 讨论(0)
  • 2021-01-06 04:02

    Purteeek solution seems to work nicely in my case too. This is an objective-C implementation for SpriteKit:

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

    This doesn't mess with other gesture recognizers, and the system 3D Touch still works fine. I wonder why this is not the default behavior.

    0 讨论(0)
  • 2021-01-06 04:11

    Like danialias I'm working on a game. The solution I found (currently working, tested on an iPhone with 3D Touch enabled, where this was a real issue up to this point..) works for both games/apps:

    It seems that UITapGestureRecognizer doesn't suffer from this delay, so simply add one to your view, and use it to handle taps.

    In my game, I store touches and handle them on every interval update, so I overrode

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

    and there I stored the UITouch instance and returned NO.

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        [self.touches addObject:touch];
        return NO;
    }
    
    0 讨论(0)
提交回复
热议问题