【问题标题】:How can you customize UIActivityViewController to ONLY include custom UIActivity types?如何自定义 UIActivityViewController 以仅包含自定义 UIActivity 类型?
【发布时间】: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 并不容易。您需要列出您希望排除的所有活动,有些活动不能排除。请参阅stackoverflow.com/questions/31792506/… 了解一些可以接近的想法。

标签: ios swift


【解决方案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 上的操作?
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 2016-11-12
  • 2014-01-09
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多