1、简介

  3DTouch是在6s之后苹果的一项技术,只能在6s及其以上机型真机运行,Xcode的模拟器是不支持的。

  • Quick Actions(点击icon的快捷方式)

  • Peek&Pop(应用内快速预览内容)

  • UITouch和LivePhoto(读取压力和最大压力)

2、Quick Actions(点击icon的快捷方式)

  点击app的图标,可以弹出Today小组件(如果有的话)和UIApplicationShortcutItem快捷方式——这就是Quick Actions!

//
// UIApplicationShortcutItem.h
// UIKit
//
// Copyright © 2015-2017 Apple Inc. All rights reserved.
// #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @class UIImage; typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) {
UIApplicationShortcutIconTypeCompose, //用户自定义
UIApplicationShortcutIconTypePlay, //播放
UIApplicationShortcutIconTypePause, //暂停
UIApplicationShortcutIconTypeAdd, //添加
UIApplicationShortcutIconTypeLocation, //位置
UIApplicationShortcutIconTypeSearch, //搜索
UIApplicationShortcutIconTypeShare, //分享
UIApplicationShortcutIconTypeProhibit NS_ENUM_AVAILABLE_IOS(9_1), //禁止
UIApplicationShortcutIconTypeContact NS_ENUM_AVAILABLE_IOS(9_1), //联系人
UIApplicationShortcutIconTypeHome NS_ENUM_AVAILABLE_IOS(9_1), //家庭
UIApplicationShortcutIconTypeMarkLocation NS_ENUM_AVAILABLE_IOS(9_1), //标记位置
UIApplicationShortcutIconTypeFavorite NS_ENUM_AVAILABLE_IOS(9_1), //偏爱
UIApplicationShortcutIconTypeLove NS_ENUM_AVAILABLE_IOS(9_1), //喜爱
UIApplicationShortcutIconTypeCloud NS_ENUM_AVAILABLE_IOS(9_1), //云访问
UIApplicationShortcutIconTypeInvitation NS_ENUM_AVAILABLE_IOS(9_1), //邀请
UIApplicationShortcutIconTypeConfirmation NS_ENUM_AVAILABLE_IOS(9_1), //确认
UIApplicationShortcutIconTypeMail NS_ENUM_AVAILABLE_IOS(9_1), //邮箱
UIApplicationShortcutIconTypeMessage NS_ENUM_AVAILABLE_IOS(9_1), //消息
UIApplicationShortcutIconTypeDate NS_ENUM_AVAILABLE_IOS(9_1), //日历
UIApplicationShortcutIconTypeTime NS_ENUM_AVAILABLE_IOS(9_1), //时间
UIApplicationShortcutIconTypeCapturePhoto NS_ENUM_AVAILABLE_IOS(9_1), //照片
UIApplicationShortcutIconTypeCaptureVideo NS_ENUM_AVAILABLE_IOS(9_1), //视频
UIApplicationShortcutIconTypeTask NS_ENUM_AVAILABLE_IOS(9_1), //创建任务
UIApplicationShortcutIconTypeTaskCompleted NS_ENUM_AVAILABLE_IOS(9_1), //完成任务
UIApplicationShortcutIconTypeAlarm NS_ENUM_AVAILABLE_IOS(9_1), //闹钟
UIApplicationShortcutIconTypeBookmark NS_ENUM_AVAILABLE_IOS(9_1), //书签
UIApplicationShortcutIconTypeShuffle NS_ENUM_AVAILABLE_IOS(9_1), //洗牌
UIApplicationShortcutIconTypeAudio NS_ENUM_AVAILABLE_IOS(9_1), //音频
UIApplicationShortcutIconTypeUpdate NS_ENUM_AVAILABLE_IOS(9_1) //更新
} NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED; NS_CLASS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED
@interface UIApplicationShortcutIcon : NSObject <NSCopying>
//初始化
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;
//基于应用程序包中的图像创建主屏幕快速动作图标,最好是在资产目录中。
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName; @end NS_CLASS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED
@interface UIApplicationShortcutItem : NSObject <NSCopying, NSMutableCopying> //初始化
- (instancetype)init NS_UNAVAILABLE;
/**
@param type 自定义的字符串type
@param localizedTitle 标题
@param localizedSubtitle 子标题
@param icon 图标
@param userInfo 传递的信息
*/
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle; //读取相关初始化信息
@property (nonatomic, copy, readonly) NSString *type;
@property (nonatomic, copy, readonly) NSString *localizedTitle;
@property (nullable, nonatomic, copy, readonly) NSString *localizedSubtitle;
@property (nullable, nonatomic, copy, readonly) UIApplicationShortcutIcon *icon;
@property (nullable, nonatomic, copy, readonly) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo; @end NS_CLASS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED
//可变item
@interface UIMutableApplicationShortcutItem : UIApplicationShortcutItem
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *localizedTitle;
@property (nullable, nonatomic, copy) NSString *localizedSubtitle;
@property (nullable, nonatomic, copy) UIApplicationShortcutIcon *icon;
@property (nullable, nonatomic, copy) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo; @end NS_ASSUME_NONNULL_END

