UIActivityViewController 只为 FB、Twitter 和 Mail 共享图像,但不共享消息
UIActivityViewController share image only for FB, Twitter and Mail, but not messages
所以我使用以下代码获取所有 UIActivityType 的文本。
@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)
}
})
}
}
- 要为不同的 ActivityItem 设置不同的内容,最好的方法是使用 UIActivityItemSource。有关 ActivityItemSource 的更多信息,请查看此 Documentation。
- 您已经按照相同的方式进行操作,因此很容易找到解决问题的方法。
如下创建两个 UIActivityItemSource class
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
}
}
通过添加上面的代码,我们将 String Content 设置为 shared.Note 取决于 activity activityType我们设置不同的字符串值。
我们的要求是为所有 activityType expect UIActivityTypeMessage设置图像,这样我们就可以创建另一个 UIActivityItemSource
SourceTwo
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
}
}
接下来将上面两个source的添加到UIActivityViewController中作为activityitems如下
@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)
}
}
现在一切都会按照您的要求正常工作了。
所以我使用以下代码获取所有 UIActivityType 的文本。
@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)
}
})
}
}
- 要为不同的 ActivityItem 设置不同的内容,最好的方法是使用 UIActivityItemSource。有关 ActivityItemSource 的更多信息,请查看此 Documentation。
- 您已经按照相同的方式进行操作,因此很容易找到解决问题的方法。
如下创建两个 UIActivityItemSource class
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 } }
通过添加上面的代码,我们将 String Content 设置为 shared.Note 取决于 activity activityType我们设置不同的字符串值。
我们的要求是为所有 activityType expect UIActivityTypeMessage设置图像,这样我们就可以创建另一个 UIActivityItemSource
SourceTwo
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 } }
接下来将上面两个source的添加到UIActivityViewController中作为activityitems如下
@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) } }
现在一切都会按照您的要求正常工作了。