Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3 使用UIActivityViewController发布,但避免裁剪?_Swift3_Share_Instagram_Uiactivityviewcontroller - Fatal编程技术网

Swift3 使用UIActivityViewController发布,但避免裁剪?

Swift3 使用UIActivityViewController发布,但避免裁剪?,swift3,share,instagram,uiactivityviewcontroller,Swift3,Share,Instagram,Uiactivityviewcontroller,假设您构建了一个在不同设备上全屏显示的图像。然后使用UIActivityViewController以正常方式发布到Instagram,例如 用户点击你的共享按钮,它会显示通常的iOS共享内容 你可以发布到Instagram(当然,假设用户是Instagram用户)。不用担心 但通常情况下,图片会在Instagram上被裁剪——你会损失一点顶部和底部 实际上有什么解决办法吗 请注意,如果你在iPhone上打开普通照片应用程序,然后在Instagram上“共享”和发布你失去了一点顶部和底部 当用

假设您构建了一个在不同设备上全屏显示的图像。然后使用UIActivityViewController以正常方式发布到Instagram,例如

用户点击你的共享按钮,它会显示通常的iOS共享内容

你可以发布到Instagram(当然,假设用户是Instagram用户)。不用担心

但通常情况下,图片会在Instagram上被裁剪——你会损失一点顶部和底部

实际上有什么解决办法吗

请注意,如果你在iPhone上打开普通照片应用程序,然后在Instagram上“共享”和发布你失去了一点顶部和底部

当用户单击此屏幕上的Instagram图标时

事实上,我是否有办法返回,了解用户的选择,并将图像设置为合适的大小

是否有办法将所选图像(各种大小)传递给UIActivityViewController

这是怎么回事,这似乎是一个基本的失败

注意-我完全知道,在进入iOS共享之前,我可以问用户自己“您希望我制作多大尺寸的图像?”

注意——我知道在某些情况下,在应用程序中可以“直接”发布Instagram,而不使用苹果的共享系统;不过那太差劲了

为了避免任何人打字,这里有一些干净的代码来启动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
    }

免责声明:此解决方案涉及将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上共享图像的帮助。请帮帮我。