·前言
前段时间因为对3D Touch感兴趣,研究了一下,发现网上的教程很多,很杂乱,所以在此整理一下,弄一个完整的,自己容易看懂的笔记。以便以后用到的时候再花时间去找。
·工具
恩,3D Touch 是需要6s以上的设备支持的,不过呢,技术没有难题,有牛人在github上为我们提供了一个插件,可以让我们在模拟器上进行3D Touch的效果测试:
那个,具体用法我这里就不写了。大家捣鼓捣鼓就出来了。因为我也没用过😢;
ps: 由于本人比较懒,所以可能有些图就网上盗去了,
·正题
一、在icon处直接响应的功能模块
我们先来看看效果
ps:这个最多可以设置4个标签,每个标签后面可以跟一个图标
响应icon的有两种方式
1、在info.plist文件里面配置
这种也叫静态标签
我们来看看我是怎样写的,话不多说,先直接上图
先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:
必填项(下面两个键值是必须设置的):
·UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串,用于点击后响应不同的事件
·UIApplicationShortcutItemTitle 这个键值设置标签的标题
·
选填项(下面这些键值不是必须设置的) :
·UIApplicationShortcutItemSubtitle 设置标签的副标题
·UIApplicationShortcutItemIconFile 设置标签的Icon文件(也就是图片)
·UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)
2、 在代码里面添加
这种叫动态标签
/**
type 该item 唯一标识符
localizedTitle :标题
localizedSubtitle:副标题
icon:icon图标 可以使用系统类型 也可以使用自定义的图片
userInfo:用户信息字典 自定义参数,完成具体功能需求
*/
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"item1@3x.png"];
UIApplicationShortcutIcon *cameraIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose];
UIApplicationShortcutItem *cameraItem = [[UIApplicationShortcutItem alloc] initWithType:@"item1" localizedTitle:@"拍照" localizedSubtitle:@"" icon:cameraIcon userInfo:nil];
UIApplicationShortcutIcon *shareIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
UIApplicationShortcutItem *shareItem = [[UIApplicationShortcutItem alloc] initWithType:@"item2" localizedTitle:@"分享" localizedSubtitle:@"" icon:shareIcon userInfo:nil];
/** 将items 添加到app图标 */
application.shortcutItems = @[cameraItem,shareItem];
ok,icon的入口我们弄完了。接下来就是是重点
二、响应标签的行为
其实这玩意儿和推送的原理差不多,都是根据标签的type来进行相关的逻辑操作。接下来看我的:
首先在AppDelegate里面添加如下方法
- (void)application:(UIApplication *)application
performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void(^)(BOOL succeeded))completionHandler
{
}
在上面这个方法里面写一个UINavigationController
UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
判断先前我们设置的唯一标识,根据标识符推送到指定的Controller
if([shortcutItem.type isEqualToString:@"one"]){
oneViewController *vc = [[oneViewController alloc] init];
[nav pushViewController:vc animated:YES];
}else if ([shortcutItem.type isEqualToString:@"two"]){
twoViewController *vc = [[twoViewController alloc] init];
[nav pushViewController:vc animated:YES];
}
ok,点击推送的也就搞定了
三、点击tableView的cell界面预览
1、在tableView的代理方法里面加上如下代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
cell.textLabel.text = self.dataSource[indexPath.row];
cell.textLabel.numberOfLines = 0;
// 这里判断是否支持3D Touch功能
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
NSLog(@"3D Touch 可用!");
//如果支持,给cell注册3DTouch的peek(预览)和pop功能
[self registerForPreviewingWithDelegate:self sourceView:cell];
} else {
NSLog(@"3D Touch 无效");
}
return cell;
}
实现代理 UIViewControllerPreviewingDelegate
2、实现UIViewControllerPreviewingDelegate的代理方法
效果图如下:
// 预览效果
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
// 记录是哪一个cell被按,[previewingContext sourceView]就是按压的那个视图
NSIndexPath *index = [self.tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
// 设定预览界面
showViewController *showVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"showViewController"];
showVC.titleLabel.text = self.dataSource[index.row];
showVC.preferredContentSize = CGSizeMake(0, 500);
//调整不被虚化的范围,按压的那个cell不被虚化(轻轻按压时周边会被虚化,再少用力展示预览,再加力跳页至设定界面)
CGRect rect = CGRectMake(0, 0, self.view.frame.size.width,40);
previewingContext.sourceRect = rect;
return showVC;
}
// 用力按进入的controller
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
[self showViewController:viewControllerToCommit sender:self];
}
3、在预览的controller里面设置action
效果图如下:
直接上代码
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"第一个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
// 点击事件写到这里
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"第2个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"第3个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
UIPreviewAction *action4 = [UIPreviewAction actionWithTitle:@"第4个" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
NSArray *action = @[action1,action2,action3,action4];
return action;
}
- 本文的demo,可以下来看看
- 查阅的这篇博客后,加入了其他博客的东西整理出来的
- 欢迎转载,但是请注明出处啊,谢谢啊亲!
·好了,大概就是这么多了,关于获取到压力值的那个东西我正在测试,空闲的时候我会贴上来。
ps 这是个人见解,如果有不对的地方,欢迎留言指出,大家相互探讨。谢谢!!