UIApplicationShortcutItem相关API

  2.1、静态创建

    直接配置Info.plist文件

  2.2、动态创建  

    代码创建:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSMutableArray *arrShortcutItem = (NSMutableArray *)[UIApplication sharedApplication].shortcutItems; UIApplicationShortcutItem *shoreItem1 = [[UIApplicationShortcutItem alloc] initWithType:@"适得府君书咖啡来看" localizedTitle:@"搜索" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch] userInfo:nil];
[arrShortcutItem addObject:shoreItem1];
UIApplicationShortcutItem *shoreItem2 = [[UIApplicationShortcutItem alloc] initWithType:@"杜师傅就快两个打开分割" localizedTitle:@"新消息" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeCompose] userInfo:nil];
[arrShortcutItem addObject:shoreItem2];
UIApplicationShortcutItem *shoreItem3 = [[UIApplicationShortcutItem alloc] initWithType:@"sdfasjdfhsksdjfsdajklfdjfh" localizedTitle:@"加大开发" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLocation] userInfo:nil];
[arrShortcutItem addObject:shoreItem3];
UIApplicationShortcutItem *shoreItem4 = [[UIApplicationShortcutItem alloc] initWithType:@"sdfasjdfhskdjfh" localizedTitle:@"新" localizedSubtitle:@"" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare] userInfo:nil];
[arrShortcutItem addObject:shoreItem4]; [UIApplication sharedApplication].shortcutItems = arrShortcutItem;
return YES;
}

  2.3、点击响应方法

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
NSLog(@"name ==%@\n type = %@",shortcutItem.localizedTitle,shortcutItem.type);
}

  ps:系统优先加载静态方法创建的item,可以混合加载,最多4个item;

    正式发布后会有5个item,苹果统一添加个分享的item;

    有的item的图标会显现在右侧,这个和app在屏幕得位置有关;

3、Peek&Pop(应用内快速预览内容)

  Peek页面预览:给视图添加一点压力,会以弹框的方式预览目标界面;

  Pop拉出菜单:在界面预览时,如果有菜单选项,向上拖拽下面会出现菜单栏;

  继续增加压力会跳转到目标界面——也就是Peek&Pop!

  3.1、Peek

    本例在图片上添加此功能:前提一个是可以交互、二是注册registerForPreviewingWithDelegate

    [self.imageView setUserInteractionEnabled:YES];
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:(id)self sourceView:self.imageView];
}

    创建菜单栏:需要在目标ViewController界面重写- (NSArray<id<UIPreviewActionItem>> *)previewActionItems;方法

- (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");
}];
NSArray *actions = @[action1,action2];
UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"Action Group" style:UIPreviewActionStyleDefault actions:actions]; return@[action1,action2,group1];
}

    预览视图方法和跳转视图方法:

