Podstawowy przykład udostępniania tekstu lub obrazu za pomocą interfejsu UIActivityViewController w języku Swift
Zacząłem poszukiwania, chcąc wiedzieć, jak mogę udostępniać inne aplikacje w systemie iOS. Odkryłem, że dwa ważne sposoby są
UIActivityViewController
UIDocumentInteractionController
Te i inne metody są porównywane w to więc odpowiedź.
Często, gdy uczę się nowej koncepcji, Lubię zobaczyć podstawowy przykład, który pomoże mi zacząć. Jak tylko dostanę coś podstawowego skonfigurować mogę go modyfikować jak lubię później.
Jest wiele pytań związanych z UIActivityViewController
, ale nie mogłem znajdź te, które tylko prosiły o prosty przykład. Ponieważ właśnie nauczyłem się, jak to zrobić, podam własną odpowiedź poniżej. Możesz dodać lepszą wersję (lub Objective - C).
5 answers
UIActivityViewController Przykładowy Projekt
Skonfiguruj swój storyboard za pomocą dwóch przycisków i podłącz je do kontrolera widoku(patrz kod poniżej).
Dodaj obraz do swoich zasobów.xcassets. Ja nazwałem swojego "lwem".
Kod
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)
}
}
Wynik
Kliknięcie "Udostępnij tekst" daje wynik po lewej stronie, a kliknięcie "Udostępnij obraz" daje wynik na racja.
Uwagi
- Przetestowałem to ponownie za pomocą iOS 11 i Swift 4. Musiałem uruchomić go kilka razy w symulatorze, zanim zadziałał, ponieważ to było wyczucie czasu. Może to być dlatego, że mój komputer jest powolny.
- jeśli chcesz ukryć niektóre z tych opcji, możesz to zrobić za pomocą
excludedActivityTypes
, Jak pokazano w powyższym kodzie. - Brak linii
popoverPresentationController?.sourceView
spowoduje awarię aplikacji podczas uruchamiania na iPadzie. - to nie pozwala na dzielenie się tekstem lub obrazów do innych aplikacji. Pewnie za to chcesz.
Zobacz też
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 10:49:07
Podziel Się: Tekst
@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)
}
}
Udostępnij: Obraz
@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)
}
Udostępnij: Text-Image-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)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 11:24:44
Tak dla przypomnienia możesz również użyć tego dla ipadów:
activityViewController.popoverPresentationController?.sourceView = sender
Więc wyskakuje z nadawcy (przycisk w tym przypadku).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 19:04:04
Stwierdziłem, że to działa bez zarzutu, jeśli chcesz udostępnić cały ekran.
@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)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 12:46:09
Możesz używać następujących funkcji, które napisałem w jednej z moich klas pomocniczych w projekcie.
Po Prostu zadzwoń
showShareActivity(msg:"message", image: nil, url: nil, sourceRect: nil)
I będzie działać zarówno na iPhone ' a, jak i iPada. Jeśli przekażesz wartość CGRect dowolnego widoku przez sourceRect, wyświetli się również mała strzałka w iPadzie.
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)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 01:23:24