iOS学习之:3D Touch

在项目中可能需要加入 3D Touch 功能,这篇文章就记录一下自己的学习结果。

有两种方式给应用添加 3D Touch 的菜单:静态添加(Info.plist)和动态添加(纯代码)。

  • 静态添加
  • 动态添加
  • 使用

预备

  • 3D Touch 只在 iOS 9 及以上版本得到支持,之前版本的 iOS 并不支持该功能;
  • 3D Touch 只在 iPhone 6s 及以后型号的 iPhone 或 iPad Pro 上可用,更早的设备并不支持该功能。

可以通过如下代码进行判断:

1
2
3
4
5
6
7
8
9
10
switch self.traitCollection.forceTouchCapability {
case .available:
print("支持 3D Touch")
case .unavailable:
print("不支持 3D Touch")
case .unknown:
print("未知状态,作不支持处理")
default:
break
}

静态添加

静态添加直接在 Info.plist 文件中添加如下字段即可:

各个字段的含义:

  • UIApplicationShortcutItems:数组中的元素是我们需要的快捷选项标签。
  • UIApplicationShortcutItemType(required):选项的唯一标识符。
  • UIApplicationShortcutItemTitle(required):选项的标题。
  • UIApplicationShortcutItemSubtitle:选项的子标题。
  • UIApplicationShortcutItemIconType:选项中显示系统提供的图标。
  • UIApplicationShortcutItemUserInfo:字典信息,可用于传值。
  • UIApplicationShortcutItemIconFile:使用项目中图片作为选项图标,指定了此选项后会忽略 UIApplicationShortcutItemIconType 的设置,用户自定义图片优先级高于系统图标。

参考链接:Information Property List Key Reference

效果图:

在 plist 文件中定义的顺序,在实际显示时,是按照距离 App 图标的顺序来排的。

动态添加

动态添加其实也是将上方 plist 中定义的字段用代码创建:

  1. 创建图标对象——UIApplicationShortcutIcon
  2. 创建菜单 item 对象——UIApplicationShortcutItem
  3. 将 item 数组赋值给

创建代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private func config3DTouchItems() {
if self.window!.traitCollection.forceTouchCapability == .available {

// 创建图标
// UIApplicationShortcutIcon(templateImageName: "") 可以使用自己的图片
let icon1 = UIApplicationShortcutIcon(type: .bookmark)
let icon2 = UIApplicationShortcutIcon(type: .home)

// 创建 item
let item1 = UIMutableApplicationShortcutItem(type: "item1", localizedTitle: "Item1", localizedSubtitle: "OneSub", icon: icon1, userInfo: ["item1": "valueforitem" as NSSecureCoding])
let item2 = UIMutableApplicationShortcutItem(type: "item2", localizedTitle: "Item2", localizedSubtitle: "TwoSub", icon: icon2, userInfo: ["item2": "value2foritem" as NSSecureCoding])

// 赋值
UIApplication.shared.shortcutItems = [item1, item2]
}
}

效果图:

使用

我们只需要在 AppDelegate 加入下面的方法,在其中我们可以获取到选项的一些信息:

1
2
3
4
5
6
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
print(shortcutItem.localizedTitle)
print(shortcutItem.localizedSubtitle)
print(shortcutItem.userInfo)
print(shortcutItem.type)
}