代码之家  ›  专栏  ›  技术社区  ›  OscarVGG

iOS 11 PDFKit未更新注释位置

  •  2
  • OscarVGG  · 技术社区  · 7 年前

    我正在开发一个在iPad上编辑PDF的应用程序。

    我正在尝试使用我添加到PDFView的superview中的panGesture识别器来实现注释的拖动。问题是,注释的新矩形边界被分配,但更改不会反映在屏幕上。

    这是我的代码:

    @objc func handlePanGesture(panGesture: UIPanGestureRecognizer) {
        let touchLocation = panGesture.location(in: pdfView)
    
        guard let page = pdfView.page(for: touchLocation, nearest: true) else {
            return
        }
        let locationOnPage = pdfView.convert(touchLocation, to: page)
    
        switch panGesture.state {
        case .began:
    
               guard let annotation = page.annotation(at: locationOnPage) else {
                    return
                }
                currentlySelectedAnnotation = annotation
        case .changed:
    
            guard let annotation = currentlySelectedAnnotation else {
                return
            }
            let initialBounds = annotation.bounds
            annotation.bounds = CGRect(origin: locationOnPage,
                                       size: initialBounds.size)
    
            print("move to \(locationOnPage)")
        case .ended, .cancelled, .failed:
            break
        default:
            break
        }
    }
    

    希望你能帮助我。

    3 回复  |  直到 7 年前
        1
  •  3
  •   OscarVGG    7 年前

    好吧,既然没有人回答。我认为框架中有一个bug,所以经过一段时间的试错之后,我会发布对我有用的东西。

    let initialBounds = annotation.bounds
    annotation.bounds = CGRect(
            origin: locationOnPage,
            size: initialBounds.size)
    page.removeAnnotation(annotation)
    page.addAnnotation(annotation)
    

    它不优雅,但很管用

        2
  •  0
  •   Fabian    7 年前

    使用Bezierpath,整个Bezierpath在边界变化时移动。

        3
  •  0
  •   Rajee Jones    6 年前

    我在代码中添加了一行,这样在拖动时,它会将注释中心放在手指拖动的位置

        case .changed:
    
            guard let annotation = currentlySelectedAnnotation else {
                return
            }
            let initialBounds = annotation.bounds
            // Set the center of the annotation to the spot of our finger
            annotation.bounds = CGRect(x: locationOnPage.x - (initialBounds.width / 2), y: locationOnPage.y - (initialBounds.height / 2), width: initialBounds.width, height: initialBounds.height)
    
    
            print("move to \(locationOnPage)")
        case .ended, .cancelled, .failed:
            currentlySelectedAnnotation = nil
        default:
            break
        }
    }