Ví dụ cơ bản để chia sẻ văn bản hoặc hình ảnh với UIActivityViewControll trong Swift


130

Tôi bắt đầu tìm kiếm bằng cách muốn biết làm thế nào tôi có thể chia sẻ với các ứng dụng khác trong iOS. Tôi phát hiện ra rằng hai cách quan trọng là

  • UIActivityViewController
  • UIDocumentInteractionController

Những phương pháp này và các phương pháp khác được so sánh trong câu trả lời SO này .

Thông thường khi tôi đang học một khái niệm mới, tôi muốn thấy một ví dụ cơ bản để giúp tôi bắt đầu. Khi tôi nhận được một cái gì đó cơ bản, tôi có thể sửa đổi nó như thế nào sau này.

Có nhiều câu hỏi SO liên quan đến UIActivityViewController, nhưng tôi không thể tìm thấy bất kỳ câu hỏi nào chỉ yêu cầu một ví dụ đơn giản. Vì tôi chỉ học cách làm điều này, tôi sẽ cung cấp câu trả lời của riêng tôi dưới đây. Vui lòng thêm một phiên bản tốt hơn (hoặc phiên bản Objective-C).

Câu trả lời:


278

Dự án ví dụ UIActivityViewControll

Thiết lập bảng phân cảnh của bạn với hai nút và nối chúng với bộ điều khiển xem của bạn (xem mã bên dưới).

nhập mô tả hình ảnh ở đây

Thêm một hình ảnh vào Assets.xcassets của bạn. Tôi gọi tôi là "sư tử".

nhập mô tả hình ảnh ở đây

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

}

Kết quả

Nhấp vào "Chia sẻ một số văn bản" sẽ cho kết quả ở bên trái và nhấp vào "Chia sẻ hình ảnh" sẽ cho kết quả ở bên phải.

nhập mô tả hình ảnh ở đây

Ghi chú

  • Tôi đã kiểm tra lại điều này với iOS 11 và Swift 4. Tôi đã phải chạy nó một vài lần trong trình giả lập trước khi nó hoạt động vì nó đã hết thời gian. Điều này có thể là do máy tính của tôi chậm.
  • Nếu bạn muốn ẩn một số lựa chọn này, bạn có thể thực hiện điều đó excludedActivityTypesnhư thể hiện trong đoạn mã trên.
  • Không bao gồm popoverPresentationController?.sourceViewdòng sẽ khiến ứng dụng của bạn bị sập khi chạy trên iPad.
  • Điều này không cho phép bạn chia sẻ văn bản hoặc hình ảnh cho các ứng dụng khác. Bạn có thể muốn UIDocumentInteractionControllercho điều đó.

Xem thêm


1
Tại sao một số ví dụ hiển thị mảng của 1 mục và một số hiển thị 2? Giả sử chia sẻ một hình ảnh.
Lim Thye Chean

@ Suragch: Xin chào Tôi muốn chia sẻ mã giới thiệu trong văn bản và cần mã đó được sao chép khi nhấp hoặc nhấn khi nó xảy ra khi chúng tôi gửi một số.
Ishika

73

Chia sẻ: Văn bản

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

Chia sẻ: Hình ảnh

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

Chia sẻ: Văn bản - Hình ảnh - 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)
   }

nhập mô tả hình ảnh ở đây


4
này nó không hoạt động Trong FB chỉ liên kết là chia sẻ không phải hình ảnh và văn bản.
Ekta Padaliya

@ScriptKitty. Ứng dụng tin nhắn có được cấu hình đúng với tài khoản i cloud không?
Awais Fayyaz

1
@EktaPadaliya. Theo chính sách cập nhật FB, URL hoặc hình ảnh có thể được chia sẻ. văn bản không thể
Awais Fayyaz


2
Hình ảnh @ Mr.JattedMultani không được chia sẻ trong whatsapp
NickCoder

10

Tôi thấy điều này hoạt động hoàn hảo nếu bạn muốn chia sẻ toàn bộ màn hình.

@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

Cũng như một lưu ý, bạn cũng có thể sử dụng điều này cho iPad:

activityViewController.popoverPresentationController?.sourceView = sender

Vì vậy, popover bật ra từ người gửi (nút trong trường hợp đó).


ActivityViewControll.popoverPftimeationControll? .sourceView = sender là? UIView - làm việc cho tôi. :) cảm ơn
Brian

Hộp chia sẻ không xuất hiện cho iPad. Điều này đã khắc phục các sự cố iPad tôi gặp phải!
Asp Tải lên

3

Bạn có thể sử dụng các hàm sau mà tôi đã viết trong một trong các lớp trợ giúp của tôi trong một dự án.

chỉ cần gọi

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

và nó sẽ hoạt động cho cả iPhone và iPad. Nếu bạn vượt qua bất kỳ giá trị CGRect nào của nguồn bằng sourceRect, nó cũng sẽ hiển thị một mũi tên nhỏ trong 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)
}

Hoạt động hoàn hảo! 👍🏻
Ravindra_Bhati

3

Tôi đã sử dụng triển khai ở trên và bây giờ tôi mới biết rằng nó không hoạt động trên iPad chạy iOS 13. Tôi đã phải thêm các dòng này trước cuộc gọi hiện tại () để làm cho nó hoạt động

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

Đó là cách nó hoạt động với tôi

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)
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.