Основний приклад обміну текстом або зображеннями з UIActivityViewController в Swift


131

Я розпочав пошук, бажаючи дізнатися, як я можу ділитися іншими програмами в iOS. Я виявив, що два важливі шляхи

  • UIActivityViewController
  • UIDocumentInteractionController

Ці та інші методи порівнюються у цій відповіді ТА .

Часто, коли я вивчаю нову концепцію, мені подобається бачити основний приклад, щоб розпочати мене. Як тільки я отримаю щось основне налаштування, я можу змінити його, як мені подобається пізніше.

Є багато питань, пов'язаних з цим UIActivityViewController, але я не міг знайти жодного, який просто просив би простий приклад. Оскільки я тільки навчився це робити, я подаю свою власну відповідь нижче. Не соромтеся додати кращу (або версію Objective-C).

Відповіді:


279

Приклад проекту UIActivityViewController

Налаштуйте свою раскадровку за допомогою двох кнопок і підключіть їх до контролера перегляду (див. Код нижче).

введіть тут опис зображення

Додайте зображення до 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

@ Suragch: Привіт, я хочу поділитися кодом рефералу в тексті і мені потрібно, щоб цей код був скопійований при натисканні або натисканні, як це відбувається, коли ми надсилаємо номер.
Ішика

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 тільки посилання - це спільне використання зображення та тексту.
Екта Падалія

@ScriptKitty. Чи правильно налаштовано додаток для повідомлень із обліковим записом i Cloud?
Awais Fayyaz

1
@EktaPadaliya. Відповідно до політики оновлення FB, можна ділитися або URL-адресою, або зображенням. текст не вдається
Awais Fayyaz


2
@ Образ Mr.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 = відправник як? UIView - працював для мене. :) дякую
Брайан

Поле "Поділитися" не з'являлося для iPad. Це вирішило проблеми з iPad, які у мене виникли!
Завантажити Asp

3

Ви можете використовувати такі функції, які я написав в одному зі своїх помічників у проекті.

просто зателефонуйте

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

і він буде працювати як для iPhone, так і для iPad. Якщо ви передасте значення CGRect будь-якого виду на sourceRect, воно також покаже невелику стрілку в 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

Замість серії ifтверджень можна писати [url, image, msg].compactMap({ $0 }).
Аві

3

Я використав реалізацію вище, і тепер я зрозумів, що вона не працює на iPad під керуванням iOS 13. Мені потрібно було додати ці рядки перед викликом 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)
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.