概述
iOS10系統(tǒng)登錄中國(guó),在系統(tǒng)中對(duì)3D Touch的使用需求更頻繁,所以對(duì)iOS9中便引入的3D Touch功能做一些了解是很有必要的
在日常開(kāi)發(fā)中,我們經(jīng)常需要使用3D Touch中的兩個(gè)功能
在主屏幕上對(duì)應(yīng)用圖標(biāo)使用3DTouch操作
在應(yīng)用程序內(nèi)對(duì)某一控件使用3DTouch操作
ShortcutItem
概述
ShortcutItem功能允許用戶在主屏幕上對(duì)應(yīng)用圖標(biāo)使用3DTouch操作,如果本次操作有效,則會(huì)給出幾個(gè)快捷可選項(xiàng)允許用戶進(jìn)行操作
靜態(tài)添加
在info.plist中添加UIApplicationShortcutItems關(guān)鍵字,以如下方式配置即可
其中各個(gè)關(guān)鍵字釋義如下:
UIApplicationShortcutItemType: 快捷可選項(xiàng)的特定字符串(必填)
UIApplicationShortcutItemTitle: 快捷可選項(xiàng)的標(biāo)題(必填)
UIApplicationShortcutItemSubtitle: 快捷可選項(xiàng)的子標(biāo)題(可選)
UIApplicationShortcutItemIconType: 快捷可選項(xiàng)的圖標(biāo)(可選)
UIApplicationShortcutItemIconFile: 快捷可選項(xiàng)的自定義圖標(biāo)(可選)
UIApplicationShortcutItemUserInfo: 快捷可選項(xiàng)的附加信息(可選)
動(dòng)態(tài)添加
UIApplicationShortcutItem
每一個(gè)快捷可選項(xiàng)是一個(gè)UIApplicationShortcutItem對(duì)象,其指定初始化器(NS_DESIGNATED_INITIALIZER)如下
-?(instancetype)initWithType:(NSString?*)type?localizedTitle:(NSString?*)localizedTitle?localizedSubtitle:(nullable?NSString?*)localizedSubtitle?icon:(nullable?UIApplicationShortcutIcon?*)icon?userInfo:(nullable?NSDictionary?*)userInfo;
其中各個(gè)參數(shù)釋義如下:
type: 快捷可選項(xiàng)的特定字符串(必填)
localizedTitle: 快捷可選項(xiàng)的標(biāo)題(必填)
localizedSubtitle: 快捷可選項(xiàng)的子標(biāo)題(可選)
icon: 快捷可選項(xiàng)的圖標(biāo)(可選)
userInfo: 快捷可選項(xiàng)的附加信息(可選)
UIApplicationShortcutIcon
每一個(gè)快捷可選項(xiàng)圖標(biāo)為一個(gè)UIApplicationShortcutIcon對(duì)象,我們可以使用系統(tǒng)提供的多個(gè)圖標(biāo),也可以自定義我們自己的圖標(biāo)
//?使用系統(tǒng)提供的圖標(biāo)
+?(instancetype)iconWithType:(UIApplicationShortcutIconType)type;
//?自定義圖標(biāo)
+?(instancetype)iconWithTemplateImageName:(NSString?*)templateImageName;
系統(tǒng)提供的圖標(biāo)樣式如下:
注: 自定義圖標(biāo)需要使用鏤空?qǐng)D標(biāo),同時(shí)建議1倍圖標(biāo)大小為35*35
示例
//?以"動(dòng)態(tài)添加四個(gè)快捷可選項(xiàng)"為例
UIApplicationShortcutIcon?*searchShortcutIcon?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypeSearch];
UIApplicationShortcutItem?*searchShortcutItem?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"com.liupeng.search"localizedTitle:@"Search"localizedSubtitle:@"Search?Subtitle"icon:searchShortcutIcon?userInfo:nil];
UIApplicationShortcutIcon?*playShortcutIcon?=?[UIApplicationShortcutIcon?iconWithType:UIApplicationShortcutIconTypePlay];
UIApplicationShortcutItem?*playShortcutItem?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"com.liupeng.play"localizedTitle:@"Play"localizedSubtitle:@"Play?Subtitle"icon:playShortcutIcon?userInfo:nil];
UIApplicationShortcutIcon?*qrShortcutIcon?=?[UIApplicationShortcutIcon?iconWithTemplateImageName:@"shortcut_QR"];
UIApplicationShortcutItem?*qrShortcutItem?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"com.liupeng.qr"localizedTitle:@"QR"localizedSubtitle:@"QR?Subtitle"icon:qrShortcutIcon?userInfo:nil];
UIApplicationShortcutIcon?*payShortcutIcon?=?[UIApplicationShortcutIcon?iconWithTemplateImageName:@"shortcut_pay"];
UIApplicationShortcutItem?*payShortcutItem?=?[[UIApplicationShortcutItem?alloc]?initWithType:@"com.liupeng.pay"localizedTitle:@"Pay"localizedSubtitle:@"Pay?Subtitle"icon:payShortcutIcon?userInfo:nil];
[UIApplication?sharedApplication].shortcutItems?=?@[searchShortcutItem,?playShortcutItem,?qrShortcutItem,?payShortcutItem];
觸發(fā)回調(diào)
當(dāng)用戶通過(guò)點(diǎn)擊快捷可選項(xiàng)進(jìn)入應(yīng)用程序會(huì)回調(diào)如下方法,我們可以在這里通過(guò)快捷可選項(xiàng)的type來(lái)加以區(qū)分,以便進(jìn)行不同的操作
12-?(void)application:(UIApplication?*)application?performActionForShortcutItem:(UIApplicationShortcutItem?*)shortcutItem?completionHandler:(void?(^)(BOOL))completionHandler
{
if([shortcutItem.type?isEqualToString:@"com.liupeng.search"])
{
//?do?something?...
}
elseif([shortcutItem.type?isEqualToString:@"com.liupeng.play"])
{
//?do?something?...
}
//?...
}
注意
在動(dòng)態(tài)添加快捷可選項(xiàng)前,需要用判斷是否支持3D Touch功能,以免在不支持的設(shè)備上運(yùn)行程序?qū)е麻W退
if([self?respondsToSelector:@selector(traitCollection)])
{
if([self.traitCollection?respondsToSelector:@selector(forceTouchCapability)])
{
if(self.traitCollection.forceTouchCapability?==?UIForceTouchCapabilityAvailable)
{//?支持3D?Touch}else{//?不支持3D?Touch}}}
注: 在支持3D Touch的設(shè)備上,用戶可以在程序運(yùn)行期間通過(guò)設(shè)置 -> 通用 -> 輔助功能 -> 3D Touch來(lái)關(guān)閉3D Touch功能,所以我們有必要通過(guò)重寫(xiě)-traitCollectionDidChange:方法隨時(shí)處理
Peek & Pop
概述
Peek和Pop是應(yīng)用內(nèi)的一種全新交互模式,當(dāng)用戶不斷增加力量在控件上按壓,會(huì)依次進(jìn)入四個(gè)階段
輕按控件,除觸發(fā)Peek的控件外,其他區(qū)域全部虛化
繼續(xù)用力Peek被觸發(fā),展示Pop界面快照
向上滑動(dòng)展示快捷選項(xiàng)
繼續(xù)用力跳轉(zhuǎn)進(jìn)入Pop界面
使用
以"從ViewController中的UILabel控件通過(guò)Peek & Pop進(jìn)入DetailViewController"為例,對(duì)Peek & Pop的使用進(jìn)行一下講解
需要實(shí)現(xiàn)Peek & Pop交互的控件所在的控制器遵守UIViewControllerPreviewingDelegate協(xié)議
@interface?ViewController?()?
@end
在控制器內(nèi)為需要實(shí)現(xiàn)Peek & Pop交互的控件注冊(cè)Peek & Pop功能
[self?registerForPreviewingWithDelegate:self?sourceView:label];
當(dāng)進(jìn)入Peek狀態(tài)時(shí),系統(tǒng)會(huì)回調(diào)如下方法
-?(nullable?UIViewController?*)previewingContext:(id?)previewingContext?viewControllerForLocation:(CGPoint)location
{
//?previewingContext.sourceView:?觸發(fā)Peek?&?Pop操作的視圖
//?previewingContext.sourceRect:?設(shè)置觸發(fā)操作的視圖的不被虛化的區(qū)域
DetailViewController?*detailVC?=?[[DetailViewController?alloc]?init];
//?預(yù)覽區(qū)域大小(可不設(shè)置)
detailVC.preferredContentSize?=?CGSizeMake(0,?300);
returndetailVC;
}
當(dāng)進(jìn)入Pop狀態(tài)時(shí),系統(tǒng)會(huì)回調(diào)如下方法
-?(void)previewingContext:(id?)previewingContext?commitViewController:(UIViewController?*)viewControllerToCommit
{
[self.navigationController?pushViewController:viewControllerToCommit?animated:YES];
}
在Peek時(shí)希望提供一些快捷選項(xiàng),需要在DetailViewController中重寫(xiě)previewActionItems的getter方法
-?(NSArray>?*)previewActionItems
{
UIPreviewAction?*action1?=?[UIPreviewAction?actionWithTitle:@"選項(xiàng)一"style:UIPreviewActionStyleDefault?handler:^(UIPreviewAction?*?_Nonnull?action,?UIViewController?*?_Nonnull?previewViewController)?{
}];
UIPreviewAction?*action2?=?[UIPreviewAction?actionWithTitle:@"選項(xiàng)二"style:UIPreviewActionStyleSelected?handler:^(UIPreviewAction?*?_Nonnull?action,?UIViewController?*?_Nonnull?previewViewController)?{
}];
UIPreviewAction?*action3?=?[UIPreviewAction?actionWithTitle:@"選項(xiàng)三"style:UIPreviewActionStyleDestructive?handler:^(UIPreviewAction?*?_Nonnull?action,?UIViewController?*?_Nonnull?previewViewController)?{
}];
UIPreviewActionGroup?*actionGroup?=?[UIPreviewActionGroup?actionGroupWithTitle:@"選項(xiàng)組"style:UIPreviewActionStyleDefault?actions:@[action1,?action2]];
return@[action1,?action2,?action3,?actionGroup];
}