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

时间:2016-11-06 18:00:15

标签: swift3 share instagram uiactivityviewcontroller

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

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

enter image description here

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

但通常情况下,图片会在Instagram上被裁剪掉 - 你会失去一点点的顶部和底部。

实际上有解决方法吗?

请注意,确实 - 比如你在iPhone上打开普通的照片应用程序,并且"分享"并在Instagram上发布... 你失去了一点点顶部和底部

当用户点击此处的Instagram图标时......

enter image description here

实际上有一种方法可以让我 返回,了解用户的选择,并使图像适当大小 ?< / 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
    }

1 个答案:

答案 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
        }
    }
}