浅谈3D Touch(1) -- Home screen quick action

1. 背景:

随着iOS9 和 iPhone 6s的普及,苹果官方提供的3D Touch将带给我们更好玩,更便捷的操作习惯,桌面快捷菜单可谓是3D Touch功能中最实用的一个,有了它,用户不再需要进入app后做额外的操作,便能快速进入指定的页面。

2. 前期工作:

由于手头“并(wo)没(xiang)有(yao)”iPhone 6s 的设备,很多人说,那我怎么开发这个功能呢?不怕,github上早有大神写好了模拟器的解决方案。按照这个文档上的方法依次执行,你的模拟器也能唤出快捷菜单。

3. 正式接入

①.创建UIApplicationShortcutItem

我们先来看一下每个UIApplicationShortcutItem中能够包含哪些信息

key Description required
UIApplicationShortcutItemType 事件的唯一标识,可以通过这个标识来辨别你具体点击了哪个事件 Y
UIApplicationShortcutItemTitle 标题,在没有子标题的情况下如果标题太长能自动换行 Y
UIApplicationShortcutItemSubtitle 子标题,在标题的下方 N
UIApplicationShortcutItemIconType 枚举选取系统中的一个图标类型 N
UIApplicationShortcutItemIconFile 自定义一个图标,以单一颜色35x35的大小展示,如果设置这个,UIApplicationShortcutItemIconType将不起作用 N
UIApplicationShortcutItemUserInfo 字典,里面可以添加各种key、value对 N

UIApplicationShortcutItem 的创建有2种方式

  • 第一种是在info.plist里面静态添加:

<key>UIApplicationShortcutItems</key>
<array>
	<dict>
		<key>UIApplicationShortcutItemType</key>
		<string>3dtouch.homePage</string>
		<key>UIApplicationShortcutItemTitle</key>
		<string>首页</string>
		<key>UIApplicationShortcutItemSubtitle</key>
		<string>这是首页</string>
		<key>UIApplicationShortcutItemIconFile</key>
		<string>shouye.png</string>
		<key>UIApplicationShortcutItemUserInfo</key>
		<dict>
			<key>url</key>
			<string>index</string>
		</dict>
	</dict>
	<dict>
		<key>UIApplicationShortcutItemType</key>
		<string>3dtouch.guanzhupage</string>
		<key>UIApplicationShortcutItemTitle</key>
		<string>关注</string>
		<key>UIApplicationShortcutItemSubtitle</key>
		<string>这是关注</string>
		<key>UIApplicationShortcutItemIconFile</key>
		<string>guanzhu.png</string>
		<key>UIApplicationShortcutItemUserInfo</key>
		<dict>
			<key>url</key>
			<string>guanzhu</string>
		</dict>
	</dict>
</array>
  • 第二种是在程序初始化的时候用代码动态添加:

我们先看一下UIApplicationShortcutItem.h,发现它的使用非常简单,习惯完全符合官方API固有方式,而且和之前那种方式所构建的包含的信息是一一对应的,其中有3个@interface分别是:

  • UIApplicationShortcutIcon
  • UIApplicationShortcutItem
  • UIMutableApplicationShortcutItem

//创建快捷item的icon 即UIApplicationShortcutItemIconFile
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"money"];

UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"gouwuche"];

UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"wode"];

//创建快捷item的userinfo 即UIApplicationShortcutItemUserInfo
NSDictionary *info1 = @{@"url":@"money"};
NSDictionary *info2 = @{@"url":@"gouWuche"};
NSDictionary *info3 = @{@"url":@"wode"};

//创建ShortcutItem
UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"3dtouch.moneyPage" localizedTitle:@"资产" localizedSubtitle:@"这是资产" icon:icon1 userInfo:info1];

UIMutableApplicationShortcutItem *item2 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"3dtouch.shopPage" localizedTitle:@"购物车" localizedSubtitle:@"这是购物车" icon:icon2 userInfo:info2];

UIMutableApplicationShortcutItem *item3 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"3dtouch.mypage" localizedTitle:@"我的" localizedSubtitle:@"这是我的" icon:icon3 userInfo:info3];

//把原有的shortcutItems拿出来,把动态的放进去
NSArray *items = @[item1, item2, item3];

NSArray *existingItems = [UIApplication sharedApplication].shortcutItems;

NSArray *updatedItems = [existingItems arrayByAddingObjectsFromArray:items];

//塞回去
[UIApplication sharedApplication].shortcutItems = updatedItems;

最后我们来看一下效果:

看上去是不是非常和谐?其实我告诉你,我们已经踩到了坑里了

我在运行中发现:

NSArray *existingItems = [UIApplication sharedApplication].shortcutItems;

所获得的existingItems并不是我们之前设置在info.plist里面的,而是上一次

[UIApplication sharedApplication].shortcutItems = updatedItems;

赋值给他的,又因为我自作聪明的做了一次

NSArray *updatedItems = [existingItems arrayByAddingObjectsFromArray:items];

所以我们每运行一次,shortcutItems中的元素个数就会多3个,

那为什么展示出来没有问题呢?

仔细看刚刚发的那张效果图,我擦,只有4个,对了,这个就是表象上不出错的原因,在API上并没有写shortcutItems有任何个数限制,也没有写快捷窗口的个数,但是实际上,最多只能显示4个,而且shortcutItems这个里面的对象恐怕是早已被系统默默的存到了某个plist里了,每当程序启动时,会向系统要app的Bundle Identifier对应的shortcutItems,并非我们事先想要的info.plist中的items,当然以上只是我从现象做出的合理猜测,我们并不需要关心info.plist中的那些静态item,只需要动态创建的item直接打包赋值过去

