Основной пример для обмена текстом или изображением с помощью 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)
}