问题
必须对以下代码进行哪些更改才能确保Messenger播放 很好地与
UIActivityViewController
并分享图像和 文字,或者至少是图像?
背景
我正在使用UIActivityViewController
从我的应用分享文字和图片,并将其发送到电子邮件,消息和其他共享应用。 UIActivityViewController
很棒,并且以大多数应用程序的简单和标准方式工作......但是,我遇到了不想合作的Messenger(Facebook Messenger)的问题。
在下面的代码中,我点击了一个UIButton
,它拍摄了屏幕的快照图像,将其转换为.png,然后将准备好的图像(imageShare
)与我准备好的文本一起发送(textShare
)到UIActivityViewController
。这个简单的方法允许我的应用程序成功共享电子邮件,消息和除Messenger之外的许多其他共享应用程序。
(旁注,Facebook只能共享准备好的图像(imageShare
),但不能共享文本。)
问题
尝试与UIActivityViewController
共享Messenger时出现以下问题:
分享activityItems: [textShare, imageShare]
分享activityItems: [textShare]
UIActivityViewController
中无法使用分享给Messenger的选项。 分享activityItems: [imageShare]
代码
@IBAction func myButton(sender: UIButton) {
// Take snapshot of screen
let imageSnapshot: UIImage!
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
self.view.drawViewHierarchyInRect(CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height), afterScreenUpdates: false)
imageSnapshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Prepare text to share
let textShare: String!
textShare = "This is my original text."
// Prepare image to share
let imageShare: NSData
imageShare = UIImagePNGRepresentation(imageSnapshot)!
// Share text and image
let activity = UIActivityViewController(activityItems: [textShare, imageShare], applicationActivities: nil)
if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
self.presentViewController(activity, animated: true, completion: nil)
}
}
图片
iOS向UIActivityViewController
展示可用的应用程序。
答案 0 :(得分:0)
尝试使用UIImage而不是NSData。您可以将UIImage转换为AnyObject并添加到您的数组中。
答案 1 :(得分:0)
let textShare = "This is my original text."
var shareObject = [AnyObject]()
if textShare != nil {
shareObject.append(textShare as AnyObject)
}
let Yourimage = UIImage(named: "image.png")
let imageData = UIImagePNGRepresentation(Yourimage!) as NSData?
if let data = imageData {
shareObject.append(data)
}
if shareObject.count > 0 { // check condition for text and image
let activityViewController = UIActivityViewController(activityItems: shareObject, applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view
present(activityViewController, animated: true, completion: nil)
}
答案 2 :(得分:0)
所以最后需要的是将NSData
转换回UIImage
的额外步骤。
请注意,这种转换
NSData
的方法存在一个问题 进入UIImage
是它产生的图像质量 无损(即邮件和邮件)或有损(即备注,照片, 信使)。有趣的消息,邮件和各种第三方共享 应用程序非常满意地共享
NSData
UIActivityViewController
而Messenger不会容忍 它。 (我有兴趣理解为什么到底?)
更改
由此:
// Prepare image to share
let imageShare: NSData
imageShare = UIImagePNGRepresentation(imageSnapshot)!
对此:
// Prepare image to share
let imageShareData: NSData
imageShareData = UIImagePNGRepresentation(imageSnapshot)!
let imageShare = UIImage(data: imageShareData)!
最终工作代码
@IBAction func myButton(sender: UIButton) {
// Take snapshot of screen
var imageSnapshot: UIImage!
UIGraphicsBeginImageContextWithOptions(self.view.frame.size, false, 0)
self.view.drawViewHierarchyInRect(CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height), afterScreenUpdates: false)
imageSnapshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
// Prepare text to share
let textShare: String!
textShare = "This is my original text."
// Prepare image to share
let imageShareData: NSData
imageShareData = UIImagePNGRepresentation(imageSnapshot)!
let imageShare = UIImage(data: imageShareData)!
// Share text and image
let activity = UIActivityViewController(activityItems: [textShare, imageShare], applicationActivities: nil)
if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
self.presentViewController(activity, animated: true, completion: nil)
}
}