欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS系统3DTouch全解析

程序员文章站 2022-05-27 17:09:07
概述 ios10登录中国,在系统中对3d touch的使用需求更频繁,所以对ios9中便引入的3d touch功能做一些了解是很有必要的 在日常开发中,我们经常需要使用3d touch中的两个功...
iOS系统3DTouch全解析

概述

ios10登录中国,在系统中对3d touch的使用需求更频繁,所以对ios9中便引入的3d touch功能做一些了解是很有必要的

在日常开发中,我们经常需要使用3d touch中的两个功能

在主屏幕上对应用图标使用3dtouch操作

在应用程序内对某一控件使用3dtouch操作

shortcutitem

概述

shortcutitem功能允许用户在主屏幕上对应用图标使用3dtouch操作,如果本次操作有效,则会给出几个快捷可选项允许用户进行操作

iOS系统3DTouch全解析

静态添加

在info.plist中添加uiapplicationshortcutitems关键字,以如下方式配置即可

iOS系统3DTouch全解析

其中各个关键字释义如下:

uiapplicationshortcutitemtype: 快捷可选项的特定字符串(必填)

uiapplicationshortcutitemtitle: 快捷可选项的标题(必填)

uiapplicationshortcutitemsubtitle: 快捷可选项的子标题(可选)

uiapplicationshortcutitemicontype: 快捷可选项的图标(可选)

uiapplicationshortcutitemiconfile: 快捷可选项的自定义图标(可选)

uiapplicationshortcutitemuserinfo: 快捷可选项的附加信息(可选)

动态添加

uiapplicationshortcutitem

每一个快捷可选项是一个uiapplicationshortcutitem对象,其指定初始化器(ns_designated_initializer)如下

-(instancetype)initwithtype:(nsstring*)typelocalizedtitle:(nsstring*)localizedtitlelocalizedsubtitle:(nullablensstring*)localizedsubtitleicon:(nullableuiapplicationshortcuticon*)iconuserinfo:(nullablensdictionary*)userinfo;

其中各个参数释义如下:

type: 快捷可选项的特定字符串(必填)

localizedtitle: 快捷可选项的标题(必填)

localizedsubtitle: 快捷可选项的子标题(可选)

icon: 快捷可选项的图标(可选)

userinfo: 快捷可选项的附加信息(可选)

uiapplicationshortcuticon

每一个快捷可选项图标为一个uiapplicationshortcuticon对象,我们可以使用系统提供的多个图标,也可以自定义我们自己的图标

//使用系统提供的图标

+(instancetype)iconwithtype:(uiapplicationshortcuticontype)type;

//自定义图标

+(instancetype)iconwithtemplateimagename:(nsstring*)templateimagename;

系统提供的图标样式如下:

iOS系统3DTouch全解析

注: 自定义图标需要使用镂空图标,同时建议1倍图标大小为35*35

示例

//以"动态添加四个快捷可选项"为例 uiapplicationshortcuticon*searchshortcuticon=[uiapplicationshortcuticoniconwithtype:uiapplicationshortcuticontypesearch]; uiapplicationshortcutitem*searchshortcutitem=[[uiapplicationshortcutitemalloc]initwithtype:@"com.liupeng.search"localizedtitle:@"search"localizedsubtitle:@"searchsubtitle"icon:searchshortcuticonuserinfo:nil]; uiapplicationshortcuticon*playshortcuticon=[uiapplicationshortcuticoniconwithtype:uiapplicationshortcuticontypeplay]; uiapplicationshortcutitem*playshortcutitem=[[uiapplicationshortcutitemalloc]initwithtype:@"com.liupeng.play"localizedtitle:@"play"localizedsubtitle:@"playsubtitle"icon:playshortcuticonuserinfo:nil]; uiapplicationshortcuticon*qrshortcuticon=[uiapplicationshortcuticoniconwithtemplateimagename:@"shortcut_qr"]; uiapplicationshortcutitem*qrshortcutitem=[[uiapplicationshortcutitemalloc]initwithtype:@"com.liupeng.qr"localizedtitle:@"qr"localizedsubtitle:@"qrsubtitle"icon:qrshortcuticonuserinfo:nil]; uiapplicationshortcuticon*payshortcuticon=[uiapplicationshortcuticoniconwithtemplateimagename:@"shortcut_pay"]; uiapplicationshortcutitem*payshortcutitem=[[uiapplicationshortcutitemalloc]initwithtype:@"com.liupeng.pay"localizedtitle:@"pay"localizedsubtitle:@"paysubtitle"icon:payshortcuticonuserinfo:nil]; [uiapplicationsharedapplication].shortcutitems=@[searchshortcutitem,playshortcutitem,qrshortcutitem,payshortcutitem];

