SwiftのUIActivityViewControllerでテキストまたは画像を共有するための基本的な例


130

iOSの他のアプリと共有する方法を知りたいと思って検索を始めました。私は2つの重要な方法があることを発見しました

  • UIActivityViewController
  • UIDocumentInteractionController

これらと他の方法は、このSOの回答で比較されます

新しいコンセプトを学んでいるときは、基本的な例を参考にして始めます。基本的な設定を取得したら、後で好きなように変更できます。

に関連するSOの質問はたくさんありますがUIActivityViewController、単純な例を求めているだけの質問は見つかりませんでした。これを行う方法を学習したばかりなので、以下に自分の答えを示します。より良いもの(またはObjective-Cバージョン)を自由に追加してください。

回答:


278

UIActivityViewControllerサンプルプロジェクト

2つのボタンでストーリーボードを設定し、それらをビューコントローラーに接続します(以下のコードを参照)。

ここに画像の説明を入力してください

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)
    }

}

結果

「テキストを共有」をクリックすると左側に結果が表示され、「画像を共有」をクリックすると右側に結果が表示されます。

ここに画像の説明を入力してください

ノート

  • これをiOS 11とSwift 4で再テストしました。タイムアウトしたため、機能する前にシミュレーターで数回実行する必要がありました。これは私のコンピュータが遅いためかもしれません。
  • これらの選択肢のいくつかを非表示にしたい場合excludedActivityTypesは、上記のコードに示すようにそれを行うことができます。
  • このpopoverPresentationController?.sourceView行を含めないと、iPadで実行したときにアプリがクラッシュします。
  • これにより、テキストや画像を他のアプリと共有することはできません。あなたはおそらくそれUIDocumentInteractionControllerを望んでいます。

こちらもご覧ください


1
一部の例で1項目の配列を示し、一部の例で2を示すのはなぜですか?画像の共有を想定しています。
Lim Thye Chean 2017

@ Suragch:こんにちは私はテキストで紹介コードを共有したいのですが、番号を送信するときに発生するクリックまたはタップでそのコードをコピーする必要があります。
Ishika

73

シェア:テキスト

@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)
   }

ここに画像の説明を入力してください


4
ねえ、それは機能していません。FBではリンクのみが共有され、画像やテキストは共有されません。
Ekta Padaliya 2018年

@ScriptKitty。メッセージアプリはiクラウドアカウントで正しく構成されていますか?
Awais Fayyaz 2018年

1
@EktaPadaliya。FB更新ポリシーに従って、URLまたは画像のいずれかを共有できます。テキストは不可
Awais Fayyaz 2018年


2
@ Jr.JavedMultani画像はwhatsappで共有されません
NickCoder

10

画面全体を共有したい場合、これは問題なく動作することがわかりました。

@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)
}

9

ノートと同じように、iPadでもこれを使用できます。

activityViewController.popoverPresentationController?.sourceView = sender

したがって、ポップオーバーは送信者(その場合はボタン)からポップします。


activityViewController.popoverPresentationController?.sourceView = sender as?UIView-私のために働いた。:)ありがとう
ブライアン

iPad用の共有ボックスは登場していませんでした。これでiPadの問題が解決しました!
Aspアップロード

3

プロジェクトのヘルパークラスの1つで記述した次の関数を使用できます。

電話するだけ

showShareActivity(msg:"message", image: nil, url: nil, sourceRect: nil) 

そしてそれはiPhoneとiPadの両方で動作します。sourceRectでビューのCGRect値を渡すと、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)
}

完璧な作品!👍🏻
Ravindra_Bhati

3

上記の実装を使用したところ、iOS 13を実行しているiPadでは機能しないことがわかりました。機能させるには、present()呼び出しの前にこれらの行を追加する必要がありました。

//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)
}

それは私にとってそれがどのように機能するかです

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)
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.