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

Author: Community, 2016-03-11

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

Tutaj wpisz opis obrazka

Dodaj obraz do swoich zasobów.xcassets. Ja nazwałem swojego "lwem".

Tutaj wpisz opis obrazka

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.

Tutaj wpisz opis obrazka

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ż

 200
Author: Suragch,
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)
   }

Tutaj wpisz opis obrazka

 21
Author: Mr.Javed Multani,
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).

 5
Author: Adrien Brecheteau,
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)
}
 5
Author: Diavel Rider,
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)
}
 2
Author: Mahmud Ahsan,
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