IOSの他のアプリと共有する方法を知りたいという思いから検索を始めました。 2つの重要な方法が
UIActivityViewController
UIDocumentInteractionController
これらの方法と他の方法は、このSO答えで 比較されています 。
私が新しい概念を学んでいるとき、私は私を始めるための基本的な例を見るのが好きです。基本的な設定ができたら、後でそれを変更することができます。
UIActivityViewController
に関連するSO質問はたくさんありますが、単純な例を求めているだけのものは見つかりませんでした。私はこれを行う方法をちょうど学んだので、私は私自身の答えを以下に提供します。もっと良いもの(またはObjective-Cバージョン)を追加してください。
ストーリーボードを2つのボタンで設定し、それらをView Controllerに接続します(下記のコードを参照)。
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)
}
}
[テキストを共有する]をクリックすると左側に結果が表示され、[イメージを共有する]をクリックすると右側に結果が表示されます。
excludedActivityTypes
name__でそれを行うことができます。popoverPresentationController?.sourceView
行を含めないと、iPadで実行したときにアプリがクラッシュします。UIDocumentInteractionController
name__が必要です。UIActivityViewController
name__のドキュメントUIDocumentInteractionController
nameとの 比較__共有:テキスト
@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)
}
あなたが全画面を共有したい場合、私はこれが完璧に動作することがわかりました。
@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)
}
メモとして、iPadでもこれを使用できます。
activityViewController.popoverPresentationController?.sourceView = sender
そのため、ポップオーバーは送信者(その場合はボタン)から飛び出します。
あなたは私がプロジェクトの私のヘルパークラスの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)
}