Swift3 使用UIActivityViewController发布,但避免裁剪?
假设您构建了一个在不同设备上全屏显示的图像。然后使用UIActivityViewController以正常方式发布到Instagram,例如 用户点击你的共享按钮,它会显示通常的iOS共享内容 你可以发布到Instagram(当然,假设用户是Instagram用户)。不用担心 但通常情况下,图片会在Instagram上被裁剪——你会损失一点顶部和底部 实际上有什么解决办法吗 请注意,如果你在iPhone上打开普通照片应用程序,然后在Instagram上“共享”和发布你失去了一点顶部和底部 当用户单击此屏幕上的Instagram图标时 事实上,我是否有办法返回,了解用户的选择,并将图像设置为合适的大小 是否有办法将所选图像(各种大小)传递给UIActivityViewController 这是怎么回事,这似乎是一个基本的失败 注意-我完全知道,在进入iOS共享之前,我可以问用户自己“您希望我制作多大尺寸的图像?” 注意——我知道在某些情况下,在应用程序中可以“直接”发布Instagram,而不使用苹果的共享系统;不过那太差劲了 为了避免任何人打字,这里有一些干净的代码来启动iOS共享系统Swift3 使用UIActivityViewController发布,但避免裁剪?,swift3,share,instagram,uiactivityviewcontroller,Swift3,Share,Instagram,Uiactivityviewcontroller,假设您构建了一个在不同设备上全屏显示的图像。然后使用UIActivityViewController以正常方式发布到Instagram,例如 用户点击你的共享按钮,它会显示通常的iOS共享内容 你可以发布到Instagram(当然,假设用户是Instagram用户)。不用担心 但通常情况下,图片会在Instagram上被裁剪——你会损失一点顶部和底部 实际上有什么解决办法吗 请注意,如果你在iPhone上打开普通照片应用程序,然后在Instagram上“共享”和发布你失去了一点顶部和底部 当用
@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
}
免责声明:此解决方案涉及将Instagram的扩展标识符硬编码到您的应用程序中,这可能会通过应用程序审查,也可能不会通过,将来可能会中断。试试看,风险自负强> Apple为此提供了一种称为
UIActivityItemProvider
的机制。您可以传递覆盖itemForActivityType
的UIActivityItemProvider
子类,而不是将图像传递给UIActivityViewController
,以根据用户选择的活动类型返回适当的图像
苹果为许多常见的活动类型提供了常量,但Instagram尚未包括在内。您可以通过检查活动类型的原始值是否为com.burbn.Instagram.shareextension
来识别Instagram。如果Instagram更改了他们分机的ID,这将中断
这里有一个为Instagram提供不同图像的UIActivityItemProvider
:
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
}
}
}
然后更改IBAction的前两行:
let imageProvider = DynamicImageProvider(instagramImage:buildInstagramImage(), defaultImage:buildImage())
let ac = CleanerActivity(activityItems:[imageProvider], applicationActivities:nil)
再次感谢。我不能百分之百确定这是否是我需要的,但你的知识太少了,所以我派了赏金来感谢你,毒蕈!我的github有很多叉子,当我需要修改某些东西时,站在巨人们该死的酷肩膀上;)谢谢你的赏金,希望能有所帮助!嘿你可能知道这个讨厌的问题的答案,毒蕈。。。干杯。@charmingToad嗨,我需要有关使用我的应用程序在instagram上共享图像的帮助。请帮帮我。