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

时间:2019-03-13 21:40:19

标签: ios swift

我正在尝试自定义本机ios UIActivityViewController,因此它将限制每个UIActivity,但我用来初始化UIActivityViewController的自定义UIActivity类型除外。

基本上,我只希望用户看到我的四个自定义UIActivity

let items = ["Hello world"]

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

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

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

这就是我要实现的目标。

screenshot

1 个答案:

答案 0 :(得分:0)

我的同事能够弄清楚这一点。对于想知道如何在共享表上仅仅显示 applicationActivities(自定义活动)的人,这就是我的方法。

对于activityItems,而不是创建字符串数组,请创建自定义数据对象的数组。然后在自定义canPerform(withActivityItems activityItems: [Any])UIActivity的子类)中覆盖UIActivity方法,如果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")
}