2011-04-01 25 views
6

在我的應用程序中,我想禁用UIWebView對象顯示的複製/粘貼/剪切內容。要做到這一點,我創建了一個UIWebView子類,並推翻了- (BOOL)canPerformAction:(SEL)action withSender:(id)sender方法:當顯示文檔時沒有複製/粘貼和選擇矩形的UIWebView

#pragma mark - UIResponderStandardEditActions 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {  
    if (action == @selector(copy:) || 
     action == @selector(paste:)|| 
     action == @selector(cut:)) { 
     return _copyCutAndPasteEnabled; 
    } 

    return [super canPerformAction:action withSender:sender]; 
} 

現在,用戶不再能做出這樣的操作,但是UIWebView中仍然顯示「選擇矩形」,你可以在下面看到截圖:

Selection rectangle

注:內容被顯示在UIWebView的不是HTML頁面。我展示使用文檔文件(PDF,DOC,PPT),從文件加載:

NSURL *fileURL = [NSURL fileURLWithPath:<document file path..>]; 
NSURLRequest *fileRequest = [NSURLRequest requestWithURL:fileURL]; 
[<uiwebView> loadRequest:fileRequest]; 

有沒有什麼辦法來禁用/隱藏此選擇矩形特徵呢?

[] s,

+1

除非您100%確定沒有其他人提供相同(或類似)的內容,否則此「功能」僅用於驅動人們遠離您的應用。 – 2011-04-01 15:39:18

+0

@Franci Penov:我可以想到許多用戶不希望選擇指針出現的情況。事實上,當閱讀某些內容並緩慢滾動(手指按下,閱讀,拖動,最終選擇,但想要滾動)時,它通常會與我的用戶體驗掛鉤。 – Kalle 2011-04-01 16:29:19

+0

@Franci:我100%確定沒有人會提供這樣的內容。該應用程序正在創建,以顯示僅限於某些公衆的內容。這個「功能」是客戶的要求(否則我肯定不會爲此而煩惱。)@卡爾:我完全同意你的看法。 – 2011-04-09 19:27:04

回答

14

您可以嘗試在webView中注入javascript。此代碼也適用於iPhone,但只有在頁面完全加載時才適用。 http://www.javascriptsource.com/page-details/disable-text-selection.htmlhttp://solidlystated.com/scripting/proper-way-to-disable-text-selection-and-highlighting/

爲了得到它正常工作時只有一半加載頁面或仍在加載你proably必須使用類似下面這樣的設置,其中你注入的javascript禁用只是因爲它會開始選擇。 http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/

我能想到的最後一件事情可能會奏效,您是否測試過將選擇器@selector(select :)添加到禁用選擇器列表中?

編輯: 好吧,你要什麼來顯示PDF而不是HTML頁面,你可以試試這個。

設置

將web視圖在一個滾動視圖;

將ScrollView's:delegate設置爲self;分鐘縮放到1.0,最大縮放到任何你想要的;

weView完成加載後。 掃描webView中的第一個UIScrollView,(我們正在掃描它,所以這不應該在以後的iOS版本中打破)。 將UIWebViews框架設置爲它的scrollViews大小。 並將scrollView的contentSize設置爲webViews的contentSize(或者現在,它是框架)。

-(void)setup{ 
    //Get the webView's first scrollView (the one all the content is in). 
    UIScrollView *webViewContentView; 
    for (UIView *checkView in [webView subviews]) { 
     if ([checkView isKindOfClass:[UIScrollView class]]) { 
      webViewContentView = (UIScrollView*)checkView; 
      break; 
     } 
    } 

    webView.frame = CGRectMake(0, 0, webViewContentView.contentSize.width, webViewContentView.contentSize.height); 
    scrollView.contentSize = webViewContentView.contentSize; 
    scrollView.delegate = self; 
} 

要啓用縮放功能,您需要從scrollViews委託中添加一個額外的方法。

-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return webView; 
} 

,你可以下載一個示例項目http://www.multiupload.com/P8SOZ4NW6C(這是一個Xcode 4的項目)。

注意:如果你放大到多少,因爲web視圖不知道重新渲染的東西變焦pixelates中的WebView內容和原因你不能點擊鏈接(但在一個PDF該不該」不成問題)。

編輯2:更好的方法

因爲寫這個我已經意識到一個更簡單和更簡單的方法,這也應該能夠解決問題的像素化。

-(void)removeInput{ 
    UIScrollView *webViewContentView; 
    for (UIView *checkView in [webView subviews]) { 
    if ([checkView isKindOfClass:[UIScrollView class]]) { 
     webViewContentView = (UIScrollView*)checkView; 
      break; 
     } 
    } 

    for (UIView *checkView in [webViewContentView subviews]) { 
     checkView.userInteractionEnabled = NO; 
    } 
} 

現在你應該只能夠與自身的UIScrollView交互,這意味着縮放,滾動等..應該仍然工作(和相當的像素化的頁面應該重新渲染放大時),但你可以」 t選擇任何文本,或鍵入任何東西。東西

而且這個方法,基於this list of UIWebView subViews可能可以設置這個頁面開始加載,而在此之後,它已經完成加載頁面的。

+1

我感謝你的回答,這似乎在UIWebView中顯示HTML頁面時工作。我認爲我的問題還不夠清楚(我會編輯它)。在UIWebView中顯示的內容是PDF,DOC,PPT,XLS文件(我只是從一個文件中加載URLRequest) – 2011-04-09 19:30:48

+0

那麼你可以嘗試的另一種方法是獲取內容視圖的大小UIWebView將webViews的大小設置爲禁用webView上的userInteraction,並將其添加到UIScrollView,並將其contentSize設置爲webViews大小,如果需要,我會再寫一個更詳細的答案。 – 2011-04-09 20:41:15

+0

這看起來像我的問題的解決方案。我可以設法寫出來,但如果可以的話,我希望看到你的實現並接受它作爲答案。謝謝。 – 2011-04-11 19:28:14