Customizing Lists of Annotations on iOS
PSPDFKit allows you to customize the annotation list. Here are the two approaches to customizing settings in the AnnotationTableViewController
:
-
Subclass the view controller, and then register your subclass,
overrideClass(_:with:)
, in thePDFConfigurationBuilder
. Configure any properties in theinit
method of the subclass.
-
Use the
pdfViewController(_:shouldShow:options:animated:)
delegate.
This is a more advanced customization because the annotation controller is packed inside a container view controller unless all other view controller options are disabled in the outline bar button:
static func PSCContainedControllerOfClass<U: UIViewController, T>(container controller: U, klass: T.Type) -> T? { if let vc = controller as? T { return vc } else if let topVC = (controller as? UINavigationController)?.topViewController { return PSCContainedControllerOfClass(container: topVC, klass: klass) } else if let containerVC = controller as? ContainerViewController { for viewController in containerVC.viewControllers { if let containedVC = PSCContainedControllerOfClass(container: viewController, klass: klass) { return containedVC } } } return nil } func pdfViewController(_ pdfController: PDFViewController, shouldShow controller: UIViewController, options: [String : Any]? = nil, animated: Bool) -> Bool { let annotationController = PSCContainedControllerOfClass(container: controller, klass: AnnotationTableViewController.self) annotationController?.showDeleteAllOption = false // Only show ink, highlight, and stamp annotations in the annotation list. annotationController?.visibleAnnotationTypes = [.ink, .highlight, .stamp] return true }
static id PSCControllerForClass(id theController, Class klass) { if ([theController isKindOfClass:klass]) { return theController; }else if ([theController isKindOfClass:UINavigationController.class]) { return PSCControllerForClass(((UINavigationController *)theController).topViewController, klass); }else if ([theController isKindOfClass:PSPDFContainerViewController.class]) { for (UIViewController *contained in ((PSPDFContainerViewController *)theController).viewControllers) { if (PSCControllerForClass(contained, klass)) return PSCControllerForClass(contained, klass); } } return nil; } - (BOOL)pdfViewController:(PSPDFViewController *)pdfController shouldShowController:(UIViewController *)controller options:(nullable NSDictionary<NSString *, id> *)options animated:(BOOL)animated { PSCLog(@"shouldShowViewController: %@ animated: %d.", controller, animated); PSPDFAnnotationTableViewController *annotCtrl = PSCControllerForClass(controller, PSPDFAnnotationTableViewController.class); annotCtrl.showDeleteAllOption = NO; // Only show ink, highlight, and stamp annotations in the annotation list. annotCtrl.visibleAnnotationTypes = [NSSet<PSPDFAnnotationString> setWithArray:@[PSPDFAnnotationStringInk, PSPDFAnnotationStringHighlight, PSPDFAnnotationStringStamp]]; return YES; }