iOS 16 three finger undo tap gesture bug

In iOS 16.0, the new three finger undo tap gesture alert shows up in every app regardless of any text editing being present. This seems to be a significant change and undesirable behavior for multi-touch applications like instruments.

I noticed that GarageBand is the only application not exhibiting this behavior. Is there a way to opt-out?

Here is an example from Moog's Model D application.

Post not yet marked as solved Up vote post of Moby Pixel Down vote post of Moby Pixel
7.1k views
  • The 3-gesture option that was included with iOS 16 is starting to irritate people. Man, this is a new generation thing, and people use multiple fingers on the screen for games, the piano, and all other related applications. I think I'll switch back to iOS 15.7. Adding the three gesture setting to iOS 16 and make it mandatory, especially since there isn't a remove option. Because of this bug, I am unable to utilize my programs effectively. It's a brilliant idea but add on/off or remove.

  • Extension ViewController ->    open override var canBecomeFirstResponder: Bool {     return true   }

       @available(iOS 13.0, *)   open override var editingInteractionConfiguration: UIEditingInteractionConfiguration {     return .none   }

Add a Comment

Accepted Reply

I found a workaround. Put this code in your ViewController.

// becomeFirstResponder returns "NO" in "viewDidLoad".
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (UIEditingInteractionConfiguration)editingInteractionConfiguration
{
    return UIEditingInteractionConfigurationNone;
}

If you implement Keyboard Input, this should be in the UIResponder object.

  • Thank you, kkq! Hopefully they will fix the issue completely in a future iOS update, but this will work for now. I'm using SwiftUI so this worked for me:

    extension UIWindow {     open override var editingInteractionConfiguration: UIEditingInteractionConfiguration { return .none }     open override var canBecomeFirstResponder: Bool { return true } }
  • Please try this code its working Extension ViewController ->    open override var canBecomeFirstResponder: Bool {     return true   }

       @available(iOS 13.0, *)   open override var editingInteractionConfiguration: UIEditingInteractionConfiguration {     return .none   }

Add a Comment

Replies

App from example: https://apps.apple.com/us/app/minimoog-model-d-synthesizer/id1339418001

Yep, trying to play egg, inc. and when I use three fingers to tap real quick I get the same bug.

I also have to say I am getting this bug. Egg inc is the primary reason.

I think it's in ios 16's new feature it just really annoying when you play games doing 3 taps and popping out on your screen, not only in games also in other apps, I hope they make an update disabling this feature it's really annoying

me too, very annoying

This still seems to be an issue in iOS 16.1 beta 2. This beta has removed the task menu but the "Nothing to Undo" alert is still showing after a three finger tap.

I found a workaround. Put this code in your ViewController.

// becomeFirstResponder returns "NO" in "viewDidLoad".
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (UIEditingInteractionConfiguration)editingInteractionConfiguration
{
    return UIEditingInteractionConfigurationNone;
}

If you implement Keyboard Input, this should be in the UIResponder object.

  • Thank you, kkq! Hopefully they will fix the issue completely in a future iOS update, but this will work for now. I'm using SwiftUI so this worked for me:

    extension UIWindow {     open override var editingInteractionConfiguration: UIEditingInteractionConfiguration { return .none }     open override var canBecomeFirstResponder: Bool { return true } }
  • Please try this code its working Extension ViewController ->    open override var canBecomeFirstResponder: Bool {     return true   }

       @available(iOS 13.0, *)   open override var editingInteractionConfiguration: UIEditingInteractionConfiguration {     return .none   }

Add a Comment

Can’t agree more. This is getting in the way of games and apps. I really wish disabling this feature was included in the interface and it should not default as ‘On’.

I was fortunate enough to have some details regarding the 16.0 change provided to me so I can further elaborate on this. I don't believe this is a "bug" and merely an(albeit very frustrating) undocumented default behaviour change regarding the responder chain defaults.

The change in 16.0+ is that this property is now only checked when the responder chain changes. Myself and many other never set a first responder so attempts to just override the editingInteractionConfiguration property is not enough and requires explicitly making a responder chain change.

The "workaround" answered above is an example of implementing the following requirements to disable the "editing interaction" menu from triggering:

  • Have at least a single UIResponder in your responder chain which can become a first responder
  • On said UIResponder UI elements, override the editingInteractionConfiguration property to return UIEditingInteractionConfigurationNone
  • On said UIResponder become the first responder successfully

If you have other UI elements taking the first responder and you want to continue having it disabled, you need to override the property for those as well.

  • I think you are right about it being an undocumented change, but I'm still not sure if they will revert it back at some point. I'm doing a similar fix like you described for now.

    Pre-iOS 16 the values returned for editingInteractionConfiguration were "none" and "default" with "none" being the default behavior.

Add a Comment

Try this Code its working for me Extension ViewController ->    open override var canBecomeFirstResponder: Bool {     return true   }

   @available(iOS 13.0, *)   open override var editingInteractionConfiguration: UIEditingInteractionConfiguration {     return .none   }