![](/img/trans.png)
[英]iOS: Sharing via UIActivityViewController does not work with UIActivityItemSource
[英]Sharing to Instagram does not work using the `UIActivityItemSource` protocol
我使用UIActivityViewController
共享文本和图像。 该图像来自一个UIImage()
activityImage
。 自定义文本来自从UIActivityItemSource
协议返回的activityText()
。
问题是,Instagram 只能在特定条件下在UIActivityViewController
可见。
总结以下测试:
Instagram的是只在可见UIActivityViewController
为activityItems: [activityImage]
和activityItems: [activityImage, NSNull()]
即使返回的UIActivityItemSource
协议值为""
、 nil
、 NSNull()
,Instagram 也会为activityItems: [activityImage, activityText()]
隐藏。
问题是需要调用UIActivityItemSource
协议,以便可以分别管理不同的共享平台。
问题:
如何在调用
UIActivityItemSource
协议时分享到 Instagram?在调用
UIActivityItemSource
协议时,我可以尝试哪些替代""
、nil
和NSNull()
?
代码:
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
switch activityType {
case UIActivityTypeMessage:
return "Special text when sharing to Messages."
default:
return ""
}
}
}
func shareEverwhere() {
var activityImage: UIImage()
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
self.presentViewController(activity, animated: true, completion: nil)
}
测试:
Instagram 在UIActivityViewController
可见
let activity = UIActivityViewController(activityItems: [activityImage], applicationActivities: nil)
或者
let activity = UIActivityViewController(activityItems: [activityImage, NSNull()], applicationActivities: nil)
Instagram隐藏在UIActivityViewController
let activity = UIActivityViewController(activityItems: [activityImage, ""], applicationActivities: nil)
或者
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
或者
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
return NSNull()
}
}
或者
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
return nil
}
}
或者
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
return ""
}
}
问题被提出并回答: 通过UIActivityViewController(Twitter,Facebook,Instagram)与hashtag共享图像
UIActivityViewController *activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:@[vm.image, [[ActivityStringItemSource alloc] initWithString:attributedString]] applicationActivities:nil];
实现字符串返回的类(或不是)是:
@interface ActivityStringItemSource()<UIActivityItemSource>
@property(strong, nonatomic) NSMutableAttributedString *stringContent;
@end
@implementation ActivityStringItemSource
- (instancetype)initWithString:(NSMutableAttributedString *) placeholder
{
self = [super init];
if (self) {
_stringContent = placeholder;
}
return self;
}
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
return [NSObject new];
}
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType {
if([activityType containsString:@"instagram"]) {
return nil;
} else {
return _stringContent;
}
}
@end
正如最初的答案所指出的那样,关键是返回一个NSObject(该类扩展了NSObject)。 然后在项目选择中,只测试instagram以返回nil,否则返回您的字符串。
测试后,您只需将图像添加到 activityViewControllerPlaceholderItem
final class MyImageItemSource: NSObject, UIActivityItemSource {
final let image: UIImage
init(image: UIImage) {
self.image = image
}
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
image
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
image
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.