我正在尝试自定义本机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

最佳答案

我的同事能够弄清楚这一点。对于想知道如何仅在共享表上显示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")
}

关于ios - 如何自定义UIActivityViewController以仅包括自定义UIActivity类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55151619/

10-10 20:35
查看更多