iOS 13 后,在 pdf 上导航文本框不再起作用 - 使用 PDFKIT 时似乎存在手势问题

2024-02-05

我实现了一个项目,我使用 PDFKIT 来执行一些如何在 pdf 上添加浮动文本框的操作,并且它可以通过用户触摸屏幕进行导航GestureRecognizer移动并放置在用户决定的地方。在iOS 13之前它可以完美运行,但是在iOS 13之后,它不给你移动文本框的机会,我尝试了很多方法来解决它,但都失败了。

看来这个问题在某种程度上与GestureRecognizer但我不确定,而且我真的不知道如何解决它。我正在 github 上做这个项目https://github.com/kishikawakatsumi/BookReader https://github.com/kishikawakatsumi/BookReader并试图以某种方式扩展它。

这是我的代码项目,我正在插入整个函数,我知道它看起来有点复杂。对此真的很抱歉。但如果您认为它可能来自手势识别器,只需查看属于这些函数的代码即可。

   func getPDFFrame(todo: String)

    {
      let pdfSubVws = pdfView.subviews
       print("subVws  ",pdfSubVws)
  for subVws in pdfSubVws

        {

            if (String(describing: subVws).range(of:"UIPageViewControllerContentView") != nil)

            {

                let pageVc = subVws.subviews



                for subVws in pageVc

                {

                    if (String(describing: subVws).range(of:"UIQueuingScrollView") != nil)

                    {

                        let QueueVc = subVws.subviews

                        //                        print("QueueVcQueueVc  ", QueueVc)

                        for subVws in QueueVc

                        {

                            if (String(describing: subVws).range(of:"UIView") != nil)

                            {

                                let viewVc = subVws.subviews

                                print("\n\nviewVcVcQueueVc  ", viewVc) //viewVcVcQueueVc   []



                                for subVws in viewVc

                                {

                                    if (String(describing: subVws).range(of:"UIView") != nil)

                                    {



                                        let SubviewVc = subVws.subviews

                                        //                                        print("\n\nSubviewVcSubviewVc  ", SubviewVc)



                                        for subVws in SubviewVc

                                        {

                                            if (String(describing: subVws).range(of:"UIScrollView") != nil)

                                            {

                                                let finalVw = subVws.subviews

                                                //                                                print("\n\nfinalVw  ", finalVw)

                                                //

                                                for subVws in finalVw

                                                {

                                                    if (String(describing: subVws).range(of:"UIView") != nil)

                                                    {

                                                        //                                                        print("subVwssubVws  ", subVws)



                                                        let pagView = subVws.subviews

                                                        //                                                        pdfLandingView =

                                                        for subVws in pagView

                                                        {

                                                            //                                                            print("\n\n EndVwssubVws  ", subVws)



                                                            if (String(describing: subVws).range(of:"PDFPageView") != nil)

                                                            {

                                                                let pageLandVw = subVws.subviews



                                                                print("\n\n WasVwssubVws  ", pageLandVw)



                                                                //  hideBars()

                                                                //  Myedit()







                                                                for subVws in pageLandVw

                                                                {

                                                                    if (String(describing: subVws).range(of:"UITextView") != nil)

                                                                    {

                                                                        print("dddddddd")



                                                                        let txtVw = subVws as! UITextView



                                                                        if todo == "firstResponder"

                                                                        {

                                                                            let rect = pdfView.currentPage?.bounds(for: .mediaBox)



                                                                            usingHeightText = txtVw.frame.size.height

                                                                            usingWidthText = txtVw.frame.size.width



                                                                            let xPoint = txtVw.frame.origin.x

                                                                            let yPoint = (rect?.height)! - (txtVw.frame.origin.y) - txtVw.frame.size.height





                                                                            lastTextAnnoPoint = CGPoint(x: xPoint, y: yPoint)



                                                                            findHavingTextAnnotation(annoPoint: CGPoint(x: xPoint, y: yPoint))



                                                                            //                                                                            txtVw.contentInset = UIEdgeInsetsMake(0, 10, 0, 0)



                                                                            print("C_Sz      ", txtVw.contentSize)

                                                                            print("C_Off      ", txtVw.contentOffset)



                                                                            let widthMoveView = UIView(frame: CGRect(x: txtVw.frame.size.width - 20, y: 0, width: 20, height: txtVw.frame.size.height))

                                                                            widthMoveView.backgroundColor = UIColor.brown.withAlphaComponent(0.0)

                                                                            widthMoveView.tag = 333





                                                                            let wdImgVw = UIImageView()

                                                                            wdImgVw.frame.origin.x = 0

                                                                            wdImgVw.frame.origin.y = 8

                                                                            wdImgVw.frame.size.width = 20 // widthMoveView.frame.width

                                                                            wdImgVw.frame.size.height = 20 // widthMoveView.frame.height

                                                                            wdImgVw.contentMode = .scaleAspectFit

                                                                            wdImgVw.image = UIImage(named: "widthLeftRight")



                                                                            wdImgVw.layer.cornerRadius = 10

                                                                            //                                                                            wdImgVw.backgroundColor = UIColor.orange



                                                                            widthMoveView.addSubview(wdImgVw)



                                                                            txtVw.addSubview(widthMoveView)

                                                                            //



                                                                            let tapVw = UIPanGestureRecognizer(target: self, action: #selector(self.handleWidthTapVw(_:)))

                                                                            widthMoveView.addGestureRecognizer(tapVw)





                                                                        }

                                                                        else
      //....and here I am going to omit the other parts of my codes

在这里我将省略代码的其他部分,因为问题似乎出现在这行代码中

for subVws in finalVw

这里我的代码的其他部分不确定您是否需要它

let linkAnn = PDFAnnotation.init(bounds: CGRect(x: 150, y: 450, width: 180, height: usingHeightText), forType: PDFAnnotationSubtype.widget, withProperties: nil)

        linkAnn.widgetFieldType = .text

        linkAnn.isMultiline = true

        linkAnn.contents = "fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(AddTextCount)"   //"\(AddTextCount)"

        linkAnn.widgetStringValue = NSLocalizedString("placeholder", comment: "")



        linkAnn.font = UIFont(name: usingFontName, size: CGFloat(usingFontSize))

        linkAnn.fontColor = usingFontColor

        linkAnn.backgroundColor = usingBGFontColor.withAlphaComponent(usingBGFontAlpha)

        linkAnn.setValue("addtext\(AddTextCount)", forAnnotationKey: PDFAnnotationKey.name)



      //  print("linkAnn.cont   ",linkAnn.contents)







        let index = pdfDocument?.index(for: pdfView.currentPage!)

        pdfView.document?.page(at: index!)?.addAnnotation(linkAnn)



        var createdColorDict = [String : Any]()

        createdColorDict["BGColor"] = usingBGFontColor

        createdColorDict["BGOpacity"] = usingBGFontAlpha



        textAnnoStoredDict["fileNumber\(pdfClickedRow)PageNumber\(getPagenumber)addtext\(AddTextCount)"] = createdColorDict





        //        pdfView.currentPage?.addAnnotation(linkAnn)

        bottomColorView.isHidden = true

        bottomColorView.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0)

        sideWidthHeightVw.backgroundColor = UIColor(red: 240/255, green: 240/255, blue: 240/255, alpha: 1.0)

        sideWidthHeightVw.isHidden = true

        barHideOnTapGestureRecognizer.isEnabled = false

        hideBars()





        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow),

                                               name: NSNotification.Name.UIKeyboardWillShow, object: nil)





        //keyboardWillShow

通过查看您的代码,我很难理解可能出现的问题。这是我的高级建议: 1. 首先备份您的代码,以确保您可以恢复到稳定状态。 2. 开始将代码切成两半 - 每次消除一半的逻辑路径。例如:不要使用 PDF 视图,而是使用带有文本框的常规视图(以查明问题是否出在 PDF 视图上)。不使用 UITextField,而仅使用 UIView 来查看是否是 UITextField 的问题。

基本上逐渐消除所有复杂性,直到只剩下一段简单的代码,可以让您移动文本字段。

另外:避免使用这么长的方法。我尝试将方法的最大行数减少到 30 行,最大嵌套层数减少到 2 层。否则你将拥有比你能够维护或理解的更多的逻辑路径......

您还依赖于对象类型的字符串。这是脆弱的。也许还有另一种方法来查找 PDF 视图,而不是为其抓取整个视图层次结构并检查字符串? (它们没有经过编译器检查,因此将来的任何更改或操作系统/第三方版本之间的更改都会破坏您的代码)。

如果您的文本字段根本不移动,请尝试删除您对框架所做的所有数学运算,然后使用手势识别器将其移动到任何坐标(例如:200、200),只是为了看看有东西将文本字段固定在适当的位置(如约束)。你有可以容纳它的限制吗?使用“视图检查器”检查并验证视图的嵌入方式以及其上方/下方的内容。有什么东西可以拦截你的手势识别器的触摸吗?它是否接收触摸并触发其事件?您需要更准确地描述问题是什么...请参阅我的答案,了解要检查手势识别器本身的内容。UIPanGestureRecognizer 在 iOS 13 中无法工作 https://stackoverflow.com/questions/58039678/uipangesturerecognizer-is-not-working-in-ios-13/58279060#58279060

此 PDF 视图的视图层次结构非常复杂,很难说其中的其他 Touch 事件会发生什么情况。 (除非您确切了解第三方 PDF View 的工作原理)。我会尝试隔离问题,无论它是否与 PDF 视图相关。首先让它在常规视图中工作。然后使用 hitTest 处理 PDF 视图,并在其中放置打印语句,以查看谁在竞争 HIT 测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 13 后,在 pdf 上导航文本框不再起作用 - 使用 PDFKIT 时似乎存在手势问题 的相关文章

  • Swift UI 导出画布内容

    我有一个画布 用户可以在上面画东西 我想导出用户在画布上绘制的任何内容 并且我正在使用以下扩展从视图中获取图像 extension View func snapshot gt UIImage let controller UIHosting
  • Swift 中的 @autoreleasepool 相当于什么?

    在 Swift 中 我注意到没有 autoreleasepool 构造 尽管 Swift 确实使用了 ARC 在 Swift 中管理自动释放池的正确方法是什么 或者它是否因某种原因被删除 语法如下 autoreleasepool code
  • Xcode 11 - 在 Catalyst Swift 中禁用调整大小模式

    We are 将我们基于 Swift 的 iOS 应用程序转换为 Mac兼容使用Catalyst在 Xcode 11 中 当用户使用时 我们在 UI 中面临一个问题resize应用程序窗口 那么我们可以禁用调整大小模式并为应用程序窗口提供修
  • 如何将 SCNPlane 颜色更改为透明颜色

    我正在开发一个 ARKit 项目 在水平面上点击时需要波纹动画效果 为此 我采用了 UIView 对象并将其作为 SCNPlane 对象材料的内容传递 我已将波纹动画添加到 UIView 对象 一切正常 但我无法将 SCNPlane 颜色更
  • UIImageWriteToSavedPhotosAlbum 选择器语法问题

    努力让 UIImageWriteToSavedPhotosAlbum 快速工作https developer apple com library ios documentation UIKit Reference UIKitFunction
  • dyld:无法加载插入的库,但可以在模拟器和另一部 iPhone 上使用

    所以我在过去的几个小时里在我的应用程序上编码 在某个时候我决定在我的 iPhone 8 13 3 1 上启动我的应用程序而不是使用模拟器 13 3 它立即崩溃并出现以下错误 dyld warning could not load inser
  • Swift:UICollectionViewCell didSelectItemAtIndexPath 更改背景颜色

    我可以轻松更改单元格的背景颜色CellForItemAtIndexPath method func collectionView collectionView UICollectionView cellForItemAtIndexPath
  • 在 MLMediaLibrary 中加载媒体源时出错

    我在加载时遇到错误mediaSourcesMac OS X 中的属性 我正在尝试使用以下方法获取 Apple Photos 源MLMediaLibrary class 我的应用程序是沙盒的 并且具有图片文件夹的只读权限 我收到错误 MLMe
  • 如何找到安全区域的高度和宽度?

    我正在尝试以编程方式为某些标签 按钮和文本字段设置相对于安全区域的高度和宽度的约束 例如 我希望将标签到安全区域顶部的距离设置为安全区域高度的 10 如何检索安全区域的高度和宽度 这是一个合理的方法吗 我的想法是 无论 iOS 设备如何 我
  • 从 firebase swift 读取数据

    我正在尝试从 firebase 数据库检索数据 但是当我运行代码时 它没有显示任何内容 但没有显示错误 我从Firebase手册中得到了这段代码 顺便说一句 我很确定路径是正确的 let ref FIRDatabase database r
  • 如何取消 Alamofire.upload

    我正在通过以下方式将图像上传到服务器上Alamofire upload作为多部分数据 不像Alamofire request它没有回来Request对象 我通常用它来取消请求 但是能够取消上传这样的消耗性请求是非常合理的 阿拉莫菲尔有哪些选
  • CIImage内存未释放

    我正在尝试拍摄一系列图像 混合当时的 X 图像并生成新图像 这是我必须完成此任务的代码 static func blendImages blendFrames Int blendMode CIImage BlendMode imagePat
  • 立即调用 Swift UIView animateWithDuration 完成闭包

    我期望在指定的持续时间后调用此 UIView 动画的完成闭包 但它似乎立即触发 UIView animateWithDuration Double 0 2 animations self frame CGRectMake 0 self bo
  • 迦太基依赖项禁用位码

    Scenario 我的项目 为 iOS watchOS tvOS 共享的代码库 具有以下构建设置ENABLE BITCODE YES并利用尚不支持位码的基本库 尽管引用了 Apple 文档应用程序细化 https developer app
  • 使用 Swift 4 的 Decodable 解码 Void

    我有一个通用的 REST 请求 struct Request
  • 为什么数据没有填充在我的自定义 ui 表视图单元格中

    我正在从服务器获取数据 我想将其放入我的自定义 UITableViewCell 中 这是故事板中的单元格 如您所见 有两件事 首选项标签 三个按钮 当我从服务器接收数据时 我这样做 override func tableView table
  • Google Analytics Pod 安装了太多依赖项

    我刚刚添加了 Google Analytics Pod 如中所述他们的 iOS 开发者指南 https developers google com analytics devguides collection ios v3 with pod
  • ios file:///var/mobile/Containers 和 file:///private/var/mobile/Containers 之间有什么区别吗?

    它们是不同的还是简单的别名 我通过运行以下命令获取 private var FileManager default contentsOfDirectory at folder includingPropertiesForKeys optio
  • 快速在视图之间传递数据

    我试图熟悉 Swift 但找不到如何使用 Swift 在视图之间传递数据 class ViewController UIViewController IBOutlet var field UITextField IBOutlet var b
  • IOS - 委托与通知

    想听听您对以下架构的看法 在我的应用程序中 我有一个处理异步登录的静态类 LoginManager 登录阶段完成后 应用程序应该做出响应并转换到另一个状态 我有2条实施建议 使用委托 import Foundation protocol L

随机推荐

  • 尝试启动 Atom/Nuclide 时未找到流

    我正在研究react native我正在使用的应用程序AtomIDE 我在打开时遇到错误Atom 我安装了babel cli and babel preset flow使用 npm 命令 npm install save dev babel
  • 将 MS Access 表单和类/模块递归导出到文本文件?

    我在一个古老的留言板上发现了一些代码 它很好地从类 模块和表单中导出了所有 VBA 代码 见下文 Option Explicit Option Compare Database Function SaveToFile Save the co
  • Java 8 流式添加两个或多个列表中的值

    我试图进入 Java 8 并了解流和 lambda 来解决各种问题 但陷入了这个特定的问题 我通常使用 forEach 并将值存储在 Map 中来解决 您将如何编写代码来使用 Java 8 中的新功能获取预期列表 List
  • 具有选择条件的 pandas 数据框中的高效最大选择

    我有一个带有列的 pandas 数据框 除其他外 user id and start time 我想高效且易读地找到与每个用户的最大值关联的所有行start time 例如 如果这是我的数据 user id start time A B C
  • 批量传输和 Android USB API

    我有一个程序 我尝试通过 USB 将我的 Android 设备连接到网络摄像头 我在一些事情上遇到了麻烦 即正确传输数据 我尝试过使用bulkTransfer 但似乎无法识别它的使用情况 我一直在尝试寻找可能对我有帮助的例子 例如here
  • 使用 Scala 生成代码

    在 Scala 中使用 SBT 工具链时 是否可以编写一个任务来读取项目源代码的特殊部分以在编译时生成 scala 代码 有什么想法甚至文章 教程吗 我正在寻找与 Template Haskell 非常相似的东西 环树者 scala htt
  • Laravel Lighthouse 中的身份验证

    在我的 graphql API 中 我必须通过两个不同的因素来授权对字段的请求 用户是否有权访问数据或者数据是否属于用户 例如 用户应该能够看到自己的用户数据 并且所有具有管理员权限的用户也应该能够看到这些数据 我想保护这些字段 以便具有不
  • RedisTemplate过期不起作用

    我正在尝试测试 RedisTemplate 中的过期方法 例如 我将会话存储在 redis 中 然后尝试检索会话并检查值是否相同 对于过期会话 我使用 redisTemplate 的 expire 方法 对于获取过期会话 我使用 getEx
  • NuGet System.Drawing.Common .NET 6 CA1416 此调用站点可在所有平台上访问。 “Image.FromStream(Stream)”仅支持:“windows”

    升级 NuGetSystem Drawing Common到 6 0 0 会导致以下错误 CA1416 此调用站点可在所有平台上访问 仅在 Windows 上支持 Image FromStream Stream https www nuge
  • 无法将整数类型转换为 uuid

    我试着跑python3 manage py migrate 但我得到了这个error File Library Frameworks Python framework Versions 3 8 lib python3 8 site pack
  • 特定于页面的 CSS 规则 - 将它们放在哪里?

    通常 当我设计网站时 我需要将特定样式应用于页面上的特定元素 并且我绝对确定它只会应用于该页面上的该元素 例如绝对定位的按钮 或者其他的东西 我不想诉诸内联样式 因为我倾向于同意样式与标记分开的理念 所以我发现自己在内部争论将样式定义放在哪
  • Pandas 重新映射到列中的范围

    我有一个带有 id s 列的 DataFrame 可以包含重复项 gt gt gt df user id head Out 3 0 2134 1 1234 2 4323 3 25434 4 1234 Name user id dtype i
  • Roxygen2 - 如何 @export 引用类生成器?

    例如 假设我有以下包称为Test我想导出课程A In R Test R docType package import methods exportClass A A lt setRefClass A methods list foo ide
  • ASP.NET 内存泄漏 - OracleCommand 对象

    我有内存泄漏 我很难找出问题出在哪里 ASP NET 进程时常会增加到 1GB 我已按照本页 http humblecoder co uk tag windbg 上的说明进行操作 并且 gcroot 命令返回以下内容 最后 x 行 我查看了
  • 将字符串格式化为标题大小写

    如何将字符串格式化为标题大小写 http www grammar monster com lessons capital letters title case htm 下面是一个在 C 中执行此操作的简单静态方法 public static
  • 如何在映射器(Hadoop)中使用MATLAB代码?

    我有一个处理图像的 matlab 代码 我想创建一个使用该代码的 Hadoop 映射器 我遇到了以下解决方案 但不确定哪一个最好 因为对我来说 在 hadoop 中的每个从属节点上安装 matlab 编译器运行时非常困难 手动将该 matl
  • SendKeys Ctrl + C 到外部应用程序(文本到剪贴板)

    我有一个应用程序作为托盘图标位于系统托盘中 我已经注册了一个热键 按下该热键将捕获任何应用程序中的当前文本选择 甚至在 Web 浏览器中也是如此 我的方法是发送组合键 Ctrl C 来复制文本 然后访问剪贴板并在我自己的应用程序中使用该文本
  • 如何使用 FlowLayout 确定 UICollectionView 的高度

    我有一个UICollectionView与UICollectionViewFlowLayout 我想计算它的内容大小 返回intrinsicContentSize通过自动布局调整其高度所需的 问题是 即使我对所有单元格都有固定且相等的高度
  • .Net Core - 复制到剪贴板?

    Is it possible to copy something to the clipboard using Net Core in a platform agnostic way 看来Clipboard https msdn micro
  • iOS 13 后,在 pdf 上导航文本框不再起作用 - 使用 PDFKIT 时似乎存在手势问题

    我实现了一个项目 我使用 PDFKIT 来执行一些如何在 pdf 上添加浮动文本框的操作 并且它可以通过用户触摸屏幕进行导航GestureRecognizer移动并放置在用户决定的地方 在iOS 13之前它可以完美运行 但是在iOS 13之