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

Posted

技术标签:

【中文标题】使用 UIActivityViewController 发布,但避免裁剪?【英文标题】:Posting with UIActivityViewController, but avoiding cropping? 【发布时间】:2016-11-06 18:00:14 【问题描述】:

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

用户点击你的分享按钮,它会调出通常的 ios 分享功能,

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

但通常图片在 Instagram 上被裁剪 - 你会丢失一点顶部和底部。

真的有解决办法吗?

请注意,确实 - 假设您在 iPhone 上打开普通的照片应用程序,然后“分享”并在 Instagram 上发帖……您会失去一点顶部和底部

当用户确实点击了 Instagram 图标时...

事实上,我有办法返回,注意用户的选择,并使图像尺寸合适

有没有办法将选择的图像(各种尺寸)传递给 UIActivityViewController?

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

注意 - 我完全知道在使用 iOS-share-thingy 之前,我可以自己问用户“您希望我制作什么尺寸的图像?”

注意 - 我知道在某些情况下,可以在应用程序内“直接”发布 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】:

免责声明:此解决方案涉及将 Instagram 的扩展标识符硬编码到您的应用中,这可能会或可能不会通过应用审核,并且将来可能会中断。风险自负!

Apple 为此提供了一种称为UIActivityItemProvider 的机制。您可以传递覆盖itemForActivityTypeUIActivityItemProvider 的子类,而不是将图像传递给UIActivityViewController,以根据用户选择的活动类型返回适当的图像。

Apple 为许多常见活动类型提供常量,但尚不包括 Instagram。您可以通过检查活动类型的原始值是否为 com.burbn.instagram.shareextension 来识别 Instagram。如果 Instagram 更改其扩展程序的 ID,这将中断。

这是一个UIActivityItemProvider,它为 Instagram 提供不同的图像:

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)

【讨论】:

再次感谢。我不是 100% 确定这是否是我所需要的,但你的知识是如此罕见,以至于我发送了赏金来表示感谢,Toadster! 当我需要修改一些东西时,我的 github 有很多分支,站在巨人的酷酷的肩膀上;) 感谢您的赏金,希望它有所帮助! 嘿!您可能知道这个令人讨厌的问题的答案,Toadster ...***.com/questions/39841095/… Cheers。 @charmingToad 嗨,我需要有关使用我的应用在 Instagram 上分享图像的帮助。请帮帮我。

以上是关于使用 UIActivityViewController 发布,但避免裁剪?的主要内容,如果未能解决你的问题,请参考以下文章

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”