3DTouch攻略
2016-09-08 本文已影响780人
GiantAxe77
3DTouch概览
- 备受瞩目的6s及6s Plus上市以来,3DTouch也进入了人们的视线.它主要有如下图所示的几个用途👇:
![](https://img.haomeiwen.com/i1795408/31345d6fcf91525b.png)
是不是看起来很炫酷吊炸天哈哈哈?
亲们先来预览下效果图哈:
![](http://upload-images.jianshu.io/upload_images/1795408-e137a8a5d7375b5b.gif)
这里给出官方链接:API资料 查阅资料
Quick Actions用法
- 用法步骤so easy.
-
第一步,在
APPDelegate
类application:didFinishLaunchingWithOptions:
方法里码代码. -
第二步,在
APPDelegate
类写3DTouch对应的代理application:performActionForShortcutItem:completionHandler:
方法.
-
第一步,在
- 废话不多说,直接上代码.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 首先判断是否支持3DTouch
if(self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
{
[self setup3DTouch:application];
}
return YES;
}
- (void)setup3DTouch:(UIApplication *)app
{
// 设置图标icon (UIApplicationShortcutIconTypeMarkLocation为系统提供的样式之一)
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMarkLocation];
// 设置shortcutItem
//
// type : 唯一标识
// localizedTitle : 标题
// localizedSubtitle : 子标题
// icon : 图标
// userInfo : 传递的字典
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"item1" localizedTitle:@"Sweet" localizedSubtitle:@"honey" icon:icon1 userInfo:nil];
UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCloud];
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"item2" localizedTitle:@"Super" localizedSubtitle:@"me" icon:icon2 userInfo:nil];
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage];
UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"item3" localizedTitle:@"Legend" localizedSubtitle:@"logo" icon:icon3 userInfo:nil];
// 加入到shortcutItems数组中
app.shortcutItems = @[item1, item2, item3];
}
#pragma mark - UIApplicationDelegate
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
if([shortcutItem.type isEqualToString:@"item1"])
{
NSLog(@"to do sth...");
}
}
- 实现出来的效果如图:
![](http://upload-images.jianshu.io/upload_images/1795408-298cb39de73e85ef.jpeg)
- 或者可以使用info.plist静态添加3DTouch,方法更是easy,直接上图:
![](http://upload-images.jianshu.io/upload_images/1795408-3b6e77afd1dacdae.png)
Peek and Pop用法
-
简单介绍: 经过授权的应用的试图控制器可以响应用户不同的按压力量,随着按压力量的增加,会有三个交互阶段:
- 暗示预览功能可用,会有一个虚化的效果.
- ** Peek**:展示预览的视图以及快捷选项菜单(peek quick action).
- Pop:跳转到预览的视图控制器.
- 使用步骤:
- 第一步,首先要判断设备是否支持3DTouch,并且要判断在运行环境改变的情况下3DTouch是否可用.
- ** 第二步**,遵守
UIViewControllerPreviewingDelegate
代理,实现代理的2个方法. - ** 第三步,给响应Peek&Pop**手势的视图进行注册.
-
最后一步, 向上滑动预览视图的时候,在视图下方可以展示一些选项去操作,可以通过在预览视图控制器中添加
previewActionItems
来实现.
- 来,不说废话,代码,走起!
#pragma mark - life cycle
//页面一进来最好先判断下3DTouch是否可用,不可用就尴尬了😆
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
{
NSLog(@"do sth");
}
}
- (void)viewDidLoad {
[super viewDidLoad];
// 给响应Peek&Pop手势的视图进行注册,这里是给一个imageView进行注册😋
[self registerForPreviewingWithDelegate:self sourceView:self.imgView];
}
#pragma mark - 3DTouch
// Called when the iOS interface environment changes.
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{ // 环境变化时判断3DTouch是否可用
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
{
NSLog(@"do sth");
}
}
#pragma mark - UIViewControllerPreviewingDelegate
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
// 通过上下文可以调整不被虚化的范围
previewingContext.sourceRect = CGRectMake(10, 10, 10, 10);
// 预览控制器是我的另外一个控制器😆
AXEParticleViewController *vc = [AXEParticleViewController new];
return vc;
}
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
// 这个相当于push操作,push到预览的控制器
[self showViewController:viewControllerToCommit sender:self];
}
#pragma mark - 👇下面代码是在预览控制器中写的👇
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
// 生成UIPreviewAction
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"one" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"Action 1");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"two" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"Action 2");
}];
// 添加到数组里返回
NSArray *actions = @[action1, action2];
return actions;
}
- 到此,大功告成!