Swift'de UIActivityViewController ile metin veya görüntü paylaşmak için temel örnek


132

Aramama iOS'taki diğer uygulamalarla nasıl paylaşabileceğimi öğrenmek isteyerek başladım. İki önemli yolun olduğunu keşfettim

  • UIActivityViewController
  • UIDocumentInteractionController

Bunlar ve diğer yöntemler bu SO cevabında karşılaştırılır .

Genellikle yeni bir kavram öğrenirken, başlamamı sağlayacak temel bir örnek görmeyi severim. Temel bir kurulum aldığımda, daha sonra istediğim gibi değiştirebilirim.

İle ilgili birçok SO sorusu var UIActivityViewController, ancak sadece basit bir örnek isteyen hiçbir soru bulamadım. Bunu nasıl yapacağımı yeni öğrendiğim için aşağıda kendi cevabımı vereceğim. Daha iyi bir tane (veya Objective-C sürümü) eklemekten çekinmeyin.

Yanıtlar:


279

UIActivityViewController Örnek Projesi

Film şeridinizi iki düğmeyle ayarlayın ve bunları görünüm denetleyicinize bağlayın (aşağıdaki koda bakın).

görüntü açıklamasını buraya girin

Assets.xcassets'inize bir görüntü ekleyin. Benimkine "aslan" dedim.

görüntü açıklamasını buraya girin

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

}

Sonuç

"Metni paylaş" seçeneğine tıklamak solda sonucu verir ve "Görsel paylaş" seçeneğine tıklamak sağda sonucu verir.

görüntü açıklamasını buraya girin

notlar

  • Bunu iOS 11 ve Swift 4 ile tekrar test ettim. Çalışmadan önce simülatörde birkaç kez çalıştırmam gerekti çünkü zaman aşımına uğradı. Bunun nedeni bilgisayarımın yavaş olması olabilir.
  • Bu seçimlerden bazılarını gizlemek isterseniz, bunu excludedActivityTypesyukarıdaki kodda gösterildiği gibi yapabilirsiniz.
  • popoverPresentationController?.sourceViewÇizginin dahil edilmemesi, uygulamanızın bir iPad'de çalıştırıldığında çökmesine neden olur.
  • Bu, diğer uygulamalarla metin veya resim paylaşmanıza izin vermez. Muhtemelen bunu istiyorsun UIDocumentInteractionController.

Ayrıca bakınız


1
Neden bazı örnekler 1 öğelik bir dizi gösteriyor ve bazıları 2'yi gösteriyor? Bir görüntüyü paylaştığını varsayarsak.
Lim Thye Chean

@ Suragch: Merhaba Metinde bir yönlendirme kodu paylaşmak istiyorum ve bu kodun bir numara gönderdiğimizde tıklandığında veya dokunulduğunda kopyalanması gerekiyor.
Ishika

75

Paylaş: Metin

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

Paylaş: Resim

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

Paylaş: Metin - Resim - 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)
   }

görüntü açıklamasını buraya girin


4
hey, çalışmıyor. FB'de yalnızca bağlantı, görüntü ve metin değil paylaşımdır.
Ekta Padaliya

@ScriptKitty. Mesajlar uygulaması bir i bulut hesabıyla doğru şekilde yapılandırılmış mı?
Awais Fayyaz

1
@EktaPadaliya. FB güncelleme politikasına göre, bir URL veya bir görüntü paylaşılabilir. metin olamaz
Awais Fayyaz


2
@ Mr.JavedMultani resmi whatsapp'ta paylaşılmıyor
NickCoder

10

Tüm ekranı paylaşmak istiyorsanız, bunun kusursuz çalıştığını buldum.

@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

Bir not olarak, bunu iPad'ler için de kullanabilirsiniz:

activityViewController.popoverPresentationController?.sourceView = sender

Böylece, açılır pencere gönderenden açılır (bu durumda düğme).


activityViewController.popoverPresentationController? .sourceView = gönderen? UIView -benim için çalıştı. :) teşekkürler
Brian

Paylaşım kutusu iPad'ler için gelmiyordu. Bu, yaşadığım iPad sorunlarını çözdü!
Asp Upload

3

Bir projede yardımcı sınıfımdan birinde yazdığım aşağıdaki işlevleri kullanabilirsiniz.

sadece ara

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

ve hem iPhone hem de iPad için çalışacak. Herhangi bir görünümün CGRect değerini sourceRect ile iletirseniz, iPad'de de küçük bir ok gösterecektir.

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

Mükemmel Çalışıyor! 👍🏻
Ravindra_Bhati

Bir dizi ififade yerine yazabilirsiniz [url, image, msg].compactMap({ $0 }).
Avi

3

Yukarıdaki uygulamayı kullandım ve şimdi iOS 13 çalıştıran iPad'de çalışmadığını öğrendim. Çalışması için present () çağrısından önce bu satırları eklemem gerekiyordu.

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

Benim için böyle çalışıyor

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)
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.