//预览
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location NS_AVAILABLE_IOS(9_0)
{
if ([self.presentedViewController isKindOfClass:[VideoViewController class]]){
return nil;
}else {
VideoViewController *contentVC = [[VideoViewController alloc] init];
return contentVC;
}
} //重按进入
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0)
{
NSLog(@"重按进入");
VideoViewController *v = [[VideoViewController alloc] init];
[self presentViewController:v animated:YES completion:nil];
}

4、UITouch和LivePhoto(读取压力和最大压力)

  在UITouch类中有两个方法用来读取实时压力和最大压力:

// 触摸压力值
@property(nonatomic,readonly) CGFloat force NS_AVAILABLE_IOS(9_0);
// 最大触摸压力值
@property(nonatomic,readonly) CGFloat maximumPossibleForce NS_AVAILABLE_IOS(9_0);

  在本例中重写了ImageView的代理方法获取这两个数值:

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"=======%lf",touches.anyObject.force);
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"------%lf",touches.anyObject.maximumPossibleForce);
}

  结果:

  LivePhoto是一张图片和一段3秒的视频组成,当使用3D Touch时会播放这段视频,手指放开会结束播放。

  所以这个效果通过UITouch的上面两个属性就可以自己完成!

iOS开发之3D Touch的更多相关文章

  1. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

  2. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  3. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  4. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  5. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  6. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

  7. iOS开发之info.pist文件和.pch文件

    iOS开发之info.pist文件和.pch文件 如果你是iOS开发初学者,不用过多的关注项目中各个文件的作用.因为iOS开发的学习路线起点不在这里,这些文件只会给你学习带来困扰. 打开一个项目,我们 ...

  8. iOS开发之WKWebView简单使用

    iOS开发之WKWebView简单使用   iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...

  9. iOS 开发之Block

    iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1.     按钮事件 target action 机制. 它是将一 ...

随机推荐

  1. SCP-bzoj-1054

    项目编号:bzoj-1054 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 直接状压BFS即可,我实现的比较渣..复杂度O(45*216). 附录: #include <bits/st ...

  2. Delphi Base64编码_解码及ZLib压缩_解压(转)

    最近在写的程序与SOAP相关,所以用到了一些Base64编码/解码及数据压缩/解压方面的知识. 在这里来作一些总结:一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然 ...

  3. centos 下安装 shpinx2.1.7 记录

    安装sphinx yum install -y mysql mysql-devel yum install automake autoconf cd /usr/local/src/ wget http ...

  4. [SCOI2014]方伯伯的玉米田 题解(树状数组优化dp)

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  5. 在ag-grid表格上实现类似Excel中的按下enter键自动跳转到下一行对应的输入框功能,Angular4开发

    最近的项目使用ag-grid在Angular中处理表格,收到个需求是要能够同时修改大量的数据,按下Enter键的时候,光标得自动跳到下一行的对应列上. 方法一:用ag-grid自带的 enterMov ...

  6. Dijkstra Algorithm 迪克特斯拉算法--Python

    迪克斯拉特算法: 1.找出代价最小的节点,即可在最短时间内到达的节点: 2.更新节点的邻居的开销: 3.重复这个过程,直到图中的每个节点都这样做了: 4.计算最终路径. ''' 迪克斯特拉算法: 1. ...

  7. robotframework 时间控件的操作的几种方法总结。

  8. Ubuntu下安装Samba服务器

    闲来无聊尝试自己安装下Samba服务器,使本机和虚拟机可以无障碍传输文件(虽然用VMwaretools可传,但总感觉麻烦,而且速度欠佳) 首先,同安装qemu一样,在安装之前要确定你的系统apt列表已 ...

  9. kmalloc vs vmalloc

    kmalloc分配物理上连续的空间,可以不是整页大小的. vmalloc分配逻辑上连接的空间,可以不是物理上连接的.

  10. 【Java多线程系列二】Thread类的方法

    Thread实现Runnable接口并实现了大量实用的方法. /* * 此方法释放CPU,但并不释放已获得的锁,其它就绪的线程将可能得到执行机会,它自己也有可能再次得到执行机会 */ public s ...