文档章节

iOS9 新特性 3DTouch

魔笛GNR
 魔笛GNR
发布于 2016/07/21 10:16
字数 1539
阅读 45
收藏 0
点赞 0
评论 0

1、按压图标 弹出菜单

 

WeChat_1469066154.jpeg

像上图那样,按压图标 弹出菜单。这是应用最多的场景。那么如何实现呢?有两种方法:

 

静态的:

在info.plist添加如下键值对,每一个Item代表一个标签按钮,你可以添加标题,副标题,可以使用系统图标,也可以使用你自己的图片资源作为图标,只需添加你的图片名称即可。下面列举常用的键值对:

/*
     常用键值对
     
     UIApplicationShortcutItemTitle  标题

     UIApplicationShortcutItemType   类型可以设置标识符
   
     UIApplicationShortcutItemIconType   图标类型,可设置系统图标样式

     UIApplicationShortcutItemSubtitle   副标题

     UIApplicationShortcutItemUserInfo   可存放一个字典,通过这个传值

*/

屏幕快照 2016-07-21 上午10.06.28.png

 

​下面列举系统支持的图标类型,根据你的需求来获取吧。

屏幕快照 2016-07-21 上午10.04.12.png

 

动态的:

//创建图标3DTouch 菜单
- (void)codeAddItems{
    
    //系统风格的icon
    UIApplicationShortcutIcon *share = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
    
    //使用自定义图标
    UIApplicationShortcutIcon *saoyisao = [UIApplicationShortcutIcon iconWithTemplateImageName:@"erweima"];
    
    //创建快捷选项 type 标识符
    UIApplicationShortcutItem * item1 = [[UIApplicationShortcutItem alloc]initWithType:@"com.occode.app.share" localizedTitle:@"分享" localizedSubtitle:@"分享副标题" icon:share userInfo:nil];
    
    UIApplicationShortcutItem * item2 = [[UIApplicationShortcutItem alloc]initWithType:@"com.mycompany.app.saoyisao" localizedTitle:@"扫一扫" localizedSubtitle:@"扫一扫副标题" icon:saoyisao userInfo:nil];
    
    //添加到快捷选项数组
    [UIApplication sharedApplication].shortcutItems = @[item1,item2];
    
}

 

运行效果:

 

小结:

动态标签不能覆盖静态标签,但可以追加,最多支持四个标签。

 

点击标签后的响应

app未启动时:

点击后,我们可以从launchOptions中捕捉到UIApplicationShortcutItem,从而根据其类型来处理我们想要的结果:

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

 

捕捉UIApplicationShortcutItem,此时我们需要return NO而不是YES;

//如果是从快捷选项标签启动app,则根据不同标识执行不同操作,然后返回NO
UIApplicationShortcutItem *shortcutItem = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
if (shortcutItem) {
    //根据Item的类型来进一步处理
   [self showForItem:shortcutItem];
    return NO;
}

 

app在后台时:

需要实现下面这个函数:

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler;

 

具体实现如下: 

//如果app在后台,通过快捷选项标签进入app,则调用该方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {

    //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作
    [self showForItem:shortcutItem];
    
    if (completionHandler) {
        completionHandler(YES);
    }
}

 

 

2、Peek 与 Pop

首先来看看微信的效果图:

 

Peek,偷偷一看,即轻按预览:

 

具体实现步骤如下:

第一步:让控制器遵守代理<UIViewControllerPreviewingDelegate>

第二步:判断该设备是否支持3DTouch

//判断是否支持3DTouch
- (BOOL)isValidForceTouch{
    return self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable;
}

第三步:如果支持3DTouch,则给这个cell注册3DTouch预览功能,遵守代理

//给这个cell注册3DTouch预览功能
[self registerForPreviewingWithDelegate:self sourceView:cell];

第四步:实现Peek协议方法

// peek 预览
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    //按压的行
    NSIndexPath * indexPath = [_tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
    //预览界面
    ShowViewController * showVC = (ShowViewController *)[self vcForSBID:kShowVCId];
    showVC.title = @"我是按进来的";
    showVC.text = [self selectedTextForRow:indexPath.row];
    //临时显示自定义的导航
    [showVC showTitle];
    
    return showVC;
}

看下运行效果:

Pop,重按进入:

第五步:实现Pop协议方法

//pop 进入
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
    ShowViewController * showVC = (ShowViewController *)viewControllerToCommit;
    //隐藏我们临时的导航,因为进入后有真正的导航
    [showVC hideTitle];
    [self showViewController:viewControllerToCommit sender:self];
}

运行效果图:

3、预览菜单

先来看看微信的效果图:

 

 

