如何自定义 UIActivityViewController 以仅包含自定义 UIActivity 类型?

Posted

技术标签:

【中文标题】如何自定义 UIActivityViewController 以仅包含自定义 UIActivity 类型?【英文标题】:How can you customize UIActivityViewController to ONLY include custom UIActivity types? 【发布时间】:2019-03-13 21:40:18 【问题描述】:

我正在尝试自定义原生 ios UIActivityViewController,因此它将限制每个 UIActivity,除了我初始化 UIActivityViewController 使用的自定义 UIActivity 类型。

本质上,我只希望用户看到我的四个自定义UIActivitys。

let items = ["Hello world"]

let activitySheet = CustomUIActivityViewController(
            activityItems: items,
            applicationActivities: [
                CustomMailUIActivity(),
                CustomMessagesUIActivity(),
                CustomTwitterUIActivity(),
                CustomFacebookUIActivity()
            ]
        )

我了解您可以使用activitySheet.excludedActivityTypes = [] 排除您不需要的类型,但是您不能排除第三方应用程序,例如 Slack。

我想知道是否有任何方法可以解决这个问题,并且只包含自定义 applicationActivies。删除共享表上显示的“更多”按钮也很棒。任何帮助将不胜感激。

这就是我想要实现的目标。

screenshot

【问题讨论】:

不幸的是UIActivityViewController 并不容易。您需要列出您希望排除的所有活动,有些活动不能排除。请参阅***.com/questions/31792506/… 了解一些可以接近的想法。 【参考方案1】:

我的同事能够解决这个问题。对于想知道如何在共享表上显示applicationActivities(自定义活动)的任何人,我就是这样做的。

对于activityItems,不要创建字符串数组,而是创建自定义数据对象数组。然后覆盖自定义UIActivityUIActivity 的子类)中的canPerform(withActivityItems activityItems: [Any]) 方法以在activityItems[o] is CustomItem 时返回true。由于您的activityItems 是自定义的,因此系统不会在共享表上显示其他应用程序。就是这样。

在下面的示例中,只有您的CustomUIActivity 会显示在共享表上。

let items = [CustomItem("Hello world")]

let activitySheet = UIActivityViewController(
            activityItems: items,
            applicationActivities: [
                CustomUIActivity()
            ]
        )
class CustomItem 

    let value: String

    required init(value: String) 
        self.value = value
    

    func getValue() -> String 
        return self.value
    

@objc(CustomUIActivity)
class CustomUIActivity: UIActivity 

    override class var activityCategory: UIActivity.Category 
        return .share
    

    override var activityType: UIActivity.ActivityType? 
        return .customuiactivity
    

    override var activityTitle: String? 
        return "Custom"
    

    override var activityImage: UIImage? 
        return UIImage(named: "custom-icon")
    

    override func canPerform(withActivityItems activityItems: [Any]) -> Bool 
        if activityItems.count == 1 && activityItems[0] is CustomItem 
            return true
        
        return false
    

    var textToShare: String?

    override func prepare(withActivityItems activityItems: [Any]) 
        if let activityItem = activityItems.first as? CustomItem 
            self.textToShare = activityItem.getValue
        
    

    override func perform() 
        // perform your custom activity with `textToShare`
        activityDidFinish(true)
    


extension UIActivity.ActivityType 
    static let customuiactivity =
        UIActivity.ActivityType("com.ceylonese.mobile.customuiactivity")

【讨论】:

感谢您的回答!您是否还弄清楚如何仅显示操作?所以看起来像例如的东西“复制”- 常规 UIActivityViewController 上的操作?

以上是关于如何自定义 UIActivityViewController 以仅包含自定义 UIActivity 类型?的主要内容,如果未能解决你的问题,请参考以下文章

代码调试篇:如何编写 gdb 自定义命令

如何自定义自己的IP地址

如何自定义Android Dialog的样式?

如何添加自定义条件查询(请各位老大指教)

HTML 如何实现自定义按钮

如何自定义TimePicker的样式