iOS分享文本或图像
展示UIActivityViewController
let controller = UIActivityViewController(activityItems: [someObject], applicationActivities: nil)
controller.popoverPresentationController?.sourceView = self.view
controller.completionWithItemsHandler = {
(
activityType: UIActivity.ActivityType?,
completed: Bool,
arrayReturnedItems: [Any]?,
error: Error?
) in
if let error = error {
return
}
if completed {
if let activityType = activityType {
switch activityType {
case .saveToCameraRoll:
break
case .copyToPasteboard:
break
case .addToReadingList:
break
case .airDrop:
break
default:
break
}
}
} else {
}
}
self.present(controller, animated: true)
将图像保存到库中
如果您要将图像保存到库中,请在应用的.plist
文件中添加NSPhotoLibraryAddUsageDescription
,否则会出现运行时错误:
此应用程序崩溃,因为它尝试访问敏感数据而没有使用说明。应用程序的Info.plist必须包含一个带有字符串值的NSPhotoLibraryAddUsageDescription键,向用户解释应用程序如何使用这些数据。
此外,您还可以排除此机会:
controller.excludedActivityTypes = [.saveToCameraRoll]
具有 completionWithItemsHandler
变种,可帮助添加后处理逻辑或处理错误。
例如,在相应的处理程序中将 UIImage 保存到照片库时遇到了以下错误:
Error Domain=ALAssetsLibraryErrorDomain Code=-1 "未知错误" UserInfo={NSLocalizedDescription=未知错误, NSUnderlyingError=0x600003f85110 {Error Domain=PHPhotosErrorDomain Code=3303 "(null)"}}
经过分析,我尝试保存 CIImage
。作为一种替代方法,您可以将其转换为 CGImage
let context = CIContext()
guard let cgImage = context.createCGImage(output, from: output.extent) else { return nil }
return UIImage(cgImage: cgImage)
自定义UIActivityViewController
class ImageActivityItemSource: NSObject, UIActivityItemSource {
let image: UIImage
let title: String
public init(image: UIImage, title: String) {
self.image = image
self.title = title
}
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
return self.image
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
return self.image
}
public func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
let image = self.image
let imageProvider = NSItemProvider(object: image)
let metadata = LPLinkMetadata()
metadata.title = self.title
metadata.imageProvider = imageProvider
return metadata
}
}
使用:
let imageActivityItemSource = ImageActivityItemSource(image: image, title: "Share this image with others")
let ac = UIActivityViewController(activityItems: [imageActivityItemSource], applicationActivities: nil)