3D Touch介紹
從iPhone 6s開(kāi)始大溜,產(chǎn)品都添加了一項(xiàng)硬件屬性差油,叫做3D touch泳炉。作為屏幕的一部分憾筏,新的傳感器將能識(shí)別用力按下屏幕的動(dòng)作并檢測(cè)到精確的壓力變化。這個(gè)設(shè)計(jì)之所以叫做3D Touch花鹅,其原理上是增加了一個(gè)壓力的感觸氧腰,通過(guò)區(qū)分輕按和重按來(lái)進(jìn)行不同的用戶交互。
**文檔給出的應(yīng)用介紹主要有兩塊:**
_1. A user can now press your Home screen icon to immediately access functionality provided by your app._
_2. Within your app, a user can now press views to see previews of additional content and gain accelerated access to features._
第一部分的應(yīng)用是我們可以通過(guò)3D手勢(shì)刨肃,在主屏幕上的應(yīng)用Icon處古拴,直接進(jìn)入應(yīng)用的響應(yīng)功能模塊。
第二部分是對(duì)app的一個(gè)優(yōu)化真友,用戶可以通過(guò)3D Touch手勢(shì)在view上來(lái)預(yù)覽一些預(yù)加載信息黄痪,這樣的設(shè)計(jì)可以使app更加簡(jiǎn)潔大方,交互性也更強(qiáng)盔然。
**iOS 9提供了如下3D Touch API:**
· Home Screen quick action API桅打,使你可以給應(yīng)用圖標(biāo)添加快速選項(xiàng),從而讓應(yīng)用預(yù)料和加速其與APP的交互。
· UIKit peek and pop API愈案,可讓你在應(yīng)用中為用戶提供快速訪問(wèn)更多內(nèi)容的功能挺尾,而無(wú)需離開(kāi)當(dāng)前上下文環(huán)境。使用peek quick actions的API提供的按壓功能來(lái)替換你應(yīng)用的觸摸長(zhǎng)按操作站绪。(通過(guò)配置視圖控制器來(lái)提供peek和pop遭铺。)
· Web view peek and pop API,讓你使用系統(tǒng)提供的HTML鏈接預(yù)覽功能恢准。
(在web視圖中魂挂,你可以對(duì)超鏈接和偵測(cè)到的數(shù)據(jù)使用全新的 allowsLinkPreview 屬性來(lái)開(kāi)啟peek和pop。Peek和Pop會(huì)通過(guò)Safari Services FrameWrok中的SFSafariViewController類自動(dòng)偵測(cè)鏈接和數(shù)據(jù))
· UITouch force properties顷歌,讓應(yīng)用增加自定義的基于壓力的用戶交互锰蓬。
(在iOS 9中,UITouch類獲得了兩個(gè)全新的屬性幫助你在應(yīng)用中自定義3D Touch: force 和maximumPossibleForce眯漩。這些屬性可以讓你偵測(cè)并響應(yīng)APP接收的對(duì)象中的觸摸壓力。在iPhone上麻顶,觸控壓力感應(yīng)有很大的動(dòng)態(tài)范圍赦抖,對(duì)于你的應(yīng)用來(lái)說(shuō)它是個(gè)浮點(diǎn)值。)
不管你使用以上哪些APIs辅肾,你的應(yīng)用必須在運(yùn)行時(shí)檢測(cè)3D Touch的可用性队萤。由于用戶在應(yīng)用運(yùn)行時(shí)可以關(guān)閉3D Touch,所以在你實(shí)現(xiàn)的代理方法中把讀取這個(gè)屬性的值作為其一部分矫钓。
在模擬器上學(xué)習(xí)和測(cè)試3D Touch
3D Touch是一個(gè)很新穎的設(shè)計(jì)要尔,可是蘋果文檔有言:
_With Xcode 7.0 you must develop on a device that supports 3D Touch. Simulator in Xcode 7.0 does not support 3D Touch._
看到這句話心是不是涼了一半舍杜,是的,Xcode7是支持3D Touch開(kāi)發(fā)的赵辕,可是模擬器并不支持這個(gè)手勢(shì)既绩,我們只能在真機(jī)上進(jìn)行學(xué)習(xí)與測(cè)試,但是在IT的世界还惠,從來(lái)都不缺拯救世界的人物饲握,github上有人為我們提供了這樣的一個(gè)插件,可以讓我們?cè)谀M器上進(jìn)行3D Touch的效果測(cè)試:
git地址:https://github.com/DeskConnect/SBShortcutMenuSimulator
在終端中一次運(yùn)行如下指令:
git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git
cd SBShortcutMenuSimulator
make
之后在SBShortcutMenuSimulator的目錄中執(zhí)行如下操作:
xcrun simctl spawn booted launchctl debug system/com.apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD/SBShortcutMenuSimulator.dylib
xcrun simctl spawn booted launchctl stop com.apple.SpringBoard
如果沒(méi)有報(bào)錯(cuò)蚕键,我們可以通過(guò)向指定端口發(fā)送消息的方法來(lái)在模擬器上模擬3D Touch的效果了
echo 'com.apple.mobilecal' | nc 127.0.0.1 8000
其中救欧,com.apple.mobilecal是應(yīng)用的Bundle ID ,如果要測(cè)試我們的應(yīng)用锣光,將其改為我們應(yīng)用的BundleID即可笆怠,下面的示例應(yīng)用是系統(tǒng)日歷。
Home Screen Quick Action使用與相關(guān)API詳解
iOS9為我們提供了兩種Qucik Action誊爹,分別是靜態(tài)和動(dòng)態(tài)的蹬刷。
· 靜態(tài)快速選項(xiàng)(Static quick actions)當(dāng)用戶安裝完應(yīng)用后立即就能使用。在應(yīng)用的 Info.plist 文件中的?UIApplicationShortcutItems?數(shù)組中定義?靜態(tài)快速選項(xiàng)替废。
· 動(dòng)態(tài)快速選項(xiàng)(Dynamic quick actions)在用戶第一次加載應(yīng)用后可用(同程)箍铭。使用?UIApplicationShortcutItem、UIMutableApplicationShortcutItem?以及?UIApplicationShortcutIcon?類和相關(guān)的API來(lái)定義?動(dòng)態(tài)快速選項(xiàng)?椎镣。使用?shortcutItems?屬性來(lái)添加動(dòng)態(tài)快速選項(xiàng)到應(yīng)用共享的?UIApplication?對(duì)象中诈火。
在iOS 9中,一個(gè)應(yīng)用最多能展示四個(gè)主屏快速選項(xiàng)状答。在這個(gè)限制下冷守,系統(tǒng)首先展示靜態(tài)快速選項(xiàng),以plist菜單中的第一個(gè)為首惊科。如果你的靜態(tài)選項(xiàng)不夠四個(gè)拍摇,并且你也定義了動(dòng)態(tài)快速選項(xiàng),那么會(huì)展示一個(gè)或多個(gè)動(dòng)態(tài)快速選項(xiàng)。
兩種快速選項(xiàng)都可以顯示最多兩行文本和一個(gè)可選的圖標(biāo)馆截。系統(tǒng)會(huì)格式化文本充活,排列包裝它,并且適當(dāng)?shù)奶砑邮÷蕴?hào)蜡娶。
靜態(tài)選項(xiàng)
靜態(tài)選項(xiàng)是我們?cè)陧?xiàng)目的配置plist文件中配置的混卵,在用戶安裝程序后就可以使用,并且排序會(huì)在動(dòng)態(tài)選項(xiàng)的前面窖张。
我們先來(lái)看靜態(tài)選項(xiàng)的配置:
1. 首先幕随,在info.plist文件中添加鍵值
2. 先添加了一個(gè)UIApplicationShortcutItems的數(shù)組,這個(gè)數(shù)組中添加的元素就是對(duì)應(yīng)的靜態(tài)標(biāo)簽宿接,在每個(gè)標(biāo)簽中我們需要添加一些設(shè)置的鍵值:
3. 必填項(xiàng):
UIApplicationShortcutItemType?這個(gè)鍵值設(shè)置一個(gè)快捷通道類型的字符串
UIApplicationShortcutItemTitle?這個(gè)鍵值設(shè)置標(biāo)簽的標(biāo)題
4. 選填項(xiàng):
UIApplicationShortcutItemSubtitle?設(shè)置標(biāo)簽的副標(biāo)題
UIApplicationShortcutItemIconType?設(shè)置標(biāo)簽Icon類型
UIApplicationShortcutItemIconFile??設(shè)置標(biāo)簽的Icon文件
UIApplicationShortcutItemUserInfo?設(shè)置信息字典
動(dòng)態(tài)選項(xiàng)
動(dòng)態(tài)選項(xiàng)是我們?cè)诔绦蛑凶富矗ㄟ^(guò)代碼添加的辕录。
與動(dòng)態(tài)選項(xiàng)相關(guān)的類,主要有三個(gè):
1. UIApplicationShortcutItem?創(chuàng)建3D Touch標(biāo)簽的類
2. UIMutableApplicationShortcutItem?創(chuàng)建可變的3D Touch標(biāo)簽的類
3. UIApplicationShortcutIcon?創(chuàng)建標(biāo)簽中圖片Icon的類
其中詳細(xì)的屬性和方法梢卸,我們?cè)诖a中進(jìn)行簡(jiǎn)要講解走诞。
``` objc
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShare];
//或者創(chuàng)建自定義圖標(biāo)的icon
UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"分享.png"];
//創(chuàng)建快捷選項(xiàng)
UIApplicationShortcutItem * item = [[UIApplicationShortcutItem alloc]initWithType:@"xxx" localizedTitle:@"分享" localizedSubtitle:@"分享副標(biāo)題" icon:icon userInfo:nil];
//添加到快捷選項(xiàng)數(shù)組
[UIApplication sharedApplication].shortcutItems = @[item];
```
響應(yīng)Quick Actions的行為
當(dāng)我們點(diǎn)擊標(biāo)簽進(jìn)入應(yīng)用程序時(shí),可以進(jìn)行一些操作低剔,我們可以看到速梗,在applocation中增加了這樣一個(gè)方法:
` - (void)application:(UIApplication?*)application performActionForShortcutItem:(UIApplicationShortcutItem?*)shortcutItem completionHandler:(void(^)(BOOL?succeeded))completionHandler?NS_AVAILABLE_IOS(9_0);`
當(dāng)我們通過(guò)標(biāo)簽進(jìn)入app時(shí),就會(huì)在appdelegate中調(diào)用這樣一個(gè)回調(diào)襟齿,我們可以獲取shortcutItem的信息進(jìn)行相關(guān)邏輯操作姻锁。
這里有一點(diǎn)需要注意:我們?cè)赼pp的入口函數(shù)也需要進(jìn)行一下判斷,在launchOptions中有UIApplicationLaunchOptionsShortcutItemKey這樣一個(gè)鍵猜欺,通過(guò)它位隶,我們可以區(qū)別是否是從標(biāo)簽進(jìn)入的app,如果是則處理結(jié)束邏輯后开皿,返回NO涧黄,防止處理邏輯被反復(fù)回調(diào)。
` - (BOOL)application:(UIApplication?*)application didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions;`
Quick Actions小注意點(diǎn)
1. 在iOS 9中赋荆,一個(gè)應(yīng)用最多能展示四個(gè)主屏快速選項(xiàng)笋妥。在這個(gè)限制下,系統(tǒng)首先展示靜態(tài)快速選項(xiàng)窄潭,以plist菜單中的第一個(gè)為首春宣。如果你的靜態(tài)選項(xiàng)不夠四個(gè),并且你也定義了動(dòng)態(tài)快速選項(xiàng),那么會(huì)展示一個(gè)或多個(gè)動(dòng)態(tài)快速選項(xiàng)嫉你。兩種快速選項(xiàng)都可以顯示最多兩行文本和一個(gè)可選的圖標(biāo)月帝。系統(tǒng)會(huì)格式化文本,排列包裝它幽污,并且適當(dāng)?shù)奶砑邮÷蕴?hào)嚷辅。
2. 圖標(biāo)和文字的位置會(huì)隨著App在屏幕的位置變化而變化
3. 要考慮到關(guān)閉3D Touch和6s以下機(jī)型的情況,針對(duì)Quick Action所跳轉(zhuǎn)的入口要提供2套或以上的方案距误。
4. 動(dòng)態(tài)Quick Actions需要運(yùn)行過(guò)一次才能出現(xiàn)
5. 對(duì)自定義的圖片有一定的要求
6. 輕點(diǎn)簸搞,別按壞了
結(jié)論
3D touch是2015年版本的“右鍵點(diǎn)擊”。它添加了另一種深度准潭,帶來(lái)了不同的交互意向攘乒。對(duì)于peek and pop來(lái)說(shuō),你可能還沒(méi)有決定跳轉(zhuǎn)到某個(gè)內(nèi)容上去惋鹅,但你肯定會(huì)對(duì)它感興趣。只要有這種想法殉簸,預(yù)覽內(nèi)容的功能可以讓你對(duì)眼前內(nèi)容快速一瞥闰集,而不跳轉(zhuǎn)頁(yè)面沽讹,這樣可以快速返回到之前瀏覽的內(nèi)容中。
這大約是iPhone 6s出之后沒(méi)多久寫的武鲁,那時(shí)候剛接觸iOS開(kāi)發(fā)爽雄,理解程度還是比較淺顯的。