在 上篇文章 我已经将 iPhone 的模拟器添加了 支持调试 3D touch 的功能
接下来就是如何将装逼进行到底
如何创建 Quick Action 也就是重按 app 图标时弹出的那几个菜单
正如上面的图中有两个Action Item 【历史记录】【查看下载】
每个 Action 都是使用 UIApplicationShortcutItem 这个对象进行创建的
下面列出每一个 UIApplicationShortcutItem 中能够包含的信息:
名称 | 描述 | 必须 |
---|---|---|
UIApplicationShortcutItemType | item事件的唯一标示、通过茨表示可以确定点击的那个item | YES |
UIApplicationShortcutItemTitle | item的标题、subtitle为空时、title过长可能会换行显示 | YES |
UIApplicationShortcutItemSubtitle | item的子标题、在title下方以小文字显示 | NO |
UIApplicationShortcutItemIconType | item图标枚举、系统的样式 | NO |
UIApplicationShortcutItemIconFile | 自定义item图标、大小为 35*35 的单一颜色样式呈现、 如果设置此项 UIApplicationShortcutItemIconType 将会失效 | NO |
UIApplicationShortcutItemUserInfo | 以字典的形式 key : value | NO |
Home Screen Quick Action 的创建 有两种方式
1. 静态
2. 动态
* 需要注意的是
每个App最多能够显示 4个Action Item,4个Action Item,4个Action Item
重要的事情要说 三 遍 最多4个Action Item
支持【静态方式】和【动态方式】同时存在、并不会冲突
如果你比较够叛逆、够任性、同时使用了【静态】和【动态】方式
那么你给 UIApplication 的 shortcutItems 这个数组赋值的时候并不会覆盖、并不会覆盖、并不会覆盖
我又说了三遍... 见谅
-
静态方式
静态创建的方式是在项目的 Info.plist 文件中添加数组即可
<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemType</key>
<string>download</string>
<key>UIApplicationShortcutItemTitle</key>
<string>历史记录</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string></string>
<key>UIApplicationShortcutItemIconFile</key>
<string>shortcut_history.png</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>***</key>
<string>***</string>
</dict>
</dict>
<dict>
<key>UIApplicationShortcutItemType</key>
<string>download</string>
<key>UIApplicationShortcutItemTitle</key>
<string>查看下载</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string></string>
<key>UIApplicationShortcutItemIconFile</key>
<string>shortcut_download.png</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>***</key>
<string>***</string>
</dict>
</dict>
</array>
-
动态方式
动态方式需要在 application didFinishLachingWithOption: 方法中实现
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (self.forceTouchCapability == UIForceTouchCapabilityAvailable) {
// 为了更直观的阅读代码 这里分成两行写
UIApplicationShortcutIcon *historyIcon;
historyIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_history"];
UIApplicationShortcutItem *historyItem = [[UIApplicationShortcutItem alloc]
initWithType:@"history"
localizedTitle:@"历史记录"
localizedSubtitle:nil
icon:historyIcon
userInfo:nil];
// 为了更直观的阅读代码 这里分成两行写
UIApplicationShortcutIcon *downloadIcom;
downloadIcom = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_download"];
UIApplicationShortcutItem *downloadItem = [[UIApplicationShortcutItem alloc]
initWithType:@"download"
localizedTitle:@"查看下载"
localizedSubtitle:nil
icon:downloadIcom
userInfo:nil];
application.shortcutItems = @[historyItem, downloadItem];
}
}
关于Quick Action 中 item 的点击事件 回调响应
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void (^)(BOOL))completionHandler {
}
我可以从 shortcutItem 的 type 和 userinfo 来做不同的事件处理
而最后的 completionHandler 在 API 的说明中我们看到当应用并非在后台
而是直接重新开进程的时候,会直接返回NO 这样的话我们的回调会放在
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
这时候 UIApplication 刚好提供了一个可以从 launchOptions 这个字典中
获取到 shortcutItem 的 key UIApplicationLaunchOptionsShortcutItemKey
有了这个Key 我们就可以处理不同的事件
UIApplicationShortcutItem *item; // 为了更直观的阅读代码 这里分成两行写
item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
这样我们根据获取到不同的 Action Item 来处理不同的事件
在 performActionForShortcutItem 回调中
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void(^)(BOOL succeeded))completionHandler
{
if ([shortcutItem.type isEqualToString:@"history"]) {
NSLog(@"历史记录");
}else if ([shortcutItem.type isEqualToString:@"download"]){
NSLog(@"查看下载");
}
if (completionHandler) {
completionHandler(YES);
}
}