2

我使用UIActivityViewController. 图像来自activityImage哪个UIImage(). 自定义文本是从协议activityText()返回的UIActivityItemSource

问题是,Instagram 仅UIActivityViewController在特定条件下可见。

总结以下测试:

  • Instagram仅在UIActivityViewControllerforactivityItems: [activityImage]activityItems: [activityImage, NSNull()]

  • 即使返回的协议值为, , ,Instagram也会被隐藏activityItems: [activityImage, activityText()]UIActivityItemSource""nilNSNull()

问题是UIActivityItemSource需要调用协议,以便可以分别管理不同的共享平台。


问题:

  • UIActivityItemSource调用协议时如何分享到 Instagram ?

  • 有什么替代方法"",我可以在调用协议时尝试?nilNSNull()UIActivityItemSource


代码:

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 ""
    }
}
4

2 回答 2

4

该问题在以下位置提出并回答:通过 UIActivityViewController(Twitter、Facebook、Instagram)与主题标签共享图像

        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,否则返回您的字符串。

于 2017-08-30T14:47:02.183 回答
0

测试后,您只需将图像添加到 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
    }

}
于 2021-12-10T09:23:05.810 回答