触发回调

当用户通过点击快捷可选项进入应用程序会回调如下方法,我们可以在这里通过快捷可选项的type来加以区分,以便进行不同的操作

-(void)application:(uiapplication*)applicationperformactionforshortcutitem:(uiapplicationshortcutitem*)shortcutitemcompletionhandler:(void(^)(bool))completionhandler { if([shortcutitem.typeisequaltostring:@"com.liupeng.search"]) { //omething... } elseif([shortcutitem.typeisequaltostring:@"com.liupeng.play"]) { //dosomething... } //... }

注意

在动态添加快捷可选项前,需要用判断是否支持3d touch功能,以免在不支持的设备上运行程序导致闪退

if([selfrespondstoselector:@selector(traitcollection)]) { if([self.traitcollectionrespondstoselector:@selector(forcetouchcapability)]) { if(self.traitcollection.forcetouchcapability==uiforcetouchcapabilityavailable) { //支持3dtouch } else { //不支持3dtouch } } }

注: 在支持3d touch的设备上,用户可以在程序运行期间通过设置 -> 通用 -> 辅助功能 -> 3d touch来关闭3d touch功能,所以我们有必要通过重写-traitcollectiondidchange:方法随时处理

peek & pop

概述

peek和pop是应用内的一种全新交互模式,当用户不断增加力量在控件上按压,会依次进入四个阶段

轻按控件,除触发peek的控件外,其他区域全部虚化

iOS系统3DTouch全解析

继续用力peek被触发,展示pop界面快照

iOS系统3DTouch全解析

向上滑动展示快捷选项

iOS系统3DTouch全解析

继续用力跳转进入pop界面

iOS系统3DTouch全解析

使用

以"从viewcontroller中的uilabel控件通过peek & pop进入detailviewcontroller"为例,对peek & pop的使用进行一下讲解

需要实现peek & pop交互的控件所在的控制器遵守uiviewcontrollerpreviewingdelegate协议

@interfaceviewcontroller() @end

在控制器内为需要实现peek & pop交互的控件注册peek & pop功能

[selfregisterforpreviewingwithdelegate:selfsourceview:label];

当进入peek状态时,系统会回调如下方法

-(nullableuiviewcontroller*)previewingcontext:(id)previewingcontextviewcontrollerforlocation:(cgpoint)location { //previewingcontext.sourceview:触发peek&pop操作的视图 //previewingcontext.sourcerect:设置触发操作的视图的不被虚化的区域 detailviewcontroller*detailvc=[[detailviewcontrolleralloc]init]; //预览区域大小(可不设置) detailvc.preferredcontentsize=cgsizemake(0,300); returndetailvc; }

当进入pop状态时,系统会回调如下方法

-(void)previewingcontext:(id)previewingcontextcommitviewcontroller:(uiviewcontroller*)viewcontrollertocommit { [self.navigationcontrollerpushviewcontroller:viewcontrollertocommitanimated:yes]; }

在peek时希望提供一些快捷选项,需要在detailviewcontroller中重写previewactionitems的getter方法

-(nsarray>*)previewactionitems { uipreviewaction*action1=[uipreviewactionactionwithtitle:@"选项一"style:uipreviewactionstyledefaulthandler:^(uipreviewaction*_nonnullaction,uiviewcontroller*_nonnullpreviewviewcontroller){ }]; uipreviewaction*action2=[uipreviewactionactionwithtitle:@"选项二"style:uipreviewactionstyleselectedhandler:^(uipreviewaction*_nonnullaction,uiviewcontroller*_nonnullpreviewviewcontroller){ }]; uipreviewaction*action3=[uipreviewactionactionwithtitle:@"选项三"style:uipreviewactionstyledestructivehandler:^(uipreviewaction*_nonnullaction,uiviewcontroller*_nonnullpreviewviewcontroller){ }]; uipreviewactiongroup*actiongroup=[uipreviewactiongroupactiongroupwithtitle:@"选项组"style:uipreviewactionstyledefaultactions:@[action1,action2]]; return@[action1,action2,action3,actiongroup]; }