概述:iOS9中引入3D Touch功能,iOS10中对其使用需求更频繁,,所以对3D Touch功能做一些了解是很有必要的;
ShortcutItem功能允许用户在主屏幕上对应用图标使用3DTouch操作,如果本次操作有效,则会出现如截图效果:
静态添加
在info.plist中添加UIApplicationShortcutItems关键字,如下配置即可:
UIApplicationShortcutItemType: 快捷可选项的特定字符串(必填)
UIApplicationShortcutItemTitle: 快捷可选项的标题(必填)
UIApplicationShortcutItemSubtitle: 快捷可选项的子标题(可选)
UIApplicationShortcutItemIconType: 快捷可选项的图标(可选)
UIApplicationShortcutItemIconFile: 快捷可选项的自定义图标(可选)
UIApplicationShortcutItemUserInfo: 快捷可选项的附加信息(可选)
动态添加
在AppDelegate中的didFinishLaunchingWithOptions,添加如下代码:
/**
type: 快捷可选项的特定字符串(必填)
localizedTitle: 快捷可选项的标题(必填)
localizedSubtitle: 快捷可选项的子标题(可选)
icon: 快捷可选项的图标(可选)
userInfo: 快捷可选项的附加信息(可选)
*/
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"custom"];//自定义Icon
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch];//调用系统Icon
//以上二选一
UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"搜索唯一标识Str" localizedTitle:@"搜索" localizedSubtitle:@"搜索副标题" icon:icon userInfo:nil];
application.shortcutItems = @[item];
说明:
1)系统限制每个App最多能够显示4个Action Item,其中包括静态方式和动态方式进行创建的;
2)如果静态和动态方式同时使用的时候,给UIApplicationshortcutItems赋值的时候不会覆盖
3)注,定义的图标 是35x35 的单色图标
当app在后台的时候UIApplication提供了一个回调方法,如下:
//依据shortcutItem的type和userinfo来做出不同的事件处理
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler{
//判断先前我们设置的唯一标识(分享要在桌面实现就别做处理,上架后苹果给添加的)
if([shortcutItem.type isEqualToString:@"com.wsx.share"]){
NSArray *arr = @[@"hello 3D Touch"];
UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:arr applicationActivities:nil];
//设置当前的VC 为rootVC
[self.window.rootViewController presentViewController:vc animated:YES completion:^{
}];
}
else if ([shortcutItem.type isEqualToString:@"搜索对应特定Str"])
{
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"温馨提示" message:@"好想你" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:@"sure", nil];
[alertView show];
}
else if ([shortcutItem.type isEqualToString:@"UITouchText.look"])
{
UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:@"温馨提示" delegate:nil cancelButtonTitle:@"cancel" destructiveButtonTitle:@"删除" otherButtonTitles:@"更多", nil];
[sheet showInView:self.window];
}
else if ([shortcutItem.type isEqualToString:@"UITouchText.compose"])
{
NSLog(@"UITouchText.compose");
}
}
completionHandler在API的说明中我们看到当应用并非在后台,而是直接重新开进程的时候,直接返回No,那么这个时候,我们的回调会放在didFinishLaunchingWithOptions中;
从launchOptions中获取shortcutItem (UIApplicationLaunchOptionsShortcutItemKey)
//根据不同的Action响应不同的事件
UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
Peek(预览) and Pop(详阅)
参考于http://www.cocoachina.com/ios/20161114/18071.html
不啰嗦,效果自查,代码如下:
//首先遵循代理 UIViewControllerPreviewingDelegate
//在控制器内为需要实现Peek & Pop交互的控件注册Peek & Pop功能
[self registerForPreviewingWithDelegate:self sourceView:要功能的控件];
#pragma mark - 3D Touch
//当进入Peek状态时,系统会回调如下方法
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewingDelegate>)previewingContext viewControllerForLocation:(CGPoint)location
{
// previewingContext.sourceView: 触发Peek & Pop操作的视图
// previewingContext.sourceRect: 设置触发操作的视图的不被虚化的区域
ViewController *detailVC = [[ViewController alloc] init];//DetailViewController
detailVC.view.backgroundColor = [UIColor whiteColor];
// 预览区域大小(可不设置)
// detailVC.preferredContentSize = CGSizeMake(0, 300);
return detailVC;
}
//当进入Pop状态时,系统会回调如下方法
- (void)previewingContext:(id <UIViewControllerPreviewingDelegate>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
[self.navigationController pushViewController:viewControllerToCommit animated:YES];
}
//在Peek时希望提供一些快捷选项,需要在DetailViewController中重写previewActionItems的getter方法
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"选项一" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"选项二" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"选项三" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"选项组" style:UIPreviewActionStyleDefault actions:@[action1, action2]];
return @[action1, action2, action3, actionGroup];
}
网友评论