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

Я реализовал проект. Я использовал 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

1 Ответ

1 голос
/ 01 ноября 2019

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

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

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

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

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

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

...