web-dev-qa-db-ja.com

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

IOSの他のアプリと共有する方法を知りたいという思いから検索を始めました。 2つの重要な方法が

  • UIActivityViewController
  • UIDocumentInteractionController

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

私が新しい概念を学んでいるとき、私は私を始めるための基本的な例を見るのが好きです。基本的な設定ができたら、後でそれを変更することができます。

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

93
Suragch

UIActivityViewControllerサンプルプロジェクト

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

enter image description here

Assets.xcassetsに画像を追加します。私は私のことを「ライオン」と呼びました。

enter image description here

コード

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

}

結果

[テキストを共有する]をクリックすると左側に結果が表示され、[イメージを共有する]をクリックすると右側に結果が表示されます。

enter image description here

ノート

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

また見なさい

235
Suragch

共有:テキスト

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

enter image description here

46

あなたが全画面を共有したい場合、私はこれが完璧に動作することがわかりました。

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

メモとして、iPadでもこれを使用できます。

activityViewController.popoverPresentationController?.sourceView = sender

そのため、ポップオーバーは送信者(その場合はボタン)から飛び出します。

5

あなたは私がプロジェクトの私のヘルパークラスの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)
}
2
Mahmud Ahsan