WKWebView加载PDF屏蔽长按功能弹框

问题

近期有个需求,需要在WKWebView加载PDF中,基于安全的理由,屏蔽【复制、选择全部】等功能弹窗

解决方案

捕捉长按手势后进行屏蔽,问题是,原来手势是放在view的subview中,导致一直屏蔽view的长按手势没法生效

// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    DebugLog(@"WKWebViewFinishNavigation");
    // 禁用长按效果
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        for (UIView *view in webView.subviews) {
            for (UIView * subview in view.subviews) {
                for (UIGestureRecognizer *gesture in subview.gestureRecognizers) {
                    if ([NSStringFromClass([gesture class]) isEqualToString:@"UILongPressGestureRecognizer"]
                        ) {
                        [subview removeGestureRecognizer:gesture];
                    }
                }
//                if ([NSStringFromClass([subview class]) isEqualToString:@"_UISizeTrackingView"]) {
//                    NSLog(@"gestureRecognizers:%@",subview.gestureRecognizers);
//
//                }
            }
        }
    });
    
}
本文转载于网络 如有侵权请联系删除

相关文章

  • 搭建ExtMail邮件服务器

    邮件系统是网络常用的通信渠道,本文记录使用ExtMail搭建属于自己的邮件服务器的方法。 概述ExtMail简介ExtMail开源版最早发布于2005年,定位于中小企业,满足稳定邮件收发,0成本拥有自己的中文邮件系统, 采用开放源代码的授权方式,为客户免费提供使用。后于2012年初推出专业版产品。目前ExtMail已经为众多知名央企、教育、制造业等在内的大量客户提供商业化的产品解决方案,并拥有海量的免费企业用户群,是同时拥有开源和收费两个产品线的邮件产品。目前互联网上运行超过一万台ExtMail服务器,承载十数万企业域名、数千万企业邮箱。 官方网站:https://www.extmail.cn/ ExtMail的优势与特点开源、免费,符合中国人习惯,使用不受限制拥有自主著作权、产权,用户不必担心版权问题安装简便,友善的全Web方式后台管理丰富的增值模块,应对不同客户的需求与LisPush手机电邮无缝对接,满足移动办公要求提供VPS模板,利用LisVP云主机系统实现1分钟安装建立邮件服务器这里使用docker安装的方式配置服务器 拉取镜像网址:https://hub.docker.com

  • 【轻量级NoSQL数据库与PythonWeb-Flask框架组合使用】4-项目布局及应用配置

    项目整体布局创建并进入项目文件夹:$mkdirflask-tutorial $cdflask-tutorial复制接下来按照安装简介设置一个Python虚拟环境,然后为项目安装Flask。本教程假定项目文件夹名称为flask-tutorial,本教程中代码块的顶端的文件名是基于该文件夹的相对名称。应用设置一个Flask应用是一个Flask类的实例。应用的所有东西(例如配置和URL)都会和这个实例一起注册。创建一个Flask应用最粗暴直接的方法是在代码的最开始创建一个全局Flask实例。前面的“Hello,World!”示例就是这样做的。有的情况下这样做是简单和有效的,但是当项目越来越大的时候就会有些力不从心了。可以在一个函数内部创建Flask实例来代替创建全局实例。这个函数被称为应用工厂。所有应用相关的配置、注册和其他设置都会在函数内部完成,然后返回这个应用。应用工厂写代码的时候到了!创建flaskr文件夹并且文件夹内添加__init__.py文件。__init__.py有两个作用:一是包含应用工厂;二是告诉Pythonflaskr文件夹应当视作为一个包。$mkdirflaskr复制f

  • 兄弟们,加入 Lyra Trading 竞赛

    点击链接:https://app.lyra.finance/welcome点击Getyourtokensnow他会让你加入他的discord讨论群点击连加入discord:https://discord.com/invite/FK9xhdsfyA然后找到joincompetition发送joincompetition点击机器人将钱包地址发送给机器人接着会到这个页面https://app.lyra.finance/faucet你就会看到你收到了tokens,等待竞赛的开始很大概率后面会发币,所以现在参与竞赛,等待空投来源链接:https://zhuanlan.zhihu.com/p/388717733

  • Windows10常用配置

    [TOC]0x00win10系统配置快速入门1.win10系统下隐藏磁盘盘符Step1.运行WIN+R,通regedit打开注册表后,依次展开定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer Step2.接下来我们在窗口右侧空白处点击右键,新建一个32位的DWORD值,我们将其重命名为Nodrives Step3.先在“基数”处勾选“十进制”,然后在数值数据处输入数字8,如上图,完事后点击“确定”。WeiyiGeek.noDrivesStep4.完事后重启下资源管理器或者重启下电脑,就可以看到指定的盘符被隐藏起来啦 #通过Shell命令进行进入 startD:\ #输入十进制的数字8代表将D盘隐藏,当然我们还可以将其他盘符隐藏 隐藏A盘对应十进制数字:1 隐藏B盘对应十进制数字:2 隐藏C盘对应十进制数字:4 隐藏D盘对应十进制数字:8 隐藏E盘对应十进制数字:16 隐藏F盘对应十进制数字:32 隐藏G盘对应十进制数字:64 隐藏H盘对应十进制数字:128 隐藏I盘对应十

  • django学习-day01

    如果运行报错就在runserver加上端口如8080 django-adminstartproject文件名,创建django项目文件夹 pythonmanage.pyrunserver启动dj服务器 pythonmanage.pystartapp项目名字创建app(也就是项目)在settings.py中注册App,打开与项目名称相同的目录,找到其中的settings.py文件,双击编辑,找到App配置区域->INSTALLED_APPS->在里面添加你的项目名称然后安装mysqlclient,不安装的话直接用pymysql也是可以不过需要按照下面的方法修改文件:解决方案 到D:\ProgramFiles\Python36\Lib\site-packages\Django-2.0.6-py3.6.egg\django\db\backends\mysql 文件下的base.py文件中,将以下内容注释掉 #version=Database.version_info #ifversion<(1,3,3): #raiseImproperlyConfigured(“mysqlc

  • JSON Web Token 入门教程

    JWT是什么?JSONWebToken(缩写JWT)是目前最流行的跨域认证解决方案。它是有三部分组成,示例如下,具体的讲解如下(jwt是不会有空行的,下面只是为了显示,便使用了换行看着比较方便)。eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjMfQ. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c复制它是由一个"."号隔开、三部分组成。第一部分是header信息,{"alg":"HS256",//加密的算法"typ":"JWT"//加密的方式,填写JWT}复制第二部分是Payload,有固定的六个部分和自定义数据组成,自定义数据看自己的情况需要来定义,是可以省去的。'iss'=>'https://www.qqdeveloper.com',//签

  • 07-08 创建计算字段使用函数处理数据第7章 创建计算字段第8章 使用函数处理数据

    第7章创建计算字段7.1计算字段存储在数据库表中的数据一般不是应用程序所需要的格式,下面举几个例子。需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中。城市、州和邮政编码存储在不同的列中,但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来。列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。物品订单表存储物品的价格和数量,不存储每个物品的总价格。但为打印发票,需要物品的总价格。需要根据表数据进行诸如总数、平均数的计算。上述例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化。字段(field) 基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。计算字段并不实际存在于数据库表中,是运行时在SELECT语句内创建的。注意 只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户端(如应用程序)来看,计算字段的数据与其他列的数据的返回方式相同。提示:客户端与服务器的格式

  • 5个对于企业家来说非常重要的关于加密货币的播客

    假设现在是2012年10月29日。你刚刚达成了一项交易,提供价值100美元的服务或产品。但是,你的买家不是通过贝宝把钱给你,而是用比特币支付给你。2012年10月,很少有人听说过比特币,所以你可能会犹豫。但如果你同意接受1074个比特币而不是100美元的交易,而你保留了比特币,那么你今天就能得到300万美元。加密货币价值激增,成为一个巨大的机遇。在区块链的支持下,一种独特的追踪交易和防止欺诈的方式,像比特币、Litecoin和Dogecoin(基于网络meme)正在改变世界各地的人们为商品和服务付费的方式。加密货币允许买卖双方几乎可以立即获得资金,无需使用大公司或由国家银行控制的货币。加密货币是最民主的经营方式,现在看来它们是要留下来的,但它们也很复杂,很难理解。他们不像你钱包里的美元,也不像你的Paypal账户里的数字。幸运的是,有一些简单的地方可以倾听,学习和让自己处于一个可以充分利用加密货币机会的位置。这里有5个播客,可以让你快速提高速度,并让你了解加密货币:1。BadCryptoPodcast由互联网企业家JoelComm和营销技术专家TravisWright广播,BadCry

  • 2015年中国青年生活形态调查报告

    如何在这个复杂的环境里自处?以怎样的行为习惯适应或者对抗这个时代的新科技、新消费方式、新社交模式?又以怎样的态度面对或背对这个环境?是摆在所有年轻人面前的问题。《城市画报》创刊16年来,持续记录着一代又一代青年人的经历、生活方式、态度选择。今年,我们联合腾讯问卷推出“2015中国青年生活形态调查报告”,再次用数据勾勒出2015年这个时间刻度上的青年群像。“2015中国青年生活形态调查”在4186个青年中展开,覆盖全国273座城市,其中90后受访者占到多半(66%)。所以这是一份偏年轻的青年调查报告,它或许无法囊括全年龄段的青年,但至少反映了以90后为主体的新一代年轻人的生活形态。从问卷调查的数据里,我们梳理出了2015年以下六个方面年轻人的生活趋势。一移动互联网行为愈见严重的手机依赖症。他们习惯使用手机购物、阅读及订制服务,也乐于接受新媒体营销。比如已经有9成年轻人使用手机购物,一位受访者称,手机里的打车软件成了他最离不开的App,“每天打开多次”。同时,已经有3成年轻人离开手机会感到孤独。深度参与虚拟社交。虚拟社交网络已经覆盖96%的年轻人,他们原创热情很高,比例过半。一位90后受访

  • 使用Topshelf创建Windows 服务

    WinndowsService是一种可随Windows操作系统启动而启动的,在后台运行的,通常不和用户产生交互的程序。它无法通过双击来运行,类似于Unix守护进程(daemonprocesses),当用户注销时它也不会停止。Windows服务由三部分组成:一个服务可执行文件;一个服务控制程序(SCP);服务控制管理器(SCM),负责在HKLM"SYSTEM"CurrentControlSet"Services下创建服务键值。用户可通过SCP控制服务的启动、停止、暂停等,SCP会通过SCM调用服务程序开发一个Windows服务通常也比较简单,在开发的时候我们期望以命令行方式运行,想对Windows服务有更多的控制,就有一个Windows服务框架TopShelf可以满足,使用这个框架要求你使用一个IoC容器,在框架中使用的是commonservicelocator接口,可以根据你的喜好去选择你自己中意的IoC容器。TopShelf的基本介绍可以参看DruSellers的介绍性文章TopShelf。下面的代码就是创建了一个Windows服务:usingSyste

  • 2022-09-26:以下go语言代码输出什么?A:{“Time“: “2020-12-20T00:00:00Z“, “N“: 5 };B:“2020-12-2

    2022-09-26:以下go语言代码输出什么?A:{"Time":"2020-12-20T00:00:00Z","N":5};B:"2020-12-20T00:00:00Z";C:{"N":5};D:<nil>。packagemain import( "encoding/json" "fmt" "time" ) funcmain(){ t:=struct{ time.Time Nint }{ time.Date(2020,12,20,0,0,0,0,time.UTC), 5, } m,_:=json.Marshal(t) fmt.Printf("%s",m) }复制答案选B。没看过time.Time结构,可能会选A;看过time.Time结构,可能会选C。为什么选B,目前还未找到原因,time.Time有json的Marshal相关方法,可能跟这个有关。在这里插入图片描述

  • 用js动态生成css代码

       有时候我们需要利用js来动态生成页面上style标签中的css代码,方法很直接,就是直接创建一个style元素,然后设置style元素里面的css代码,最后把它插入到head元素中。但有些兼容性问题我们需要解决。首先在符合w3c标准的浏览器中我们只需要把要插入的css代码作为一个文本节点插入到style元素中即可,而在IE中则需要利用style元素的styleSheet.cssText来解决。还需要注意的就是在有些版本IE中一个页面上style标签数量是有限制的,如果超过了会报错,需要考虑这点。下面直接放上代码,看注释说明。functionaddCSS(cssText){ varstyle=document.createElement('style'),//创建一个style元素 head=document.head||document.getElementsByTagName('head')[0];//获取head元素 style.type='text/css';//这里必须显示设置style元素的type属性为text/css,否则在ie中不起作

  • 添加系统环境变量

    1.添加Linux系统环境/Bash环境变量:#echo$PATH  ##查看已有的环境变量#exportPATH=/usr:$PATH  ##新添加/usr/目录进环境变量 2.添加python路径:#echo$PYTHONPATH  ## 查看python的路径#exportPYTHONPATH=/usr:$PYTHONPATH  ##  添加指定路径 3.添加perl路径:#perl-e"printqq(@INC)"  ##查看perl的路径#exportPERLLIB=$PERLLIB:/lib/path  ##添加指定路径 努力成为一名优秀的工程师

  • web.xml配置详解

    1定义头和根元素   部署描述符文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。  DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(DocumentTypeDefinition,文档类型定义)。  所有部署描述符文件的顶层(根)元素为web-app。请注意,XML元素不像HTML,他们是大小写敏感的。因此,web-App和WEB-APP都是不合法的,web-app必须用小写。  2部署描述符文件内的元素次序   XML元素不仅是大小写敏感的,而且它们还对出现在其他元素中的次序敏感。例如,XML头必须是文件中的第一项,DOCTYPE声明必须是第二项,而web-app元素必须是第三项。在web-app元素内,元素的次序也很重要。服务器不一定强制要求这种次序,但它们允许(实际上有些服务器就是这样做的)完全拒绝执行含有次序不正确的元素的Web应用。这表示使用非标准元素次序的web.xml文件是不可移植的。  下面的列表给出了

  • Django Cookie与session的运用

    cookie和session 1、cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生。 cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。 2、cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session。 基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的cookie就起到桥接的作用。 我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。 3、总结而言:cookie弥补了http无状态的不足,

  • win 10 神州网信开启远程

    原文地址:https://blog.csdn.net/qq_38638853/article/details/119570419   下面亲测有效 版本:Windows10企业版G神州网信政府版 步骤如下: 1.打开运行窗口中输入命令gpedit.msc,打开本地组策略编辑器,计算机配置》管理模板》Windows组件》远程桌面服务》远程桌面会话主机》连接》允许用户通过使用远程桌面服务进行远程连接,状态改为未配置,默认是已启用。 2.打开此电脑》右键“属性”》远程,设置分为两步:第一步,勾选“允许远程连接到此计算机,并取消近允许运行使用网络......”(必须完成第一步,否则远程桌面是灰色的,无法设置)第二部,点击选择用户,将当前登录用户添加进去(该版本系统不允许使用amdinistrator) 3.打开运行窗口中输入命令gpedit.msc,打开本地组策略编辑器,计算机配置》Windows设置》安全设置》本地策略》用户权限分配,在右侧查找“从网络访问此计算机”以及“允许通过远程桌面服务登录”,双击打开,增加你要添加的用户或者当前用户。 4.打开运行窗口中输入命令gp

  • windows 2008 r2 安装 owas 2013

    windows2008r2 安装 owas2013  1.NDP452-KB2901907-x86-x64-AllOS-ENU 2.Add-WindowsFeatureWeb-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices,NET-Framework-Features,NET-Framework-Core,NET-HTTP-Activation,NET-Non-HTTP-Activ,N

  • VSTO开发指南(VB2013版) 第四章 Excel编程

    实例1:处理NewWorkbook和WorkSheet事件的控制台程序书本第70页 程序清单4.1 处理NewWorkbook和WorkSheet事件的控制台程序 ImportsExcel=Microsoft.Office.Interop.Excel ImportsSystem.Windows.Forms ModuleModule1 PrivateWithEventsappAsExcel.Application PrivateWithEventsworkbookAsExcel.Workbook PrivateexitXLAsBoolean=False SubMain() app=NewExcel.Application() app.Visible=True 'WecasttoAppEvents_Eventwhenaddinganeventhandler 'dynamicallyusingAddHandlerbecauseNewWorkbook 'isthenameofbothapropertyandanevent. AddHandlerCType(app,Excel

  • 洛谷 P3112 后卫马克Guard Mark

    ->题目链接 题解: 贪心+模拟 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> usingnamespacestd; constintinf=1e9+7; intn,H,h[25],w[25],s[25],f[(1<<20)+1],g[(1<<20)+1],ans=-1; intmain(){ scanf("%d%d",&n,&H); for(inti=0;i<=n-1;i++) scanf("%d%d%d",&h[i],&w[i],&s[i]); memset(f,-1,sizeof(f)); f[0]=inf; for(inti=0;i<=(1<<n)-1;i++) for(intj=0;j<=n-1;j++) if(f[i]>=w[j]){ if((i>>j)&1)continue; intk=i^(

  • 20220712Qt项目查询 part2

    QByteArray的使用 https://wenku.baidu.com/view/db10ca39ff4ffe4733687e21af45b307e871f9f3.html https://blog.csdn.net/qq_41653875/article/details/110739250         Qt error:withinthiscontext 成员函数是private而不是public的。更改成public就可以了。 https://blog.csdn.net/lxj362343/article/details/112787874     关于错误信息:cannotcallmemberfunction''withoutobject https://blog.csdn.net/sinat_33859977/article/details/90694805 需要定义一个对象才能调用成员函数。如果想直接引用,可以声明函数为static静态的        

  • Javascript的事件模型和Promise实现

    1.Javascript的运行时模型——事件循环 JS的运行时是个单线程的运行时,它不像其他编程语言,比如C++,Java,C#这些可以进行多线程操作的语言。当它执行一个函数时,它只会一条路走到黑,不会在当前函数结束之前去调用其他的函数(除非当前函数主动调用其他函数)。它也不用担心会有其他线程打扰它,因为它的运行时只有一个线程。如果你还记得一些计算机原理的话,这种运行时只有一个栈,设计起来相当的简单。 一条路走到黑的设计很棒,因为它足够简单,但是又是谁决定哪个函数从开始进入栈内执行呢?答案是JS的运行时还有一个事件等待队列与栈搭配,每当运行栈为空时(也就是当前函数运行结束),JS的运行时就从当前的事件队列中取出一个消息处理,执行与这个消息相关联的函数。这种行为可以用以下代码来说明: 1while(eventQueue.waitForMessage()){ 2letevent=eventQueue.pop(); 3lethandler=event.handler; 4handler();//执行事件关联的函数 5context.scheduler.schedule();//让

相关推荐

推荐阅读