我们只需要在预览控制器里实现如下方法,返回一个UIPreviewActionItem的数组:

//peek 时上滑出现的菜单
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
    // 普通样式
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"Aciton1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"Aciton1");
    }];
    
    //已被选择的样式 后面有个对勾
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"Aciton2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"Aciton2");
    }];
    
    //警示样式(红色字体)
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"Aciton3" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"Aciton3");
    }];
    
    NSArray *actions = @[action1,action2,action3];
    
    return actions;
}

运行效果图:

4、关于导航、按压视图大小、预览视图的比例等

关于导航栏:

细心地同学发现,预览的界面是没有导航栏的,微信是怎么实现的呢?我在试了很多方法,发现“在peek是显示一个自定义的导航栏,pop时隐藏自定义的导航栏”是一个可行的办法(如果哪位同学知道更好的办法可以联系本人!!)。

 

关于按压视图大小:

有时候我们只想按压某一个区域来预览,而不是整个cell,也许是cell上的label,或view上的某一个区块,这时候我们可以改变显示的上下文视图的Rect来改变:

previewingContext.sourceRect = CGRectMake(0, 0, 300, 20);

 

关于预览视图比例:

预览视图的大小是可以改变的,如果你按压的是一个图片,pop出图片浏览器,显然效果不是那么理想,我们可以根据图片的大小来设置预览视图的大小:

// peek 预览
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    
    //预览界面
    PhotoViewController * pvc = [[PhotoViewController alloc]init];
    pvc.image = _imageView.image;
    
    //设置预览视图的比例 可以看出 预览视图的宽高比例 图片的比例是一致的
    pvc.preferredContentSize = CGSizeMake(_imageView.image.size.width, _imageView.image.size.height);
    
    return pvc;
}

 

预览视图比例演示效果如下:

 

5、捕获“压力值”

通过touchesBegan、touchesMoved等方法来捕获,获取force值:

//按住移动or压力值改变时的回调
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    
    NSArray *arrayTouch = [touches allObjects];
    UITouch *touch = (UITouch *)[arrayTouch lastObject];

    NSLog(@"move压力 = %f",touch.force);
    
    //label显示压力值
    _textLabel.text = [NSString stringWithFormat:@"压力%f",touch.force];

    self.view.backgroundColor = [self colorForForce:touch.force];
}

经测试发现压力的范围是0.06666...~6.6666...,需要注意的是 这里的force ”压力“值 并不是以牛顿为单位的物理上的力,而代表的是一个相对的参考系 我们通过0.666... ~ 6.666... 来模拟压力的小和大。例如:我吧force值和颜色对应起来,按得越重,背景颜色就越黑。

 

效果如下:

 

6、结束语

3DTouch用处还未被完全挖掘,希望iOS Coder可以用它开发出更有意思的产品和功能。

 

7、Demo地址

github:

https://github.com/ly918/Demos

© 著作权归作者所有

共有 人打赏支持
魔笛GNR
粉丝 6
博文 73
码字总数 36902
作品 0
郑州
iOS工程师
仿微博照片选择器--HXWeiboPhotoPicker

仿微博照片选择器 - 支持 LivePhoto、GIF 图片选择、3DTouch 预览功能等。 支持功能: 1、 查看/选择GIF图片 2、 照片、视频可同时多选/原图 3、 3DTouch预览照片 4、 长按拖动改变顺序 5、 ...

枫叶丶 ⋅ 2017/03/14 ⋅ 0

iOS 3D Touch功能

新的触摸体验——iOS9的3D Touch 一、引言 在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,...

SoulJa ⋅ 2015/11/04 ⋅ 0

iOS9系列专题一——3D Touch

新的触摸体验——iOS9的3D Touch 一、引言 在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,...

珲少 ⋅ 2015/09/26 ⋅ 12

iOS系统3DTouch全解析

概述 iOS10系统登录中国,在系统中对3D Touch的使用需求更频繁,所以对iOS9中便引入的3D Touch功能做一些了解是很有必要的 在日常开发中,我们经常需要使用3D Touch中的两个功能 在主屏幕上对应...

秦无炎 ⋅ 2016/11/14 ⋅ 0

iOS9后修改HTTP模式进行网络请求

升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错? 原因 iOS9引入了新特性 新特性要求App内访问的网络必须使用协议。 解决方案:在app的info.plist中设置使用http请求 在Inf...

奋斗的青春年华 ⋅ 2016/07/30 ⋅ 0

整理iOS9适配中出现的坑(图文)

本文主要是说一些iOS9适配中出现的坑,如果只是要单纯的了解iOS9新特性可以看瞄神的开发者所需要知道的 iOS 9 SDK 新特性。9月17日凌晨,苹果给用户推送了iOS9正式版,随着有用户陆续升级iOS...

