学习资料来源于http://www.cnblogs.com/zhanglinfeng/p/5133939.html
里面讲的已经够详细了,可以直接跳转进去学习,这里是自己理解之后进行的记录。
添加3D Touch选项
开发中的demo 3D Touch没有效果,上线的app默认会有一个分享功能;
最多可以添加4个3D Touch选项,加上上线后的分享选项,最多能显示5个。
添加方法有两种,一种在plist文件中,另一种用代码。
plist文件中添加
转载的网址中的图片UIApplicationShortcutItems:数组中的元素就是我们的那些快捷选项标签。
UIApplicationShortcutItemTitle:标签标题(必填)
UIApplicationShortcutItemType:标签的唯一标识(必填)
UIApplicationShortcutItemIconType:使用系统图标的类型,如搜索、定位、home等(可选)
UIApplicationShortcutItemIconFile:使用项目中的图片作为标签图标(可选)
UIApplicationShortcutItemSubtitle:标签副标题(可选)
UIApplicationShortcutItemUserInfo:字典信息,如传值使用(可选)
这种方式添加的item不能动态修改
代码添加
//手动创建3D Touch选项
//系统风格的icon
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay];
//自定义风格的icon
UIApplicationShortcutIcon *customIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"customImg.png"];
//创建选项
UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"shortcutItem.2" localizedTitle:@"代码创建的标题" localizedSubtitle:@"子标题" icon:icon userInfo:nil];
UIApplicationShortcutItem *customItem = [[UIApplicationShortcutItem alloc] initWithType:@"shortcutItem.3" localizedTitle:@"代码创建2" localizedSubtitle:@"子标题" icon:customIcon userInfo:nil];
//添加到选项数组
[UIApplication sharedApplication].shortcutItems = @[item,customItem];
代码添加的方式可以后期动态修改,还是比较方便的
图片.png上面系统自带的UIApplicationShortcutIconType系列icon,资料来源于http://www.cocoachina.com/ios/20161114/18071.html
关于程序启动
程序在被干掉的情况下,点击图标进入程序,会进入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
当程序通过3D Touch选项进入程序,而程序是被杀死的状态,同样会进入上面的方法,这里可以通过判断用户是不是通过3DTouch进入程序来进行响应
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
if (shortcutItem) {
//判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
if([shortcutItem.type isEqualToString:@"shortcutItem.0"]){
} else if ([shortcutItem.type isEqualToString:@"shortcutItem.1"]) {
}
return NO; //要返回NO,后面会说
}
return YES;
}
还有个情况是程序在后台,通过3D Touch的方式进入,此时是不会进入上面的方法,因为该方法只会执行一次
所以有另外一个入口:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
这个方法调用的条件为:
1.程序通过快捷选项进入;
2.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions这个方法中返回的是YES,所以上面的return NO,是为了防止同时激活两个入口方法,处理两次快捷选项的逻辑。
再详细一点,didFinishLaunchingWithOptions这个方法是比performActionForShortcutItem更早一步执行,当didFinishLaunchingWithOptions返回了NO之后,performActionForShortcutItem就不会执行
跳转
现在到了处理快捷选项的步骤了, 程序首次启动的处理方法在上面的if else里面;程序从后台进入的处理方法一样:
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
//判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
if([shortcutItem.type isEqualToString:@"shortcutItem.0"]){
} else if ([shortcutItem.type isEqualToString:@"shortcutItem.1"]) {
}
if (completionHandler) {
completionHandler(YES);
}
}
权限
/*
先遵循代理UIViewControllerPreviewingDelegate
该代理用于展示按压后预览的页面,以及按压成功后跳转到该控制器
*/
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
NSLog(@"3D Touch 可用!");
//注册3DTouch的peek(预览)和pop功能
[self registerForPreviewingWithDelegate:self sourceView:self.touchBtn];
} else {
NSLog(@"3D Touch 无效");
}
注意一点,上面代码在viewDidLoad内总是无效的,可以在viewDidAppear中或触发事件中,这个问题应该与视图加载程度有关
上面代码已经遵循了代理并且设置了可按压的view,接下来实现代理的方法进行一些设置,即可进行页面预览及页面跳转
#pragma mark - UIViewControllerPreviewingDelegate
//peek(预览)
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
//设定预览的界面
SearchVC *searchVC = [[SearchVC alloc] init];
//调整不被虚化的范围,按压的那个cell不被虚化(轻轻按压时周边会被虚化,再少用力展示预览,再加力跳页至设定界面)
CGRect rect = CGRectMake(0, 0, self.view.frame.size.width,50);
previewingContext.sourceRect = rect;
//返回预览界面
return searchVC;
}
//pop(按用点力进入)
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
[self showViewController:viewControllerToCommit sender:self];
}
被跳转的Controller
被跳转的控制器可以添加几个item,在上级页面按压时向上滑动弹出
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"Action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action1");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"Action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action2");
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"Action3" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action3");
}];
NSArray *actions = @[action1,action2,action3];
return actions;
}
3DTouch功能差不多就这些了,开头给的原网址里面有很清晰的讲解及demo,可以下载看看。
网友评论