[UIApplication sharedApplication].shortcutItems = @[item1, item2, item3];

至于只展示4个的问题,这个我们无能为力了,系统做了限制。

②.Item点击回调

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

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0);

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

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

UIApplication又给我们一个从launchOptions中获取这个shortcutItem的key–UIApplicationLaunchOptionsShortcutItemKey,所以在这2个都进行对shortcutItem的操作后,我们这个功能算是完成了

在didFinishLaunchingWithOptions中,由于某些客户端会有启动动画,所以这边加了3秒,具体因程序而异

UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
	__strong typeof(weakSelf) strongSelf = weakSelf;
	if (strongSelf)
   	{
   		[strongSelf actionWithShortcutItem:item];
   	}
});

在performActionForShortcutItem回调中

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler
{
    if (shortcutItem)
    {
        [self actionWithShortcutItem:shortcutItem];
    }

    if (completionHandler)
    {
        completionHandler(YES);
    }
}

最后就是统一处理actionWithShortcutItem的地方,由于我这个demo中所有的type对应的行为都一样的,所以我这边没有对type做区分,甚至所以的item可以用同一个type

-(void)actionWithShortcutItem:(UIApplicationShortcutItem *)item
{
    if (item.userInfo)
    {
        NSLog(@"%@",item.userInfo[@"url"]);
    }
}

好了,3D Touch的第一个功能就介绍到这里 Demo

时间: 2024-08-04 12:57:01

浅谈3D Touch(1) -- Home screen quick action的相关文章

浅谈3D Touch(2) -- UITouch &amp;&amp; Peek &amp;&amp; Pop

UITouch 之所以先说UITouch是因为从Peek到Pop这个过程中,相信其内部用到了这个东西,我们来看一下iOS9在这个UITouch中加了哪些东西: UIForceTouchCapability UIForceTouchCapabilityUnknown //3D Touch检测失败 UIForceTouchCapabilityUnavailable //3D Touch不可用 UIForceTouchCapabilityAvailable //3D Touch可用 这3个枚举值就是我

[技术分享]浅谈3D Touch 在Xamarin.iOS上的应用 (上)

问题描述 新的iPhone6s和iPhone6sPlus新添加了3DTouch的功能,本文简单介绍一下如何在Xamarin.iOS上面使用该功能.3DTouch不仅会感知用户按压屏幕,也会感知压力的大小.要注意一点的是,现在的iOS模拟器并不支持3DTouch,大家必须要在iPhone6s/6sPlus真机上进行测试和调试.3DTouch可以给你的应用带来全新的交互方式.•PressureSensitivity-应用可以感知用户按压屏幕的压力.这样一些绘画应用可以根据压力的大小改变笔触.•Pee

[技术分享]浅谈3D Touch 在Xamarin.iOS上的应用 (下)

问题描述 接定义静态QuickActionsQuickActions的行为可以是一个或者多个,我们需要在Info.plist中声明他们,代码如下<key>UIApplicationShortcutItems</key><array><dict><key>UIApplicationShortcutItemIconType</key><string>UIApplicationShortcutIconTypeSearch<

iOS 3D Touch功能

目录[-] 新的触摸体验--iOS9的3D Touch 一.引言 二.在模拟器上学习和测试3D Touch 附.SBShortcutMenuSimulator的安装和使用 三.3D Touch的主要应用 四.3D Touch的三大模块 1.Home Screen Quick Actions 2.peek and pop 3.Force Properties 五.Home Screen Quick Action使用与相关api详解 1.静态标签 2.动态标签 3.响应标签的行为 六.结语 新的触摸

iOS9系列专题一——3D Touch

新的触摸体验--iOS9的3D Touch 一.引言         在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,通过区分轻按和重按来进行不同的用户交互. 二.在模拟器上学习和测试3D Touch         3D Touch是一个很新颖的设计,可是苹果文档有言: With Xcode 7.0 you must develop on a device that support

浅谈javascript的Touch事件_javascript技巧

js的touch事件,一般用于移动端的触屏滑动 复制代码 代码如下: $(function(){document.addEventListener("touchmove", _touch, false);}) function _touch(event){alert(1);} touchstart:当手指触摸屏幕时触发:即使已经有一个手指放在了屏幕上也会触发. touchmove:当手指在屏幕上滑动时连续的触发.在这个事件发生期间,调用preventDefault()可阻止滚动. to

浅谈TeeChart组件在ASP中的应用

chart 浅谈TeeChart组件在ASP中的应用 由于TeeChart VCL 版本广泛应用于多种开发环境并得到很好的认可,西班牙Steema Software SL公司于1997年10月又开发了TeeChart Pro ActiveX.对于B/S的开发模式无疑是一个好消息,由于它只需安装在服务器端,客户端无需安装其他软件,只要使用通用浏览器即可显示统计图形,因此一面市更是又一次得到极大的欢迎. 下面我们结合ASP技术介绍一下TeeChart Pro V5 ActiveX组件常用属性及应用.

浅谈 LLDB 调试器 - 如果这叫浅谈,那深得到啥样了呢!

浅谈 LLDB 调试器 2015-01-26 11:34 编辑: z_zombie 分类:iOS开发 来源:南峰子的技术博客 随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器.它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板,在这里我们可以直接调用LLDB命令.如图1所示: 图1:位于Xcode调试区域的控制台 在本文中,我们主要整理

浅谈OCR之Onenote 2010

原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的更新.维护,可以说是潜力很大,值得期待.由上一次的测试结果也可以看出,Tesseract的OCR结果还不是很理想,尤其是中英文混合的文字,其识别率有限.本次我们来关注下Office 2010中的Onenote,调用其API来测试OCR功能. PS:在公司经理一直推荐使用MyBase来记录工作中遇到的