如何像 Safari 一样向 iOS 共享表添加额外选项

Fle*_*rex 0 uikit ios swift

我试图重现 Apple 对 Safari 所做的事情,其中​​有一个共享按钮可以共享当前页面,但还提供了一些额外的(和内部)选项来处理页面。

例如,我们可以选择添加到阅读列表、添加为书签等。

在此处输入图片说明

这些选项是 Safari 独有的,因为它们不是默认共享表的一部分。如何在这样的共享表下隐藏我自己的应用程序的某些功能?

我做了一些研究,我只发现自定义活动(据我所知)是共享表第二行中的方形按钮(部分隐藏在我的屏幕截图中)。

我还发现了扩展,但我认为这对我的情况没有帮助,因为它允许为每个应用程序全局自定义共享表,并且我需要在我的应用程序运行时添加选项。

Swe*_*per 5

当您初始化共享表(又名UIActivityController)时,系统会要求您提供一组applicationActivities,这是您的自定义内部/共享操作将进行的地方。

您应该只是子类化UIActivity,并覆盖文档指定的所需成员:

  • activityType
  • activityTitle
  • activityImage
  • canPerform(withActivityItems:)
  • prepare(withActivityItems:)
  • activityCategory

为了让您UIActivity出现在共享片底部的菜单按钮,请确保您返回.actionactivityCategory。如果您返回.share,它将在顶部显示为一个方形按钮。

例子:

// dummy implementation
class Foo: UIActivity {
    override var activityTitle: String? { "Foo" }
    override var activityType: UIActivity.ActivityType? { UIActivity.ActivityType("Foo") }
    override var activityImage: UIImage? { UIImage(systemName: "doc.on.doc.fill") }
    override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
        true
    }
    override class var activityCategory: UIActivity.Category { .action }
    override func prepare(withActivityItems activityItems: [Any]) {
        print("Preparing Foo!")
    }
    override func perform() {
        print("Performed Foo!")
    }
}

...

let shareSheet = UIActivityViewController(activityItems: [stuffToShare], applicationActivities: [Foo()])
Run Code Online (Sandbox Code Playgroud)

输出:

在此处输入图片说明

如果我.share改用:

在此处输入图片说明