【问题标题】:Is it possible to closing copy text on QLPreviewController是否可以关闭 QLPreviewController 上的复制文本
【发布时间】:2020-11-16 07:05:01
【问题描述】:

我开发 Xamarin Forms 应用程序。我将 QLPreviewController 用于 ios。如果文档有文本,我想关闭复制文本/文本共享。有可能吗?怎么做?我搜索它作为本地。一些来源将我重定向到 UIDocumentInteractionControllerDelegate。但我不明白我该怎么做。

提前致谢。

编辑: 我的 UIDocumentInteractionController 实现:

var firstController = UIApplication.SharedApplication.KeyWindow.RootViewController.ChildViewControllers.First().ChildViewControllers.Last().ChildViewControllers.First();
                    var navcontroller = firstController as UINavigationController;

                    var uidic = UIDocumentInteractionController.FromUrl(new NSUrl(file, true));
                    uidic.Delegate = new DocInteractionController(navcontroller);
                    uidic.PresentPreview(true);

public class DocInteractionController : UIDocumentInteractionControllerDelegate
    {
        UINavigationController navigationController;
        
        public DocInteractionController(UINavigationController _navigationController)
        {
            navigationController = _navigationController;
        }
    }

【问题讨论】:

  • 您想隐藏整个菜单还是只删除复制和共享选项?您可以发布您所做的相关代码,以便我可以检查它。
  • 其实我什么都做不了。我只看到this thread 那里说:至于禁用剪切/复制/粘贴,你不能用QLPreviewController 做到这一点。你也许可以用 UIDocumentInteractionController 来做到这一点 所以我只实现 UIDocumentInteractionController。我搜索了一个禁用剪切/复制/粘贴的事件。我在我的问题中添加了 UIDocumentInteractionController 的实现。
  • 我想知道有没有可能。因为我的发送线程只说你可以用 UIDocumentInteractionController 来做。但是怎么做?它没有说如何。所以我不能确定这是可能的。
  • 所以你想隐藏整个菜单?
  • 是的,只要有可能

标签: ios xamarin.forms xamarin.ios uidocumentinteraction qlpreviewcontroller


【解决方案1】:

在您的情况下,最好使用 WebView 来预览 pdf 等文件。

在表格中

创建自定义网页视图

public class MyWebView : WebView
{
    public static readonly BindableProperty UriProperty = BindableProperty.Create(propertyName: "Uri",
            returnType: typeof(string),
            declaringType: typeof(MyWebView),
            defaultValue: default(string));

    public string Uri
    {
        get { return (string)GetValue(UriProperty); }
        set { SetValue(UriProperty, value); }
    }
}

在 Android 项目中


using Android.Content;
using Android.Net.Http;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Webkit;
using Android.Widget;
using App32;
using App32.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(MyWebView), typeof(CustomWebViewRenderer))]
namespace App32.Droid
{
    public class CustomWebViewRenderer : WebViewRenderer
    {
        Context _context;
        public CustomWebViewRenderer(Context context) : base(context)
        {
            _context = context;
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                Android.Webkit.WebView web_view = new Android.Webkit.WebView(_context);
                web_view.LoadUrl("https://drive.google.com/viewerng/viewer?embedded=true&url="+((MyWebView)Element).Uri);
           
                SetNativeControl(web_view);
                Control.Settings.JavaScriptEnabled = true;
               
            }
        }
    }

    
}

在 iOS 项目中

using System;
using App32;
using App32.iOS;
using Foundation;
using ObjCRuntime;
using UIKit;
using WebKit;
using Xamarin.Forms.Platform.iOS;

[assembly: Xamarin.Forms.ExportRenderer(typeof(MyWebView), typeof(MyWebViewRenderer))]
namespace App32.iOS
{
    public class MyWebViewRenderer : ViewRenderer<MyWebView, WKWebView>
    {
        WKWebView _wkWebView;

        protected override void OnElementChanged(ElementChangedEventArgs<MyWebView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                var config = new WKWebViewConfiguration();
                _wkWebView = new WKWebView(Frame, config);
               
                SetNativeControl(_wkWebView);
            }

            if(e.NewElement!=null)
            {
                var webview = Element as MyWebView;

                var url = webview.Uri;

                Control.LoadRequest(new NSUrlRequest(new NSUrl("https://drive.google.com/viewerng/viewer?embedded=true&url=" + webview.Uri)));
            }

        }
        

    }

  
}

在xml中

现在您可以在 xaml 中使用它(您可以打开一个包含 WebView 的新 ContentPage)

<StackLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">

        <local:MyWebView Uri="https://www.pdfpdf.com/samples/Sample1.PDF"/>

</StackLayout>

【讨论】:

  • 非常感谢卢卡斯。但它是在线的。我不能将它用作离线查看器,可以吗?
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2016-06-03
  • 2011-07-24
相关资源
最近更新 更多