この解決策は私のために働いた:
方法 1 - カスタムの長押しを検出する
A) UILongPressGestureRecogniser のサブクラスを作成します。
B) 次のcanBePreventedByGestureRecognizer:
ように、サブクラスにメソッドを含めます。
ヘッダ:
#import <UIKit/UIKit.h>
@interface CustomLongPress : UILongPressGestureRecognizer
@end
実装:
#import "CustomLongPress.h"
@implementation CustomLongPress
- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer*)preventedGestureRecognizer {
return NO;
}
@end
サブクラスで必要なコードはこれだけです。
C) uiwebview/pdf リーダーを含むビューを開きます。次のように、サブクラスをインクルードして#import "CustomLongPress.h"
から、カスタム UILongPressGestureRecogniser を UIWebView に追加します。
- (void)viewDidLoad
{
[super viewDidLoad];
//Load UIWebView etc
//Add your custom gesture recogniser
CustomLongPress * longPress = [[CustomLongPress alloc] initWithTarget:self action:@selector(longPressDetected)];
[pdfWebView addGestureRecognizer:longPress];
}
D) 長押しを検出し、UIWebView の userInteraction をオフにしてからオンに戻します。
-(void)longPressDetected {
NSLog(@"long press detected");
[pdfWebView setUserInteractionEnabled:NO];
[pdfWebView setUserInteractionEnabled:YES];
}
どうやらこれが機能する理由は、UIWebView が独自のジェスチャ認識機能を使用して長押しをキャプチャし、追加した追加のジェスチャ再認識機能を除外しているためです。ただし、ジェスチャ認識機能をサブクラス化し、canBePreventedByGestureRecognizer:
メソッドに「NO」を返すことでそれらの除外を防止すると、デフォルトの動作がオーバーライドされます。
PDF の長押しを検出できたら、userInteraction をオフにしてから再度オンに切り替えると、UIWebView がデフォルトの動作を実行できなくなります。つまり、「コピー/定義」UIMenu を起動するか、リンクを長押しした場合はポップアップ アクションシートを起動します。 「コピー」および「開く」アクションで。
方法 2 - UIMenu NSNotification をキャッチする
あるいは、単に「コピー/定義」UIMenu をブロックしたい (ただし、長押しには影響しない) 場合は、次の行 (UIMenuControllerDidShowMenuNotification をリッスンする) を ViewDidLoad に追加できます。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuShown) name:UIMenuControllerDidShowMenuNotification object:nil];
次に、上記と同じ userInteraction Off/On メソッドを使用して、このメソッドを追加します。
-(void)menuShown {
NSLog(@"menu shown");
[pdfWebView setUserInteractionEnabled:NO];
[pdfWebView setUserInteractionEnabled:YES];
}
https://devforums.apple.com/thread/72521?start=25&tstart=0から取得した最初のメソッド、およびスタックのどこかから取得した 2 番目のメソッド、申し訳ありませんが場所を忘れてしまいました。ご存知の方はご記入ください。