Rozpocząłem wyszukiwanie, chcąc wiedzieć, jak mogę udostępniać pliki innym aplikacjom na iOS. Odkryłem, że istnieją dwa ważne sposoby
UIActivityViewController
UIDocumentInteractionController
Te i inne metody są porównywane w tej odpowiedzi SO .
Często, kiedy uczę się nowej koncepcji, lubię zobaczyć podstawowy przykład, który pomoże mi zacząć. Gdy dostanę coś podstawowego, mogę później zmodyfikować to, jak mi się podoba.
Jest wiele pytań SO związanych z UIActivityViewController
, ale nie mogłem znaleźć żadnego, które dotyczyło tylko prostego przykładu. Ponieważ właśnie się nauczyłem, jak to zrobić, poniżej podam własną odpowiedź. Możesz dodać lepszą (lub wersję Objective-C).
źródło
Udostępnij: tekst
@IBAction func shareOnlyText(_ sender: UIButton) { let text = "This is the text....." let textShare = [ text ] let activityViewController = UIActivityViewController(activityItems: textShare , applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view self.present(activityViewController, animated: true, completion: nil) } }
Udostępnij: Obraz
@IBAction func shareOnlyImage(_ sender: UIButton) { let image = UIImage(named: "Product") let imageShare = [ image! ] let activityViewController = UIActivityViewController(activityItems: imageShare , applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view self.present(activityViewController, animated: true, completion: nil) }
Udostępnij: tekst - obraz - adres URL
@IBAction func shareAll(_ sender: UIButton) { let text = "This is the text...." let image = UIImage(named: "Product") let myWebsite = NSURL(string:"https://stackoverflow.com/users/4600136/mr-javed-multani?tab=profile") let shareAll= [text , image! , myWebsite] let activityViewController = UIActivityViewController(activityItems: shareAll, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view self.present(activityViewController, animated: true, completion: nil) }
źródło
Jako uwaga, możesz również użyć tego dla iPadów:
Więc popover wyskakuje z nadawcy (w tym przypadku przycisk).
źródło
Okazało się, że działa to bezbłędnie, jeśli chcesz udostępnić cały ekran.
@IBAction func shareButton(_ sender: Any) { let bounds = UIScreen.main.bounds UIGraphicsBeginImageContextWithOptions(bounds.size, true, 0.0) self.view.drawHierarchy(in: bounds, afterScreenUpdates: false) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() let activityViewController = UIActivityViewController(activityItems: [img!], applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view self.present(activityViewController, animated: true, completion: nil) }
źródło
Użyłem powyższej implementacji i właśnie teraz dowiedziałem się, że nie działa na iPadzie z systemem iOS 13. Musiałem dodać te linie przed wywołaniem funkcji present (), aby działała
//avoiding to crash on iPad if let popoverController = activityViewController.popoverPresentationController { popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0) popoverController.sourceView = self.view popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) }
Tak to działa u mnie
func shareData(_ dataToShare: [Any]){ let activityViewController = UIActivityViewController(activityItems: dataToShare, applicationActivities: nil) //exclude some activity types from the list (optional) //activityViewController.excludedActivityTypes = [ //UIActivity.ActivityType.postToFacebook //] //avoiding to crash on iPad if let popoverController = activityViewController.popoverPresentationController { popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0) popoverController.sourceView = self.view popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0) } self.present(activityViewController, animated: true, completion: nil) }
źródło
Możesz użyć następujących funkcji, które napisałem w jednej z moich klas pomocniczych w projekcie.
Zadzwoń
showShareActivity(msg:"message", image: nil, url: nil, sourceRect: nil)
i będzie działać zarówno na iPhonie, jak i na iPadzie. Jeśli przekażesz wartość CGRect dowolnego widoku przez sourceRect, wyświetli się również mała strzałka na iPadzie.
func topViewController()-> UIViewController{ var topViewController:UIViewController = UIApplication.shared.keyWindow!.rootViewController! while ((topViewController.presentedViewController) != nil) { topViewController = topViewController.presentedViewController!; } return topViewController } func showShareActivity(msg:String?, image:UIImage?, url:String?, sourceRect:CGRect?){ var objectsToShare = [AnyObject]() if let url = url { objectsToShare = [url as AnyObject] } if let image = image { objectsToShare = [image as AnyObject] } if let msg = msg { objectsToShare = [msg as AnyObject] } let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) activityVC.modalPresentationStyle = .popover activityVC.popoverPresentationController?.sourceView = topViewController().view if let sourceRect = sourceRect { activityVC.popoverPresentationController?.sourceRect = sourceRect } topViewController().present(activityVC, animated: true, completion: nil) }
źródło
if
zdań możesz pisać[url, image, msg].compactMap({ $0 })
.