iOS 3DTouch 開(kāi)發(fā)

概述

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];

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容