iOS9提供了四类API( Home Screen Quick ActionUIKit Peek & PopWebView Peek & PopUITouch Force Properties )用于操作3D Touch。不过无论使用哪一种API,首先需要做的事情是检查3D Touch是否可用。

检测是否支持3D Touch

在iOS9中提供如下的接口用于检查设备是否支持3D Touch:

@property(nonatomic, readonly) UIForceTouchCapability forceTouchCapability;

其中 UIForceTouchCapability 是一个枚举类型,具体的描述情况如下:

  • UIForceTouchCapability

    • UIForceTouchCapabilityUnknown //3D Touch检测失败
    • UIForceTouchCapabilityUnavailable //3D Touch不可用
    • UIForceTouchCapabilityAvailable //3D Touch可用

这3个枚举值就是我们来判断设备是否开启3D Touch功能,可以在UIViewController生命周期的viewWillAppear中做如下判断:

if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
//do something
}

当然在生命周期内,如果用户有意修改了设备的3D Touch功能,我们还有一个地方来重新检测:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
//do something
}

Home Screen Quick Action

创建Quick Action有两种方式:静态和动态

①以静态方式创建

静态创建的方式是在Info.plist文件中进行声明的

<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeShare</string>
<key>UIApplicationShortcutItemTitle</key>
<string>分享</string>
<key>UIApplicationShortcutItemType</key>
<string>UITouchText.share</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>key1</key>
<string>value1</string>
</dict>
</dict>
<dict>
<key>UIApplicationShortcutItemType</key>
<string>com.devzeng.about</string>
<key>UIApplicationShortcutItemTitle</key>
<string>关于我们</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string>这是关于我们</string>
<key>UIApplicationShortcutItemIconFile</key>
<string>icon_about.png</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>scheme</key>
<string>devzeng://about</string>
</dict>
</dict>
</array>

②以动态方式创建

动态创建是在程序初始化的时候用代码动态添加。 UIApplication 对象多了一个支持快捷方式的数组(shortcutItems), 如果需要增加快捷方式,可以赋值给shortcutItems属性。

在方法中 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@""];
UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"search22"
localizedTitle:@"search22"
localizedSubtitle:@"0abc"
icon:icon
userInfo:nil];
application.shortcutItems = @[item];

说明:

1)系统限制每个App最多能够显示4个Action Item,其中包括静态方式和动态方式进行创建的;

2)如果静态和动态方式同时使用的时候,给UIApplication的shortcutItems赋值的时候不会覆盖

3)注,定义的图标 是35x35 的单色图标

