如何自定义 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
类型。
本质上,我只希望用户看到我的四个自定义UIActivity
s。
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
,不要创建字符串数组,而是创建自定义数据对象数组。然后覆盖自定义UIActivity
(UIActivity
的子类)中的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 类型?的主要内容,如果未能解决你的问题,请参考以下文章