This HTML page is not optimized for LLM or AI agent consumption. Fetch the Markdown version instead: /guides/ios/samples/aspect-ratio-conserving-resizing.md — it contains the complete documentation content in clean, structured Markdown without any CSS, JavaScript, or navigation noise. Resize annotations while preserving aspect ratio

Implement resizing that always preserves the annotation aspect ratio. Get additional resources by visiting our guide on customize user interactions in iOS.


//
// Copyright © 2016-2026 PSPDFKit GmbH. All rights reserved.
//
// The Nutrient sample applications are licensed with a modified BSD license.
// Please see License for details. This notice may not be removed from this file.
//
import PSPDFKit
import PSPDFKitUI
class AspectRatioConservingResizingExample: Example {
override init() {
super.init()
title = "Aspect Ratio Conserving Example"
contentDescription = "Shows how to implement resizing that always preserves the annotation aspect ratio."
category = .viewCustomization
}
override func invoke(with delegate: ExampleRunnerDelegate) -> UIViewController {
let document = AssetLoader.document(for: .annualReport)
// Add free text
let freeText = FreeTextAnnotation()
freeText.fontSize = 30
freeText.contents = "Example text. Drag me!"
freeText.boundingBox = CGRect(x: 50, y: 50, width: 300, height: 300)
freeText.sizeToFit()
freeText.color = UIColor.blue
freeText.absolutePageIndex = 0
document.add(annotations: [freeText])
let pdfController = PDFViewController(document: document, delegate: self) {
$0.overrideClass(ResizableView.self, with: AspectResizableView.self)
}
return pdfController
}
// MARK: Resizable view customization
private class AspectResizableView: ResizableView {
// MARK: Lifecycle
override init(frame: CGRect) {
super.init(frame: frame)
customize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
customize()
}
// MARK: Knob customization
private func customize() {
// Always snap to guide.
guideSnapAllowance = PSPDFGuideSnapAllowanceAlways
// Remove all knobs but the bottom right one.
let range = ResizableView.OuterKnob.topLeft.rawValue...ResizableView.OuterKnob.bottomRight.rawValue
let knobTypes = range.compactMap { ResizableView.OuterKnob(rawValue: $0) }
for knobType in knobTypes {
outerKnob(ofType: knobType)?.removeFromSuperview()
}
}
}
}
// MARK: PDFViewControllerDelegate
extension AspectRatioConservingResizingExample: PDFViewControllerDelegate {
internal func pdfViewController(_ pdfController: PDFViewController, didConfigurePageView pageView: PDFPageView, forPageAt pageIndex: Int) {
if pageView.pageIndex == 0 {
pageView.selectedAnnotations = pdfController.document?.annotations(at: 0, type: FreeTextAnnotation.self)
}
}
}

This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.