I have the same problem and I switched to using UIActivityViewController . However, this makes applications that can open PDFs no longer display, so maybe this is not what you want.
Minimum Solution:
If you want to do the minimal work, you donβt even need to read the PDF file in NSData , use NSURL as an activity element, and iOS seems to know what to do:
- (void)share:(id)sender { UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:@[self.URL] applicationActivities:nil]; if ([activity respondsToSelector:@selector(popoverPresentationController)]) { activity.popoverPresentationController.barButtonItem = <# BAR BUTTON ITEM #>; } [self presentViewController:activity animated:YES completion:NULL]; }
Original answer:
Make your view controller bound to the UIActivityItemSource protocol, then you can do:
- (void)share:(id)sender { self.pdfData = [NSData dataWithContentsOfURL:self.URL]; UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:@[self] applicationActivities:nil]; if ([activity respondsToSelector:@selector(popoverPresentationController)]) { activity.popoverPresentationController.barButtonItem = <# BAR BUTTON ITEM #>; } [self presentViewController:activity animated:YES completion:NULL]; }
Adhering to the protocol, if you have a PDF file, this is relatively simple. You can, of course, optimize and return smaller NSData and even a preview image, but minimally do this:
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { return _pdfData; } - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { return _pdfData; } - (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType { return self.title; } - (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType { return @"com.adobe.pdf"; }
Pascal
source share