当app在后台的时候UIApplication提供了一个回调方法,如下

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem
completionHandler:(void(^)(BOOL succeeded))completionHandler{
//判断先前我们设置的唯一标识
if([shortcutItem.type isEqualToString:@"UITouchText.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:@"UITouchText.search"])
{
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");
}
}

我们依据这个回调中的shortcutItem的type和userinfo来做出不同的事件处理,而最后的completionHandler在API的说明中我们看到当应用并非在后台,而是直接重新开进程的时候,直接返回No,那么这个时候,我们的回调会放在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

UIApplication又给我们一个从launchOptions中获取这个shortcutItem的key(UIApplicationLaunchOptionsShortcutItemKey)

UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
//根据不同的Action响应不同的事件

Peek and Pop(预览和详阅)

如同使用放大镜拉近视角,预览(Peek)内容(照片、视频)让你可以获得更多信息而不需要加载完整内容。

Instagram首先将Peek功能添加到了小图片和视频上。

Peek(预 览)和Pop(详阅)相关的API为UIViewControllerPreviewingDelegate,它通过view来注册。在 Instagram中,我们只将其注册到可以接受到touch事件的controller的view上。当3D touch事件发生时,delegate来检测view中的哪个对象被点击。

如果delegate判断有Peek(预览)动作发生,它仍需要处理两件事情:1. 设置预览动作发生的view的rect;2. 返回展示的viewcontroller。

当3D touch发生时,会传递给你context信息,包含源view和点击发生的point。自定义的delegate需要通过这个point映射到一个view,然后查找到需要预览的数据。

大多数的Instagram功能基于UICollectionView和UITableView实现。这两者在数据和UI间对应方面都有不错的API支持。

- (UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location {
UICollectionView *collectionView = (UICollectionView *)[previewingContext sourceView];
NSIndexPath *indexPath = [collectionView indexPathForItemAtPoint:location]; if (indexPath) {
IGPostCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
[previewingContext setSourceRect:cell.frame]; IGPost *post = self.feedController.posts[indexPath.row];
IGThumbnailPreviewController *controller = [[IGThumbnailPreviewController alloc] initWithPost:post];
return controller;
} // no peek
return nil;
}

将预览相关的API和现有的view和功能结合后,查看Instagram照片和视频变的异常简单

我们为header和comment中的用户名添加了查看信息的功能。用来预览用户信息的delegate和显示照片/视频的实现类似:

  • 使用3D touch点击的location和查找到的index path找到对应的cell。

  • 将点击的point关联转换到cell中的textview上。

  • 通过该point获取到text view中的attributed string的属性。

  • 如果找到了用户名称的属性,则返回IGUserPreviewController。

将这些实现串起来,看起来就像这样:

混合内容展示

Instagram中的activity feed功能包含了用户的tag和缩略图。我们之前分别创建过UIViewControllerPreviewingDelegate的对象,用来显示这两种内容。这里我们需要把这些组合在一起。

拷贝已有代码到新的delegate中的做法并不明智。我们选择使用composition模式来组合profile和post展示的delegate代码,这样创建一个新的对象,只需要传递touch 事件即可。

@interface IGUserThumbnailPreviewingHandler : NSObject
@property (nonatomic, strong) IGUserPreviewingHandler *userDelegate;
@property (nonatomic, strong) IGFeedThumbnailPreviewingHandler *thumbnailDelegate;
@end - (UIViewController *)previewingContext:(idUIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
id controller = [self.thumbnailDelegate previewingContext:previewingContext viewControllerForLocation:location];
if (!controller) {
controller = [self.userDelegate previewingContext:previewingContext viewControllerForLocation:location];
}
return controller;
}

用来显示预览的controller只是UIViewController的子类,在某些特别属性上有所不同。

一开始,controller完全无法交互,你无法在上面点击按钮或添加自定义手势。这里我们需要提供遵循UIPreviewActionItem协议的对象组成的数组。在Instagram中,我们只用UIPreviewActions。

这些功能看起来很像UIAlertController的action item。

在整个Instagram程序中,我们只在需要的时候加载数据,并缓存以备以后使用。这样做既节省了网络等待的时间,又不会浪费用户的带宽。

有 时,当预览用户profile时,我们获取的数据还不足以用来显示最新照片或关注者数量。预览用的view controller仍然会调用viewDidLoad, viewWillAppear:和其他UIViewController事件。在其中可以获取网络数据并更新UI。

最后,我们发现可以通过修改controller的preferredContentSize来调整预览视图的大小,即便是controller已经展示了,这样的改变仍可生效。不过,这个属性无法作用于动画中。

ios 3D Touch功能的实现

参考:http://git.devzeng.com/blog/ios9-3d-touch.html?utm_source=tuicool&utm_medium=referral

http://engineering.instagram.com/posts/465414923641286/lessons-learned-with-3D-touch

http://www.cocoachina.com/ios/20151110/14129.html

在iOS9 中使用3D Touch的更多相关文章

  1. iOS9新特性-3D Touch

    本文主要讲解3DTouch各种场景下的开发方法,开发主屏幕应用icon上的快捷选项标签(Home Screen Quick Actions),静态设置 UIApplicationShortcutIte ...

  2. iOS- 指压即达,如何集成iOS9里的3D Touch

    1.前言   随着6S的到来,3DTouch被各大热门APP迅速普及,博主亲自体验后,发现使用便捷性大幅提高,随后自己照着文档,写了个Demo出来,分享给大家,希望能对有需要的朋友提供有一些帮助. 2 ...

  3. 5月8日——iOS中的3D Touch效果

    需要在manifest.json文件中进行配置 需要执行的js代码为: 最终操作效果为 本篇文章主要采用了HTML5+  中的 launcher属性 具体可参照 http://www.html5plu ...

  4. 3D Touch开发全面教程之Peek and Pop - 预览和弹出

    ## 3D Touch开发全面教程之Peek and Pop - 预览和弹出 --- ### 了解3D Touch 在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch ...

  5. iOS 3D Touch 适配开发

    3D Touch的主要应用 文档给出的应用介绍主要有两块: 1.A user can now press your Home screen icon to immediately access fun ...

  6. 3D Touch

    一.认识3D Touch   1.硬件和操作系统要求      iPhone 6s或者iPhone 6s Plus      操作系统要求 ios9+ 2.3D Touch的交互效果 QuickAct ...

  7. Swift 玩转 3D Touch 之 Peek & Pop

    什么是3D Touch 3D Touch 是iOS9之后专为 iPhone6s 机型加入的新特性,这一新技术移植于 Mac Book 上的 ForceTouch 更准确地说应该是 ForceTouch ...

  8. 3d touch 应用 2 -备用

    一.引言 在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,通过区分轻按和重按来进行不同 ...

  9. iOS 3D Touch功能 3 -备

    新的触摸体验——iOS9的3D Touch 一.引言 二.在模拟器上学习和测试3D Touch 附.SBShortcutMenuSimulator的安装和使用 三.3D Touch的主要应用 四.3D ...

随机推荐

  1. 【[AHOI2013]差异】

    这个题一看就是为后缀家族设计的 我们看到我们要求的这个柿子 \[\sum_{i=1}^n\sum_{j=i+1}^nT_i+T_j-2\times lcp(T_i,T_j)\] 显然的是前面的那些东西 ...

  2. jQuery做字符串分隔

    var str=new String(); var arr=new Array(); str="ddd,dsd,3,dd,g,k"; //可以用字符或字符串分割 arr=str.s ...

  3. google浏览器window.onbeforeunload方法兼容问题

    window.onbeforeunload方法在IE内核浏览器是有效的,但是在google浏览器中并不兼容,请教给位怎么在google浏览器中兼容window.onbeforeunload方法 采纳的 ...

  4. 8、JVM--虚拟机字节码执行引擎

    8.1.概述 执行引擎是Java虚拟机最核心的组成部分之一.“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器.硬件.指令集和操作系统层面上 ...

  5. WorldWind源码剖析系列:表面瓦片类SurfaceTile

    表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...

  6. QT 用listveiw显示图片

    很多的时候需要浏览图片,一般会使用listview 显示图片,接下来我用listview显示图片 代码如下: QStandardItem * s1; QStandardItem * s2; QStan ...

  7. 树莓派学习笔记(3):利用VNC远程控制树莓派

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi      等了一个十一假期,新买的B+终于到了.按照前两节的方法,重新安装了操作系统. 一.添加国内软件源 Rasp ...

  8. 4-51单片机ESP8266学习-AT指令(测试TCP服务器--使用串口调试助手--不连接路由器)

    上一篇连接  http://www.cnblogs.com/yangfengwu/p/8757513.html 源码链接:https://pan.baidu.com/s/1wT8KAOIzvkOXXN ...

  9. 20155305《网络对抗》Web安全基础实践

    20155305<网络对抗>Web安全基础实践 基础问题回答 SQL注入攻击原理,如何防御? 原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL ...

  10. 2015306 白皎 《网络攻防》EXP6 信息搜集与漏洞扫描

    2015306 白皎 <网络攻防>EXP6 信息搜集与漏洞扫描 一.问题回答 (1)哪些组织负责DNS,IP的管理. 顶级的管理者是Internet Corporation for Ass ...