4

カテゴリを使用して canPerformAction をオーバーライドし、コピー、切り取り、貼り付けセレクターに対して NO を返すことで、UIWebView でコピー/貼り付けを無効にしようとしました。

Web ページまたは他のすべてのドキュメント形式 (docx、pptx、rtf、txt など) を読み込んだときは期待どおりに動作しましたが、PDF ドキュメントを UIWebView に読み込んだときは動作しませんでした。

コピー セレクターを処理/応答する UIWebView で PDF ドキュメントを処理する別のメカニズムがあるように思われるため、ブロックできません。

また、UIWebView の UIScrollView のすべてのサブビューに対するユーザー操作を無効にしようとしましたが、これは PDF 以外の他のドキュメント形式では問題なく機能しました。

PDFドキュメントのUIWebViewでコピーを無効にする方法を理解するのを手伝ってくれる人はいますか?

4

8 に答える 8

17

OK、私は同じ問題を自分で経験しており、部分的であっても解決策を見つけているようです.

私がしているのは、 UILongPressGestureRecognizer を使用して、コピー/貼り付けにつながる長押しジェスチャを無効にすることです。

コード:

UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; // allocating the UILongPressGestureRecognizer

longPress.allowableMovement=100; // Making sure the allowable movement isn't too narrow

longPress.minimumPressDuration=0.3; // This is important - the duration must be long enough to allow taps but not longer than the period in which the scroll view opens the magnifying glass

longPress.delegate=self; // initialization stuff
longPress.delaysTouchesBegan=YES;
longPress.delaysTouchesEnded=YES;

longPress.cancelsTouchesInView=YES; // That's when we tell the gesture recognizer to block the gestures we want 

[webView addGestureRecognizer:longPress]; // Add the gesture recognizer to the view and scroll view then release
[[webView scrollView] addGestureRecognizer:longPress]; 
[longPress release];
于 2012-10-15T03:59:31.493 に答える
5

この解決策は私のために働いた:

方法 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 番目のメソッド、申し訳ありませんが場所を忘れてしまいました。ご存知の方はご記入ください。

于 2012-12-19T19:57:22.017 に答える
3

素晴らしい答えズババ。色付きの太字のテキストを表示するために webView を使用していますが、同じ問題がありました。あなたのソリューションをメソッドに入れて、webView を初期化した直後に呼び出します。デリゲートは必要ないようです。

self.textView = [[UIWebView alloc] initWithFrame:textFrame];
[self longPress:self.textView];

- (void)longPress:(UIView *)webView {

UILongPressGestureRecognizer* longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress)]; // allocating the UILongPressGestureRecognizer

longPress.allowableMovement=100; // Making sure the allowable movement isn't too narrow
longPress.minimumPressDuration=0.3; // This is important - the duration must be long enough to allow taps but not longer than the period in which the scroll view opens the magnifying glass

longPress.delaysTouchesBegan=YES;
longPress.delaysTouchesEnded=YES;

longPress.cancelsTouchesInView=YES; // That's when we tell the gesture recognizer to block the gestures we want

[webView addGestureRecognizer:longPress]; // Add the gesture recognizer to the view and scroll view then release
[webView addGestureRecognizer:longPress];

}

- (void)handleLongPress {

}
于 2013-02-12T01:54:46.630 に答える
3

Swift 3 で誰かが Zubaba の回答を必要とする場合。

let longPress = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))
longPress.allowableMovement = 100
longPress.minimumPressDuration = 0.3
longPress.delegate = self
longPress.delaysTouchesBegan = true
longPress.delaysTouchesEnded = true
longPress.cancelsTouchesInView = true
yourWebView.addGestureRecognizer(longPress)
yourWebView.scrollView.addGestureRecognizer(longPress)


func handleLongPress() {
     // Show some alert to inform user or do nothing.
}
于 2017-01-13T08:27:35.807 に答える
0

UILongPressGestureRecognizer は UIPDFPageView にあります。このビューにアクセスするには、[デバッグ] メニューのビュー階層を確認します。現在、pdf を Web ビューにロードすると、次のようにこのビューにアクセスできます。

let pdfPageView = myWebView.scrollview?.subviews[0]?.subviews[0]

次に、長押しを削除するには、pdfPageView を渡すときにこのメソッドを使用します。

func removeLongPressFromView(view: UIView){
  if let gestures = view.gestureRecognizers{
    for gesture in gestures{
      if gesture is UILongPressGestureRecognzier{
        view.removeGestureRecognizer(gesture)
      }
    }
  }
}
于 2016-03-15T22:08:57.700 に答える