假设您构建了一个在不同设备上全屏的图像。然后,您可以使用UIActivityViewController以正常方式发布到 - 例如 - Instagram。
用户点击您的分享按钮,它会显示通常的iOS共享内容,
您可以发布到Instagram(假设用户当然是Instagram用户)。不用担心。
但通常情况下,图片会在Instagram上被裁剪掉 - 你会失去一点点的顶部和底部。
实际上有解决方法吗?
请注意,确实 - 比如你在iPhone上打开普通的照片应用程序,并且"分享"并在Instagram上发布... 你失去了一点点顶部和底部!
当用户点击此处的Instagram图标时......
实际上有一种方法可以让我 返回,了解用户的选择,并使图像适当大小 ?< / p>
是否有办法 将一系列图像(各种尺寸) 传递给UIActivityViewController?
对此有什么交易,这似乎是一个基本的失败?
注意 - 我完全清楚,在进入iOS-share-thingy之前,我可以自己询问用户&#34;您希望我制作多大尺寸的图像?&#34;
注意 - 我知道在某些情况下可以直接发布&#34;&#34;在应用程序中说Instagram,而不使用Apple的共享系统;但是,这很蹩脚。
为了节省任何人打字,这里有一些干净的代码来启动iOS共享系统...
@IBAction func userClickedOurShareButton()
{
let s:[AnyObject] = [buildImage()]
let ac = CleanerActivity(activityItems:s, applicationActivities:nil)
ac.popoverPresentationController?.sourceView = view
// needed so that iPads won't crash. sarcasm: thanks Apple
ac.excludedActivityTypes = [UIActivityType.assignToContact,
UIActivityType.saveToCameraRoll,
UIActivityType.addToReadingList,
UIActivityType.copyToPasteboard ]
// consider UIActivityTypeMessage also
if #available(iOS 9.0, *) {
ac.excludedActivityTypes?.append(UIActivityType.openInIBooks)
} else {
// Fallback on earlier versions
}
self.present(ac, animated:false, completion:nil)
}
class CleanerActivity: UIActivityViewController {
func _shouldExcludeActivityType(_ activity: UIActivity) -> Bool {
let activityTypesToExclude = [
"com.apple.reminders.RemindersEditorExtension",
"com.apple.mobilenotes.SharingExtension",
"com.google.Drive.ShareExtension",
"com.apple.mobileslideshow.StreamShareService"
]
if let actType = activity.activityType {
if activityTypesToExclude.contains(actType.rawValue) {
return true
}
else if super.excludedActivityTypes != nil {
return super.excludedActivityTypes!.contains(actType)
}
}
return false
}
答案 0 :(得分:2)
免责声明:此解决方案涉及将Instagram的扩展程序标识符硬编码到您的应用程序中,这可能会或可能不会通过应用程序审核,并可能在将来中断。请自担风险!
Apple为此提供了一种称为UIActivityItemProvider
的机制。您可以传递覆盖UIActivityViewController
的{{1}}子类,而不是将图像传递给UIActivityItemProvider
,以根据用户选择的活动类型返回合适的图像。
Apple为许多常见活动类型提供常量,但尚未包含Instagram。您可以通过检查活动类型的原始值是否为itemForActivityType
来识别Instagram。如果Instagram更改了其扩展名的ID,这将会中断。
这是com.burbn.instagram.shareextension
向Instagram提供不同的图像:
UIActivityItemProvider
然后更改IBAction的前两行:
class DynamicImageProvider: UIActivityItemProvider {
let instagramImage: UIImage
let defaultImage: UIImage
init(instagramImage: UIImage, defaultImage: UIImage) {
self.instagramImage = instagramImage
self.defaultImage = defaultImage
super.init(placeholderItem: defaultImage)
}
override func activityViewController(_ activityViewController: UIActivityViewController,
itemForActivityType activityType: UIActivityType) -> Any? {
if activityType.rawValue == "com.burbn.instagram.shareextension" {
return instagramImage
}
else {
return defaultImage
}
}
}