UIActivityViewController的定制化

72 阅读1分钟

import LinkPresentation

class AdvancedActivityItemSource: NSObject, UIActivityItemSource {

struct ShareContent {

let title: String

let subtitle: String

let previewImage: UIImage?

let shareText: String

let shareURL: URL?

let appIcon: UIImage?

}

let content: ShareContent

init(content: ShareContent) {

self.content = content

super.init()

}

// MARK: - UIActivityItemSource

func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {

return content.shareText

}

func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {

// 根据不同分享类型返回不同内容

if let activityType = activityType {

// switch activityType {

// case .mail:

// return """

// \(content.title)

//

// \(content.subtitle)

//

// \(content.shareText)

//

// \(content.shareURL?.absoluteString ?? "")

// """

//

// case .message :

// return "\(content.title)\n\n\(content.shareText)\n\(content.shareURL?.absoluteString ?? "")"

//

// default:

// return "\(content.title)\n\(content.shareURL?.absoluteString ?? "")"

// }

return "\(content.title)\n\(content.shareURL?.absoluteString ?? "")"

}

return content.shareText

}

func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {

return content.title

}

func activityViewController(_ activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: UIActivity.ActivityType?, suggestedSize size: CGSize) -> UIImage? {

return content.previewImage

}

// iOS 13+ 使用 LinkPresentation 显示富预览

func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {

let metadata = LPLinkMetadata()

// 设置标题

metadata.title = content.title

// 设置 URL(会影响副标题显示)

// if let url = content.shareURL {

// metadata.originalURL = url

// metadata.url = url

// } else {

// metadata.originalURL = URL(string: "yourapp.com")

// }

// 设置图标/预览图

if let image = content.previewImage ?? content.appIcon {

let imageProvider = NSItemProvider(object: image)

metadata.imageProvider = imageProvider

metadata.iconProvider = imageProvider

}

// 可以设置副标题(通过设置 provider)

let subtitleProvider = NSItemProvider(object: content.subtitle as NSString)

metadata.iconProvider = subtitleProvider // 或者设置 iconProvider

return metadata

}

}

调用:

   // 创建分享内容

let shareContent = AdvancedActivityItemSource.ShareContent(

title: "XXXX",

subtitle: "",

previewImage: UIImage(named: "appIcon_1"),

shareText: "",

shareURL: URL(string: "https://1111"),

appIcon: UIImage(named: "appIcon_1")

)

let advancedItem = AdvancedActivityItemSource(content: shareContent)

// 显示分享菜单

let activityVC = UIActivityViewController(

activityItems: [advancedItem, self.img ],

applicationActivities: nil

)

// 设置回调

activityVC.completionWithItemsHandler = { activityType, completed, returnedItems, error in

if completed {

print("分享成功:\(activityType?.rawValue ?? "")")

self.endEditing(true)

} else {

self.endEditing(true)

print("分享取消")

}

}

// iPad 适配

// if let popoverController = activityVC.popoverPresentationController {

// popoverController.sourceView = self.view

// popoverController.sourceRect = CGRect(x: self.view.bounds.midX,

// y: self.view.bounds.midY,

// width: 0, height: 0)

// popoverController.permittedArrowDirections = []

// }

// 显示分享菜单

kTopVC.present(activityVC, animated: true)

self.endEditing(true)