iOS 9之后提供以下幾個(gè)3D Touch API:
1.Home screen quick action 主屏幕快速訪問(wèn) 最多四個(gè)
2.UIKit peek and pop 應(yīng)用內(nèi)peek哀托、pop迄靠,提供了應(yīng)用內(nèi)的一個(gè)對(duì)觸住的壓力感應(yīng)的替代方法
3.Web view peek and pop 讓你可以預(yù)覽HTML鏈接指定的網(wǎng)頁(yè)
4.UITouch force properties讓你可以自定義app基于壓力的交互
不論你使用哪一個(gè)API,你都要在runtime的時(shí)候檢查3D Touch是否可用蛛株。
一蜘犁、檢查3D Touch是否可用
如果當(dāng)前對(duì)象遵循UITraitEnvironment協(xié)議(UIScreen翰苫、UIWindow、UIViewController这橙、UIPresentationController奏窑、UIView),檢查self.traitCollection.forceTouchCapability屈扎,它有三個(gè)值:
1.UIForceTouchCapabilityUnknown(3D Touch狀態(tài)未知埃唯,例如,你創(chuàng)建了一個(gè)view但是你還沒(méi)有將它加入到你的視圖層級(jí)中助隧,就會(huì)處于這個(gè)狀態(tài))
2.UIForceTouchCapabilityUnavailable(3D Touch不可用)
3.UIForceTouchCapabilityAvailable(3D Touch可用)
如果用戶(hù)在app運(yùn)行的時(shí)候關(guān)閉了3D Touch筑凫,可以在UITraitEnvironment協(xié)議中的traitCollectionDidChange:代理方法監(jiān)測(cè)到變化,具體寫(xiě)法如下:
- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection
{
[super traitCollectionDidChange: previousTraitCollection];
if (self.traitCollection.forceTouchCapability!=previousTraitCollection.forceTouchCapability)
{
// your custom implementation here
}
}
為了保障所有用戶(hù)都能體驗(yàn)到app的特性并村,根據(jù)3D Touch的支持情況配置不同的代碼巍实。可用的時(shí)候使用3D Touch哩牍,不可用的時(shí)候使用UILongPressGestureRecognizer類(lèi)棚潦。
二、Home Screen Quick Actions
iOS 9支持主屏幕靜態(tài)和動(dòng)態(tài)的quick actions:
(1)靜態(tài)quick actions:你的app安裝完成后即可使用膝昆。在你的info.plist中定義UIApplicationShortCutItems數(shù)組丸边。
每個(gè)item字典的鍵有以下幾種:
1.UIApplicationShortcutItemType(必要)根據(jù)這一個(gè)值來(lái)判斷你選的是哪一個(gè)quick action
2.UIApplicationShortcutItemTitle(必要)quick action的名字,如果該字符串過(guò)長(zhǎng)并且沒(méi)有設(shè)置subtitle荚孵,會(huì)以?xún)尚姓故久媒眩€是不夠的話末尾會(huì)變?yōu)槭÷蕴?hào)
3.UIApplicationShortcutItemSubtitle 副標(biāo)題,會(huì)在主標(biāo)題下面顯示收叶,主標(biāo)題不論多長(zhǎng)都會(huì)以一行顯示骄呼,副標(biāo)題過(guò)長(zhǎng)會(huì)以一行顯示,末位是省略號(hào)判没。
4.UIApplicationShortcutItemIconType 提供一些系統(tǒng)的圖標(biāo)
5.UIApplicationShortcutItemIconFile 從app bundle或者asset catalog中選擇一張圖片蜓萄,要求方形,35X35點(diǎn)坐標(biāo)澄峰,retina 屏幕是70 x 70像素嫉沽,plus是104 x 104像素,設(shè)置了這個(gè)值俏竞,系統(tǒng)會(huì)忽略UIApplicationShortcutItemIconType
6.UIApplicationShortcutItemUserInfo 一個(gè)可選的绸硕,app定義的字典堂竟,這個(gè)字典的一個(gè)作用是提供app的版本,如果用戶(hù)安裝了你的app臣咖,按壓icon會(huì)先顯示靜態(tài)quick actions跃捣,啟動(dòng)之后如果還有空位才會(huì)顯示動(dòng)態(tài)quick actions,如果用戶(hù)更新了app但還沒(méi)有啟動(dòng)夺蛇,動(dòng)態(tài)quick action還是顯示的上一個(gè)版本的疚漆,在這個(gè)字典中添加版本信息可以解決這個(gè)問(wèn)題。(具體如何實(shí)現(xiàn)刁赦?猜測(cè)是自己加入一個(gè)版本號(hào)字段娶聘,在代碼中判斷版本號(hào),符合的話再加入)
(2)動(dòng)態(tài)quick actions:首次啟動(dòng)后可用甚脉。使用UIapplicationShortcutItem丸升,UIMutableApplicationShortcutItem,UIApplicaitionShortcutIcon定義主屏幕的動(dòng)態(tài)quick action牺氨。使用UIApplication的shortcutItems屬性添加動(dòng)態(tài)quick actions狡耻。使用系統(tǒng)定義圖片調(diào)用UIApplicationShortcutIcon的iconWithType:方法,自定義圖片使用iconWithTemplateImageName:猴凹。
系統(tǒng)首先按照UIApplicationShortCutItems定義的靜態(tài)quick actions的順序展示夷狰,如果還有空余位置,再展示動(dòng)態(tài)quick actions郊霎。
<small><small><small>當(dāng)用戶(hù)選擇了一個(gè)主界面quick action沼头,系統(tǒng)會(huì)調(diào)用application:performActionForShortcutItem:completionHandler:方法,但是注意书劝,系統(tǒng)會(huì)在調(diào)用application:performActionForShortcutItem:completionHandler之前調(diào)用application:willFinishLaunchingWithOptions:和application:didFinishLaunchingWithOptions:进倍,所以如果quick action使你的app顯示的界面不一樣的話(本來(lái)打開(kāi)你的app會(huì)進(jìn)入View A,但是使用quick action會(huì)進(jìn)入View B)购对,這時(shí)候就要在兩個(gè)launch方法中處理quick action猾昆,UIApplicationShortcutItem存在于launchOptions的UIApplicationLaunchOptionsShortcutItemKey中,處理完成后骡苞,返回NO毡庆,系統(tǒng)就不會(huì)再調(diào)用application:performActionForShortcutItem:completionHandler:。</small></small></small>
三烙如、UIKit Peek、Pop
1.Peek 當(dāng)用戶(hù)按壓一個(gè)特定視圖時(shí)彈出的一個(gè)的視圖預(yù)覽功能毅否,除此之外亚铁,還可以添加一些quick actions,這些quick actions可以在peek彈出式向上滑動(dòng)調(diào)出螟加。
通過(guò)在要顯示的viewController中設(shè)置previewActionItems數(shù)組添加徘溢,如下:
-(NSArray> *)previewActionItems
{
UIPreviewAction *p1 = [UIPreviewAction actionWithTitle:@"選項(xiàng)1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
[FireflyAlertView showWithTitle:@"提示" message:@"選項(xiàng)1" buttonTitle:@"確定"];
}];
UIPreviewAction *p2 = [UIPreviewAction actionWithTitle:@"選項(xiàng)2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
[FireflyAlertView showWithTitle:@"提示" message:@"選項(xiàng)2" buttonTitle:@"確定"];
}];
UIPreviewAction *p3 = [UIPreviewAction actionWithTitle:@"選項(xiàng)3" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
[FireflyAlertView showWithTitle:@"提示" message:@"選項(xiàng)3" buttonTitle:@"確定"];
}];
return @[p1,p2,p3];
}
2.Pop 當(dāng)用戶(hù)在peek后再次重壓吞琐,則會(huì)繼續(xù)預(yù)覽這個(gè)視圖并導(dǎo)向這個(gè)視圖。
視圖控制器如果想使用3D Touch然爆,必須遵循UIViewControllerPreviewingDelegate協(xié)議站粟,并使用以下方法注冊(cè)
- (id)registerForPreviewingWithDelegate:(id)delegatesourceView:(UIView *)sourceView;
第一個(gè)參數(shù)填寫(xiě)當(dāng)前視圖控制器,self曾雕,第二個(gè)參數(shù)填寫(xiě)當(dāng)前視圖控制器的view奴烙。
UIViewControllerPreviewingDelegate協(xié)議中有兩個(gè)方法,都是必須實(shí)現(xiàn)
1.- (UIViewController *)previewingContext:(id)previewingContextviewControllerForLocation:(CGPoint)location;
第一個(gè)參數(shù)由系統(tǒng)自己創(chuàng)建剖张,注意這個(gè)協(xié)議不能在自定義的類(lèi)中遵循切诀,通過(guò)這個(gè)類(lèi)可以獲取以下四個(gè)屬性
1.sourceRect 最初重壓時(shí)不變模糊的區(qū)域
2.previewingGestureRecognizerForFailureRelationship 通過(guò)一個(gè)遵循UIGestureRecognizerDelegate協(xié)議的代理對(duì)象來(lái)使用這個(gè)手勢(shì),這個(gè)協(xié)議的方法可以讓你在其他手勢(shì)失敗后再執(zhí)行peek搔弄,或者同時(shí)開(kāi)始識(shí)別等幅虑。(沒(méi)有找到具體如何使用,知道的朋友歡迎補(bǔ)充)
3.delegate
4.sourceView
第二個(gè)參數(shù)用來(lái)標(biāo)明是哪個(gè)坐標(biāo)位置的控件要使用peek&pop顾犹。
2.-(void)previewingContext:(id)previewingContextcommitViewController:(UIViewController *)viewControllerToCommit
在這個(gè)方法中實(shí)現(xiàn)pop的時(shí)候是如何顯示view controller的倒庵,showViewController:sender:(普通的方式),presentViewController:animated:completion:(動(dòng)畫(huà)+完成回調(diào))
四炫刷、Web View Peek and Pop
在UIWebView和WKWebView中有一個(gè)屬性allowsLinkPreview擎宝,設(shè)置為YES則可以在任意鏈接上使用peek和pop。
在SFSafariViewController中自動(dòng)支持柬唯。(此處咱不介紹SFSafariViewController)
五认臊、Force Properties in UITouch Objects
UITouch有兩個(gè)新的屬性—force和maximumPossibleForce,可以讓你在所有的UIEvent中檢測(cè)和響應(yīng)壓力锄奢。(估計(jì)跟Apple pencil相關(guān)的app會(huì)用到)