私はiPhoneアプリケーションを開発しており、UIWebViewsを使用しています。UiWebViewで文字列を強調表示したときにポップアップするUIMenuItemsをカスタマイズすることを計画しました(コピー、すべて選択、切り取りなど)。それらのmenuItemsを削除しようとしましたが、COPYメニュー項目を削除できません。
私はあなたの助けが必要です。
ありがとう、ZaldzBugz
私はiPhoneアプリケーションを開発しており、UIWebViewsを使用しています。UiWebViewで文字列を強調表示したときにポップアップするUIMenuItemsをカスタマイズすることを計画しました(コピー、すべて選択、切り取りなど)。それらのmenuItemsを削除しようとしましたが、COPYメニュー項目を削除できません。
私はあなたの助けが必要です。
ありがとう、ZaldzBugz
ハイジャックを行う必要があります。それが可能かどうかさえわかりません。おそらく、UILongPressGestureRecognizer というジェスチャ イベントに応答しているようです。
ジェスチャが追加されたビューを見つける必要があります。このようなもの。
NSArray *gestures = myWebView.gestureRecognizers;
for(int i=0;i<[gestures count];i++){
UIGestureRecognizer g = [gestures objectAtIndex:i];
if([g isKindOfClass:UILongPressGestureRecognizer.Class]){
[myWebView removeGestureRecognizer:g];
break;
}
}
しかし、ジェスチャーがUIWebviewに直接あるとは思いません。サブビューの 1 つにあります。
したがって、このサブビューにある可能性があります
UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];
その上にない場合は、おそらく最も上にあるビューにあると思われます。これは文書化されていない View タイプですが、呼び出しているメソッドの UIView として扱う場合、おそらく安全です。また、UIViewとして扱っているので、私の知る限りルール違反ではありません。
UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];
UIView *realWebView = [[sview subviews] objectAtIndex:10];
すべてのビューからジェスチャを削除しようとするスニペット (テストされていません) を作成しなかった理由は、どのビューからジェスチャを削除するかを知ることが重要だからです。
それを削除した後、独自の UILongPressGestureRecognizer を作成し、新しいものをそれぞれのビュー (削除されたビュー) に追加する必要があります。
コピー選択などのすべての機能が失われましたが、独自の機能を実装できるようになりました。
古い機能の一部が必要な場合は、元に戻す方法を知っていると思いますが、これが許可されているか安全であるとは約束できません.
ジェスチャを削除する前に、メソッドを UIView にオーバーライドする必要があります。現在の作業クラス ファイル (ファイルの上部) で実行できるはずです。
@implementation UIView (extended)
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n",
[NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
@end
約束はできませんが、これにより、ビューで呼び出されるすべてのメソッドの名前がログに記録されるはずです。
アプリを実行し、copy、paste、select、select all メソッドを実行します。ボタンを押したときに呼び出されるメソッドがログに表示されるはずです。ボタンを押すといくつかのメソッドが表示される場合がありますが、最初のメソッドだけが必要な場合があります。
menuItem を作成すると、どのセレクターを割り当てるかがわかります。
これはすべて単なる推測です。それが役に立てば幸い。
同様の質問に対するこの回答の手法を使用しましたが、[コピー] メニュー項目を削除するために機能します。つまり、例では UITextView の代わりに UIWebView をオーバーライドします。また、カスタム セレクターに対して YES を返し、copy: セレクターに対して NO を返すビュー コントローラーに canPerformAction:withSender: を記述し、セレクターがそれらのどれでもない場合はスーパー実装の値を返します。カスタム UIWebView サブクラス名を xib に設定することを忘れないでください。