震泽做网站,wordpress在线预览pdf,今天上海大事件,怎么注册公司营业执照以前都是用第三方sdk来分享的#xff0c;最近使用官方的UIActivityViewController来做分享#xff0c;结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…以前都是用第三方sdk来分享的最近使用官方的UIActivityViewController来做分享结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的订阅当我看到有一个返回thumbimage的接口时候第一感觉就是它是我需要的。
protocol UIActivityItemSource NSObjectrequired- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController; // called to determine data type. only the class of the return type is consulted. it should match what -itemForActivityType: returns later
- (nullable id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(nullable UIActivityType)activityType; // called to fetch data after an activity is selected. you can return nil.optional- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(nullable UIActivityType)activityType; // if activity supports a Subject field. iOS 7.0
- (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(nullable UIActivityType)activityType; // UTI for item if it is an NSData. iOS 7.0. will be called with nil activity and then selected activity
- (nullable UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(nullable UIActivityType)activityType suggestedSize:(CGSize)size; // if activity supports preview image. iOS 7.0
- (nullable LPLinkMetadata *)activityViewControllerLinkMetadata:(UIActivityViewController *)activityViewController API_AVAILABLE(ios(13.0)); // called to fetch LinkPresentation metadata for the activity item. iOS 13.0end结果测试发现这个方法再iOS17上根本不触发应该是iOS13以前就用上面几个iOS13后就用LPLinkMetadata的方法。LPLinkMetadata中有一个imageProvider他就是preview的内容。 public func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) - LPLinkMetadata? {let metadata LPLinkMetadata()metadata.title My title // Preview Titlemetadata.originalURL URL(string: You sub title here) // Set image metadata.imageProvider NSItemProvider(object: image)return metadata
}感觉完成了但是测试的时候有发现问题了preview没有铺满那个区域。搜索了一下发现是图片有alpha透明的区域。对应的处理方法就是去掉透明区域。
extension UIImage {func adjustedForShareSheetPreviewIconProvider() - UIImage {let replaceTransparencyWithColor UIColor.black // change as requiredlet minimumSize: CGFloat 40.0 // pointslet format UIGraphicsImageRendererFormat.init()format.opaque trueformat.scale self.scalelet imageWidth self.size.widthlet imageHeight self.size.heightlet imageSmallestDimension max(imageWidth, imageHeight)let deviceScale UIScreen.main.scalelet resizeFactor minimumSize * deviceScale / (imageSmallestDimension * self.scale)let size resizeFactor 1.0? CGSize(width: imageWidth * resizeFactor, height: imageHeight * resizeFactor): self.sizereturn UIGraphicsImageRenderer(size: size, format: format).image { context inlet size context.format.bounds.sizereplaceTransparencyWithColor.setFill()context.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))self.draw(in: CGRect(origin: .zero, size: size))}}
}如果不想处理图片大小的就直接去掉alpha通道
func removingAlpha() - UIImage {let format UIGraphicsImageRendererFormat()format.opaque true // removes Alpha Channelformat.scale scale // keeps original image scalereturn UIGraphicsImageRenderer(size: size, format: format).image { _ inlet size context.format.bounds.sizeUIColor.whiteColor.setFill()context.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))draw(in: CGRect(origin: .zero, size: size))}}这下就正常了。
Referene: https://stackoverflow.com/questions/57850483/ios13-share-sheet-how-to-set-preview-thumbnail-when-sharing-uiimage https://nemecek.be/blog/189/wip-sharing-data-with-uiactivityviewcontroller-tips-tricks