Основной пример для обмена текстом или изображением с помощью UIActivityViewController в Swift
Я начал свой поиск, желая узнать, как я могу поделиться с другими приложениями в iOS. Я обнаружил, что два важных способа:
-
UIActivityViewController
-
UIDocumentInteractionController
Эти и другие методы сравниваются в этом SO-ответе.
Часто, когда я изучаю новую концепцию, мне нравится видеть базовый пример, чтобы начать меня. Как только я получу что-то базовое, я могу изменить его, как мне нравится позже.
Есть много вопросов SO, связанных с UIActivityViewController
, но я не мог найти ни одного, просто запрашивающего простой пример. Поскольку я только что научился этому, я дам свой ответ ниже. Не стесняйтесь добавлять лучшую версию (или версию Objective-C).
Ответы
Ответ 1
Проект примера UIActivityViewController
Настройте раскадровку двумя кнопками и подключите их к контроллеру вида (см. код ниже).
![введите описание изображения здесь]()
Добавьте изображение в свои Assets.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)
}
}
Результат
Нажав "Share some text", вы получите результат слева, а нажатие "Share a image" дает результат справа.
![введите описание изображения здесь]()
Примечания
- Я повторил это с помощью iOS 11 и Swift 4. Я должен был запустить его пару раз в симуляторе, прежде чем он сработает, потому что это таймаут. Возможно, это связано с тем, что мой компьютер работает медленно.
- Если вы хотите скрыть некоторые из этих вариантов, вы можете сделать это с помощью
excludedActivityTypes
, как показано в приведенном выше коде.
- Не включая строку
popoverPresentationController?.sourceView
приведет к сбою вашего приложения при запуске на iPad.
- Это не позволяет вам делиться текстом или изображениями с другими приложениями. Вы, вероятно, хотите
UIDocumentInteractionController
для этого.
См. также
Ответ 2
Как примечание, вы также можете использовать его для iPads:
activityViewController.popoverPresentationController?.sourceView = sender
Таким образом, popover появляется из отправителя (кнопка в этом случае).
Ответ 3
Я нашел, что это работает безупречно, если вы хотите разделить весь экран.
@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)
}
Ответ 4
Вы можете использовать следующие функции, которые я написал в одном из моих вспомогательных классов в проекте.
просто позвоните
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)
}