UIActivityViewController 仅用于 FB、Twitter 和 Mail 共享图像,但不用于消息

Posted

技术标签:

【中文标题】UIActivityViewController 仅用于 FB、Twitter 和 Mail 共享图像,但不用于消息【英文标题】:UIActivityViewController share image only for FB, Twitter and Mail, but not messages 【发布时间】:2016-05-24 09:13:24 【问题描述】:

所以我使用以下代码来获取所有 UIActivityTypes 的文本。

        @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject 
        return ""
    

    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? 
        if activityType == UIActivityTypeMessage 
            return "String for message"
         else if activityType == UIActivityTypeMail 
            return "String for mail"
         else if activityType == UIActivityTypePostToTwitter 
            return "String for twitter"
         else if activityType == UIActivityTypePostToFacebook 
            return "String for facebook"
        
        return nil
    

    func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String 
        if activityType == UIActivityTypeMessage 
            return "Subject for message"
         else if activityType == UIActivityTypeMail 
            return "Subject for mail"
         else if activityType == UIActivityTypePostToTwitter 
            return "Subject for twitter"
         else if activityType == UIActivityTypePostToFacebook 
            return "Subject for facebook"
        
        return ""
       

这就是有趣的部分发生的地方。我将 URL 中的图像添加到 objectsToShare 数组。如果我希望为所有人显示图像,这会很好,但我的问题是我不想显示UIActivityTypeMessage 的图像。那应该只包含文本,而不是图像。我该怎么做?

    // Load image to share
let articleURL = URLBuilder.sharedInstance.addOnlyHttps((promo?.imageUrl)!)
KingfisherManager.sharedManager.cache.retrieveImageForKey(articleURL, options: nil)  (image, _) -> () in
    if image != nil 
        objectsToShare.append(image!)
        self.openShareViewController(objectsToShare, sender: sender )
     else 
        KingfisherManager.sharedManager.downloader.downloadImageWithURL(NSURL(string: articleURL)!, progressBlock: nil, completionHandler:  (image, error, imageURL, originalData) in
            if image != nil 
                KingfisherManager.sharedManager.cache.storeImage(image!, forKey: articleURL)
                objectsToShare.append(image!)
                self.openShareViewController(objectsToShare, sender: sender)
            
        )

    

【问题讨论】:

我需要澄清一下,您必须通过 UIActivityViewcontroller 共享图像和文本。 异常 UIActivityTypeMessage 应该只有文本而不是图像。对吗? @Gokulvivid 在好先生的位置:D 这确实是我需要的 查看我的答案,它可能完全满足您的需求。 @Gokulvivid 你的回答正是我所需要的,谢谢!像魅力一样工作 【参考方案1】:
    要为不同的 ActivityItem 设置不同的内容最好是使用 UIActivityItemSource。有关 ActivityItemSource 的更多信息,请查看Documentation。 您已经在使用相同的方法,因此很容易为您的问题找到解决方案。

    如下创建两个 UIActivityItemSource 类

    SourceOne:

    class MyStringItemSourceOne: NSObject, UIActivityItemSource 
    @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject 
       return ""
    
    
    @objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? 
    
       if activityType == UIActivityTypeMessage 
         return "String for message"
        else if activityType == UIActivityTypeMail 
        return "String for mail"
        else if activityType == UIActivityTypePostToTwitter 
        return "String for twitter"
        else if activityType == UIActivityTypePostToFacebook 
        return "String for facebook"
       
       return nil
       
    
    

    通过添加上述代码,我们设置了要共享的字符串内容。注意根据活动activityType我们设置不同的字符串值。

    我们的要求是为所有activityType设置图片期望UIActivityTypeMessage,这样我们将要创建另一个UIActivityItemSource

    来源二

     class MyStringItemSourceTwo: NSObject, UIActivityItemSource 
     @objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject 
        return ""
       
    
     @objc func activityViewController(activityViewController:  UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? 
    
        let Image: UIImage = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://i.telegraph.co.uk/multimedia/archive/03589/Wellcome_Image_Awa_3589699k.jpg")!)!)!
        if activityType == UIActivityTypeMessage 
           return nil
         else if activityType == UIActivityTypeMail 
        //return "String for mail"
           return Image
         else if activityType == UIActivityTypePostToTwitter 
           return Image
         else if activityType == UIActivityTypePostToFacebook 
           return Image
        
        return nil
       
    
    
    

    接下来将以上两个源作为activityitems添加到UIActivityViewController,如下

    @IBAction func Test(sender: AnyObject) 
    
       let activityVC = UIActivityViewController(activityItems: [MyStringItemSourceOne(),MyStringItemSourceTwo()] as [AnyObject], applicationActivities: nil)
       //NOTE: Instead of using rootviewcontroller go with your own way.
       if let window = (UIApplication.sharedApplication().delegate as? AppDelegate)?.window
       
          window.rootViewController?.presentViewController(activityVC, animated: true, completion: nil)
       
    
    

    现在一切都会按照您的要求正常运行。

【讨论】:

以上是关于UIActivityViewController 仅用于 FB、Twitter 和 Mail 共享图像,但不用于消息的主要内容,如果未能解决你的问题,请参考以下文章

UIActivityViewController 背景颜色

UIActivityViewController 共享 UIActivity 未显示

UIActivityViewController 不适用于 WKWebView

限制 UIActivityViewController 共享扩展活动

尝试呈现 UIActivityViewController 时崩溃

更改 UIActivityViewController 的 navigationBar 的颜色