Навигация по текстовому полю в PDF-файле больше не работает после iOS 13 - кажется, проблема с жестами с использованием PDFKIT

Я реализовал проект, который использовал PDFKIT, чтобы каким-то образом добавить плавающее текстовое поле в PDF-файл, и он может перемещаться по касанию экрана пользователями, используя GestureRecognizer для перемещения и размещения там, где решат пользователи. он отлично работал до iOS 13, но после этого он не дает вам возможности переместить текстовое поле, и я пробовал много способов решить эту проблему, но все потерпели неудачу.

Похоже, что проблема как-то связана с GestureRecognizer но я не уверен, а также я действительно не знаю, как это исправить. Я работал над этим проектом на github 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

person neda Derakhshesh    schedule 29.10.2019    source источник


Ответы (1)


Мне трудно понять, в чем может быть проблема, глядя на ваш код. Вот мое общее предложение: 1. Сначала сделайте резервную копию вашего кода, чтобы убедиться, что вы можете вернуться к своему стабильному состоянию. 2. Начните сокращать код пополам, каждый раз удаляя половину логического пути. Например: вместо использования представления PDF используйте обычное представление с текстовым полем (чтобы выяснить, связана ли проблема с представлением PDF). Вместо использования UITextField используйте только UIView, чтобы увидеть, не связана ли проблема с UITextField.

В основном удаляйте всю сложность постепенно, пока у вас не останется простой фрагмент кода, который позволяет вам перемещать текстовое поле.

Также: избегайте таких длинных методов. Я стараюсь сократить количество методов до 30 строк и максимум 2 уровня вложенности. В противном случае у вас будет больше логических путей, чем вы можете поддерживать или понимать...

Вы также полагаетесь на строки для типов объектов. Это хрупко. Может быть, есть другой способ найти представление PDF вместо того, чтобы сканировать всю иерархию представлений и проверять строки? (Они не проверяются компилятором, поэтому любое изменение в будущем или изменение между версиями ОС/сторонних разработчиков нарушит ваш код).

Если ваше текстовое поле вообще не двигается, попробуйте удалить всю ту математику, которую вы делаете с фреймом, и просто заставьте его перемещаться с помощью распознавателя жестов в любую координату (например: 200, 200), просто чтобы увидеть, что что-то удерживает текстовое поле на месте (например, ограничение). Есть ли у вас ограничения, которые могут его удерживать? Используйте «Инспектор представлений», чтобы проверить, как встроено представление и что находится выше/под ним. Есть ли что-нибудь, что может перехватывать прикосновения к вашему распознавателю жестов? Получает ли он касания и запускает ли это событие? Вам нужно более точно описать, в чем проблема... Пожалуйста, обратитесь к моему ответу здесь, чтобы узнать, что нужно проверить на самом распознавателе жестов. UIPanGestureRecognizer не работает в iOS 13

Ваша иерархия представлений настолько сложна с этим представлением PDF, что трудно сказать, что может происходить с другими событиями Touch внутри него. (если вы точно не понимаете, как работает сторонний PDF-просмотр). Я бы попытался изолировать проблему, связана ли она с просмотром PDF или нет. Сначала заставьте его работать в обычном представлении. Затем поработайте с представлением PDF с помощью hitTest и поместите туда оператор печати, чтобы увидеть, кто соревнуется за тест HIT.

person FranticRock    schedule 01.11.2019
comment
Большое спасибо. Я стараюсь изо всех сил. Я очень ценю все ваши инструкции, - person neda Derakhshesh; 02.11.2019
comment
Я думаю, что мне действительно нужна дополнительная помощь, если возможно, пожалуйста, дайте мне знать, большое спасибо. - person neda Derakhshesh; 02.11.2019
comment
Нет, к сожалению, еще нет @McDonal_11 - person neda Derakhshesh; 16.11.2019
comment
@McDonal_11 Привет, я все еще работаю, но безуспешно. Знаете ли вы кого-нибудь, кто может мне как-то помочь? - person neda Derakhshesh; 02.12.2019