Snaiper ⋅ 2015/09/29 ⋅ 2

iOS 8和iOS 9新特性总结

iOS8的新特性: 1.sizeClass 的推出: 在 iOS 8 中,Apple 的工程师们可以说“极富想象力”地干脆把限制和表征屏幕尺寸的长宽数字给去掉了,取而代之使用 size classes 的概念,将长宽尺寸按...

如若初见 ⋅ 2016/04/24 ⋅ 0

ionic 1.1.1 "yttrium-yeti" 发布,移动应用框架

ionic 1.1.1 "yttrium-yeti" 发布,此版本改进内容如下: Bug 修复 browser: ios9 location patch (e5b85df) ionContent: fix scroll sizing with native scrolling and pull-to-refresh (3a......

oschina ⋅ 2015/11/07 ⋅ 6

iOS-初识网络(一)

iOS中的网络请求可以从如下的类中体现: NSURL: NSURLRequest: NSURLConnection: NSURLResponse: NSURLSession: iOS9+ 1:网络的url决定着和谁通信: url格式 2:怎么通信:多个客户端用不同...

Nlinger ⋅ 2017/12/06 ⋅ 0

iOS9 HTTP 不能正常使用的解决办法

今天升级发现网络访问失败。 输出错误信息 The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. Google后查证,iOS9引入......

nerozhao ⋅ 2015/09/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

中标麒麟(龙芯版)7.0优盘安装

########################################## 制作U盘安装盘: 1.准备U盘: PMON环境下U盘必须格式化成ext3; 昆仑固件环境下可以格式化成ext3,ext4 2.把整个镜像 xxx.iso 复制到U盘下面 3....

gugudu ⋅ 18分钟前 ⋅ 0

老司机写的大数据建模五步走

本文将尝试来梳理一下数据建模的步骤,以及每一步需要做的工作。 01 第一步:选择模型或自定义模式 这是建模的第一步,我们需要基于业务问题,来决定可以选择哪些可用的模型。 比如,如果要预...

gulf ⋅ 27分钟前 ⋅ 0

PacificA 一致性协议解读

PacificA 的 paper 在 08 年左右发出来的,比 Raft 早了 6,7 年。 在 PacificA 论文中,他们强调该算法使用范围是 LAN (Local Area Network),讲白了就是对跨机房不友好。 不管是 ZAB,Raf...

黑客画家 ⋅ 29分钟前 ⋅ 0

盘符图标个性化

设置自己的专属盘符图标 准备ico格式的图片文件一个,在根目录下创建autorun.inf文件 文件内容 [Autorun]icon=logo.ico 重新启动或者插拔U盘即可看到结果...

阿豪boy ⋅ 29分钟前 ⋅ 0

Windows下QQ聊天记录中图片的默认存放位置

Windows下QQ聊天记录中图片的默认存放位置在设置中是没有说明的。 实测位置在:D:\Documents\Tencent Files\974101467\Image 其中: “974101467”为对应的QQ号; “C2C”为个人之间的聊天图...

临江仙卜算子 ⋅ 36分钟前 ⋅ 0

GC 的三种基本实现方式

参考资料《代码的未来》(作者: [日] 松本行弘)。 由于并非本人原著(我只是个“搬运工“),SO 未经本人允许请尽情转载。 另外个人像说明一下这里所说的GC指泛指垃圾回收机制,而单指Jav...

xixingzhe ⋅ 37分钟前 ⋅ 0

Android双击退出

/** * 菜单、返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode......

王先森oO ⋅ 41分钟前 ⋅ 0

idea 整合 vue 启动

刚学习Vue 搭建了一个项目 只能命令启动 Idea里面不会启动 尝试了一下修改启动的配置 如下: 1.首先你要保证你的package.json没有修改过 具体原因没有看 因为我改了这个name的值 就没办法启动...

事儿爹 ⋅ 46分钟前 ⋅ 0

redis在windows环境的后台运行方法

在后台运行,首先需要安装redis服务,命令为 redis-server.exe --service-install redis.windows.conf --loglevel verbose 启动,命令为 redis-server --service-start 停止,命令为 redis-...

程序羊 ⋅ 50分钟前 ⋅ 0

比特币现金开发者提出新的交易订单规则

本周,四位比特币现金的四位开发者和研究员:Joannes Vermorel(Lokad),AmaurySéchet(比特币ABC),Shammah Chancellor(比特币ABC)和Tomas van der Wansem(Bitcrust)共同发表了一篇关...

lpy411 ⋅ 53分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部