Add a UIView to a PDF page

This guide demonstrates how to make a `UIView` appear as if it is stuck to a page.

It is convenient for the user to make a UIView that is "stuck" to a page record its desired page location. To do this, you could add an extension/category to a UIView, or use a derived class, as shown below:

1class FloatingView: UIView {
2 // the page on which the UIView appears
3
4 var pageNumber: Int32 = 0
5 // the location, expressed in PDF coordinates, at which the view appears
6 var pdfPageRect: PTPDFRect?
7}

In this example, we will add a red square to a location near the bottom left hand corner of the first page:

1// prepare the new view
2let redRect = FloatingView()
3redRect.backgroundColor = UIColor.red
4redRect.pageNumber = 1
5redRect.pdfPageRect = PTPDFRect(x1: 10, y1: 10, x2: 100, y2: 100)
6// add the view to PTPDFViewCtrl's overlayView
7self.pdfViewCtrl.overlayView.addSubview(redRect)
8// position the view
9positionFloatingViews()

Without the last line in the code snippet above, the new view would not appear in the correct location. The following method will position it, and any others that have been added:

1func positionFloatingViews() {
2 for case let overlayView as FloatingView in self.pdfViewCtrl.overlayView.subviews {
3 // make sure this is a floating view
4 if type(of: overlayView) === FloatingView.self {
5 var pageHidden = false
6 if !pdfViewCtrl.pagePresentationModeIsContinuous() {
7 pageHidden = !pdfViewCtrl.pageIs(onScreen: overlayView.pageNumber)
8 }
9 overlayView.isHidden = pageHidden
10 var screenRect: CGRect = pdfViewCtrl.pdfRectPage2CGRectScreen(overlayView.pdfPageRect, pageNumber: overlayView.pageNumber)
11 screenRect.origin.x += CGFloat(pdfViewCtrl.getHScrollPos())
12 screenRect.origin.y += CGFloat(pdfViewCtrl.getVScrollPos())
13 overlayView.frame = screenRect
14 }
15 }
16}
Apryse Docs Image

A red `UIView` positioned near the bottom left hand corner of the first page.

Whenever the PDF page shifts within the PTPDFViewCtrl, which may happen when changing the page presentation mode, zooming, and such, the views need to be re-positioned (positionFloatingViews needs to run again). To do this, implement the PTPDFViewCtrl delegate methods pdfScrollViewDidEndZooming: and onLayoutChanged, and in them, call positionFloatingViews:

1func pdfViewCtrl(onLayoutChanged pdfViewCtrl: PTPDFViewCtrl!) {
2 positionFloatingViews()
3}
4func pdfViewCtrl(_ pdfViewCtrl: PTPDFViewCtrl!, pdfScrollViewDidEndZooming scrollView: UIScrollView!, with view: UIView!, atScale scale: Float) {
5 positionFloatingViews()
6}

Did you find this helpful?

Trial setup questions?

Ask experts on Discord

Need other help?

Contact Support

Pricing or product questions?

Contact Sales