iOS16での3本指ジェスチャーを無効にする方法 (開発者向け)

iOS/iPadOS 16から、3本指でタップするとツールバーが出るようになりました。回避方法がありましたので、ここに記します。

2022年10月5日編集: UIWindowのカテゴリを使えば、becomeFirstResponderを呼ばなくてもよさそうです。

Objective-C

@implementation UIWindow (ThreeTapGestureFix)

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (UIEditingInteractionConfiguration)editingInteractionConfiguration
{
    return UIEditingInteractionConfigurationNone;
}

@end

Swift

UIWindow {
     open override var editingInteractionConfiguration: UIEditingInteractionConfiguration { return .none }
     open override var canBecomeFirstResponder: Bool { return true } 
}

以下、古い投稿:

端的に言うと、ViewControllerなどでeditingInteractionConfiguration.noneを返すようにし、そのViewControllerfirstResponderにします。
ViewControllerでなくても、AppDelegateとかUIViewでも大丈夫かもしれません。
firstResponderとは、タッチ以外のイベントを最初に受け取るオブジェクトらしいので、キーボード入力の処理をしているUIResponderを継承したオブジェクトがあれば、それをfirstResponderにしてeditingInteractionConfigurationを実装すればいいと思います。

Objective-Cでの例を以下に示します。Swift使いの方はここから類推してください。
注意するべきなのは、UITextFieldなどがfirstResponderになると、再び3本指ジェスチャーが有効になるので、フォーカスが外れた時に再度becomeFirstResponderを呼び出す必要があります。
2022年9月25日編集: becomeFirstResponderYESを返したときは、再び有効になることはありません。
以前の投稿はUIViewfirstResponderにしていましたが、変更しました。

ViewController

// viewDidLoadだとbecomeFirstResponderがNOを返す
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (UIEditingInteractionConfiguration)editingInteractionConfiguration
{
    return UIEditingInteractionConfigurationNone;
}

おすすめ