@@ -674,17 +674,33 @@ open class GalleryViewController: UIPageViewController, ItemControllerDelegate {
674
674
675
675
case ( _ as ImageViewController , let item as UIImageView ) :
676
676
guard let image = item. image else { return }
677
- let activityVC = UIActivityViewController ( activityItems : [ image] , applicationActivities : nil )
677
+ let activityVC = activityController ( with : [ image] )
678
678
self . present ( activityVC, animated: true )
679
679
680
680
case ( _ as VideoViewController , let item as VideoView ) :
681
681
guard let videoUrl = ( ( item. player? . currentItem? . asset) as? AVURLAsset ) ? . url else { return }
682
- let activityVC = UIActivityViewController ( activityItems : [ videoUrl] , applicationActivities : nil )
682
+ let activityVC = activityController ( with : [ videoUrl] )
683
683
self . present ( activityVC, animated: true )
684
684
685
685
default : return
686
686
}
687
687
}
688
+
689
+ private func activityController( with items: [ Any ] ) -> UIActivityViewController {
690
+ let activityVC = UIActivityViewController ( activityItems: items, applicationActivities: nil )
691
+
692
+ // for MacOS and iPad the activity view needs a source rect and view, otherwise it will crash
693
+
694
+ if UIDevice . current. userInterfaceIdiom == . pad { /// .pad is relevant for iPad and MacCatalyst
695
+ if let popoverController = activityVC. popoverPresentationController {
696
+ popoverController. sourceRect = CGRect ( x: UIScreen . main. bounds. width / 2 , y: UIScreen . main. bounds. height / 2 , width: 0 , height: 0 )
697
+ popoverController. sourceView = self . view
698
+ popoverController. permittedArrowDirections = UIPopoverArrowDirection ( rawValue: 0 )
699
+ }
700
+ }
701
+
702
+ return activityVC
703
+ }
688
704
689
705
public func itemController( _ controller: ItemController , didSwipeToDismissWithDistanceToEdge distance: CGFloat ) {
690
706
0 commit comments