Основной пример для совместного использования текста или изображения с UIActivityViewController в Swift
Я начал свой поиск, желая знать, как я могу поделиться с другими приложениями в iOS. Я обнаружил, что два важных направления
UIActivityViewControllerUIDocumentInteractionController
эти и другие методы сравниваются в это так ответ.
часто, когда я изучаю новую концепцию, мне нравится видеть основной пример, чтобы начать работу. Как только я получу что-то основное, я могу изменить его, как мне нравится позже.
есть многие так вопросы, связанные с UIActivityViewController, но я не мог найти ни одного, который просто просил простой пример. Поскольку я только что узнал, как это сделать, я дам свой собственный ответ ниже. Не стесняйтесь добавлять лучший (или версию Objective-C).
5 ответов:
UIActivityViewController Пример Проекта
установите раскадровку с двумя кнопками и подключите их к контроллеру вида (см. код ниже).
добавить изображение к вашим активам.xcassets. Я назвал свой "Лев".
код
import UIKit class ViewController: UIViewController { // share text @IBAction func shareTextButton(_ sender: UIButton) { // text to share let text = "This is some text that I want to share." // set up activity view controller let textToShare = [ text ] let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash // exclude some activity types from the list (optional) activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ] // present the view controller self.present(activityViewController, animated: true, completion: nil) } // share image @IBAction func shareImageButton(_ sender: UIButton) { // image to share let image = UIImage(named: "Image") // set up activity view controller let imageToShare = [ image! ] let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash // exclude some activity types from the list (optional) activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ] // present the view controller self.present(activityViewController, animated: true, completion: nil) } }результат
щелчок "поделиться некоторым текстом" дает результат слева, а щелчок "поделиться изображением" дает результат справа.
Примечания
- я повторно протестировал это с iOS 11 и Swift 4. Мне пришлось запустить его пару раз в симуляторе, прежде чем он сработал, потому что это был тайм-аут. Это может быть потому, что мой компьютер работает медленно.
- если вы хотите, чтобы скрыть некоторые из этих вариантов, вы можете сделать это с
excludedActivityTypesкак показано в коде выше.- не включая
popoverPresentationController?.sourceViewline приведет к сбою вашего приложения при запуске на iPad.- это не позволяет обмениваться текстом или изображениями с другими приложениями. Вы, наверное, хотите
UIDocumentInteractionControllerдля этого.см. также
поделиться : текст
@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) } }поделиться : изображения
@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) }поделиться : текст-изображение-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) }
Так же, как Примечание, Вы можете также использовать это для iPad:
activityViewController.popoverPresentationController?.sourceView = senderТак поповер выскакивает из отправителя (кнопка в этом случае).
Я обнаружил, что это работает безупречно, если вы хотите поделиться весь экран.
@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) }
вы можете использовать следующие функции, которые я написал в одном из моих вспомогательных классов в проекте.
просто позвони
showShareActivity(msg:"message", image: nil, url: nil, sourceRect: nil)и он будет работать как для iPhone, так и для iPad. Если вы передадите значение CGRect любого представления sourceRect, он также покажет небольшую стрелку в iPad.
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) }




Comments