瞬间导航
原文作者:ping2karthikeyan.medium.com/
发布时间:2020年3月28日
快速操作是在主屏幕上进行有用的或任何特定应用程序操作的最方便方式。
在这篇文章中,我解释了快速操作,而不是小工具。
快速行动在所有运行iOS 13或更高版本的设备上都可用。
长按或强行触摸(如果有的话)应用图标时,会显示可用的快速操作列表。
列表的位置取决于该应用在主屏幕上的位置。
每个快速行动都有一个标题、副标题(可选)和图像图标(可选)。
每个应用程序最多可以提供四个快速行动。如果超过了四个,那么前四个快速操作只对用户可见。每个应用程序都有其默认的系统快速操作,如 "编辑主屏幕"、"分享应用程序"、"删除应用程序"。
在这里,对于从左到右的语言,标题和副标题总是左对齐,反之亦然。
苹果公司关于实施快速行动的指导方针。
- 为有用和创造性的任务创建快速行动。
- 对于涉及复杂的导航到目标屏幕的操作,避免使用快速行动。
- 如果快速行动是动态配置的,那么要确保它不会产生任何不可预测的变化。
- 每个快速行动的标题都应该简短而清晰地表达。
- 不要将快速行动用于通知。
- 为每个快速行动提供一个可识别的图标。你可以使用系统图标,也可以使用自定义图标。
- 限制表情符号的使用,因为它不是单色的,而且它不会正确对齐。
快速行动可以被配置为静态或动态。
- 构建时的静态动作在用户安装或更新应用时是可见的。此外,如果适合你的应用程序的快速动作永远不会改变,请在项目的Info.plist文件中将它们定义为静态快速动作。
- 运行时的动态动作是在应用程序至少启动一次后对用户可见的。在这里,可以根据用户的行为来配置这些动作。
定义静态快速动作
快速动作可以在应用程序的Info.plist文件中静态地添加UIApplicationShortcutItems数组。数组中的每个元素是一个UIApplicationShortcutItem字典,代表快速动作。它包含以下条目
- UIApplicationShortcutItemTitle。一个必要的字符串,作为你的动作的标题显示。如果有必要,它将显示为最多两行。此外,如果需要的话,我们可以对标题进行本地化。
- UIApplicationShortcutItemSubtitle。一个可选的字符串,作为您的操作的副标题显示,并显示在标题下面。它将以单行形式显示。另外,如果需要的话,我们可以将副标题本地化。
- UIApplicationShortcutItemIconType。一个图像图标的可选字符串,描述了该快捷方式应该使用哪种主屏幕快速动作图标。
- UIApplicationShortcutItemIconFile: 一个可选的字符串,用于自定义图像图标名称。提供的图像名称将从应用程序的捆绑中加载,并将被屏蔽以符合系统定义的图标样式。苹果公司建议自定义图像图标应该是方形的,单色的,35x35点。
- UIApplicationShortcutItemUserInfo。一个可选的应用程序特定信息,可以提供给应用程序执行快速操作时使用。
- UIApplicationShortcutItemType。当用户点击快速操作时传递给您的应用程序的一个必要的唯一字符串。它用于识别要执行的快速操作的类型。
Info.plist文件的快照显示了如何静态地添加快速动作。
如果你觉得打字速度慢,那么复制下面的内容,将Info.plist作为源代码打开并粘贴。
<key>UIApplicationShortcutItems</key>\
<array>\
<dict>\
<key>UIApplicationShortcutItemTitle</key>\
<string>Search</string>\
<key>UIApplicationShortcutItemSubtitle</key>\
<string>by product name</string>\
<key>UIApplicationShortcutItemIconType</key>\
<string>UIApplicationShortcutIconTypeSearch</string>\
<key>UIApplicationShortcutItemType</key>\
<string>QuickAction.Search</string>\
</dict>\
<dict>\
<key>UIApplicationShortcutItemTitle</key>\
<string>Saved Items</string>\
<key>UIApplicationShortcutItemIconFile</key>\
<string>SavedItems</string>\
<key>UIApplicationShortcutItemType</key>\
<string>QuickAction.SavedItems</string>\
</dict>\
<dict>\
<key>UIApplicationShortcutItemTitle</key>\
<string>Cart</string>\
<key>UIApplicationShortcutItemIconFile</key>\
<string>cart.png</string>\
<key>UIApplicationShortcutItemType</key>\
<string>QuickAction.Cart</string>\
</dict>\
</array>
定义动态快速行动
它可以通过将UIApplication共享实例的shortcutItems属性设置为UIApplicationShortcutItem对象的数组来进行配置。它看起来像UIApplication.shared.shortcutItems = [shortcutItem] 。
func addSearchQuickAction() {
removeSavedItemsQuickAction()
let searchItem = UIApplicationShortcutItem(type: ApplicationShortcutItemType.search.rawValue,
localizedTitle: ApplicationShortcutItemTitle.search.rawValue,
localizedSubtitle: ApplicationShortcutItemSubTitle.search.rawValue,
icon: UIApplicationShortcutIcon(type: .update),
userInfo: nil)
var shortcutItems = UIApplication.shared.shortcutItems ?? []
shortcutItems.append(searchItem)
UIApplication.shared.shortcutItems = shortcutItems
}
动态地添加快速动作
func removeSearchQuickAction() {
var shortcutItems = UIApplication.shared.shortcutItems ?? []
for (index, item) in shortcutItems.enumerated() {
if item.type == ApplicationShortcutItemType.search.rawValue {
shortcutItems.remove(at: index)
}
}
UIApplication.shared.shortcutItems = shortcutItems
}
动态删除快速动作
在上面的例子中,在添加quickAction之前已经删除了快速动作(如果有的话),以避免冗余。
处理快速行动
当用户触发主屏幕快速操作时,你的应用程序会以下列方式之一得到通知。
- 如果应用程序不在运行状态,那么快捷项目的细节将通过方法
application(_:didFinishLaunchingWithOptions:)的 launchOptions参数传递。 - 如果应用程序处于运行状态,那么AppDelegate中的以下方法
application(_:performActionFor:completionHandler:)将被触发。
var launchedShortcutItem: UIApplicationShortcutItem?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// If the app is launched by Quick Action, then take the relevant action
if let shortcutItem = launchOptions?[UIApplication.LaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem {
launchedShortcutItem = shortcutItem
// Since, the app launch is triggered by QuicAction, block "performActionForShortcutItem:completionHandler" method from being called.
return false
}
return true
}
处理快速行动,如果应用程序未被加载
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
guard let actionType = ApplicationShortcutItemType(rawValue: shortcutItem.type) else { return }
switch actionType {
case .search:
print("Handle search action")
case .savedItems:
print("Handle Saved Items action")
case .cart:
print("Handle Cart action")
}
}
处理快速行动,如果应用程序已被加载
我并不总是使用直接的字符串比较。所以Enum类型被用于比较。
enum ApplicationShortcutItemType:String {
case search = "QuickAction.Search"
case savedItems = "QuickAction.SavedItems"
case cart = "QuickAction.Cart"
}
enum ApplicationShortcutItemTitle:String {
case search = "Search"
case savedItems = "Saved Items"
case cart = "Cart"
}
enum ApplicationShortcutItemSubTitle:String {
case search = "by product name"
}
用来处理字符串的Enum类型
最终输出
关于快速行动的事实
- 如果应用程序刚刚安装,那么在按下主屏幕上的应用程序图标时,只显示静态快速动作(如果可用)。
- 在应用程序首次启动后,动态动作(如果可用)会在按下主屏幕上的应用程序图标时显示。
- 如果应用程序被更新,那么旧的快速操作只对用户可见(如果可用),直到更新后的应用程序启动。
- 但据报道,上述情况可以通过在快速动作的userInfo参数中提供应用程序版本来解决。
- 如果快速动作是静态和动态配置的,那么动态动作会被赋予高优先级。如果它有空间可以容纳,那么静态快速动作就会被加在最后。
在GitHub上获取完整的源代码
通过在GitHub上创建一个账户,为Karthikeyan-Thiru/QuickAction的开发做出贡献。
github.com
参考资料。苹果文档
觉得读起来不错?
推荐这篇文章(通过点击👏按钮),让其他人也能看到......在LinkedIn上联系我 Karthikeyan
Karthikeyan ThirugnanaSambandam - 软件工程师 - Ivy Mobility | LinkedIn
经验丰富的iOS开发人员,在消费者服务行业有良好的工作经验。熟练掌握...