【iOS】3DTouch初步學(xué)習(xí)

With iOS 9, new iPhone models add a third dimension to the user interface.

  • A user can now press your Home screen icon to immediately access functionality provided by your app.
  • Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.

模擬器實(shí)現(xiàn)3D Touch功能

1梦皮、插件安裝

插件下載地址:
https://github.com/DeskConnect/SBShortcutMenuSimulator

  • 下載插件到本地(在terminal操作):
git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git
插件下載完成
  • 安裝插件:
cd SBShortcutMenuSimulator
 make  
插件安裝完成

2握础、插件使用

  • 啟動(dòng)插件
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

注意:如果運(yùn)行過程中出現(xiàn):No devices are booted. 是因?yàn)槟愕哪M器沒有啟動(dòng)垦垂,這時(shí)候啟動(dòng)你的模擬器即可饥悴。

  • 預(yù)覽效果
echo 'com.apple.mobilecal' | nc 127.0.0.1 8000
3D Touch效果

注意:
1竿秆、'com.apple.mobilecal'是應(yīng)用的Bundle ID绍绘,如果你要測(cè)試自己的應(yīng)用的3D Touch效果没卸,將該字段換成自己應(yīng)用的Bundle ID戳晌。上面的示例應(yīng)用是系統(tǒng)日歷泞辐。
2笔横、如果出現(xiàn)SpringBorad意外退出,可能是你的模擬器高于iOS9.1咐吼,可以嘗試下載iOS9.1或iOS9.0的模擬器然后重新以上“插件使用”操作吹缔。

檢測(cè)是否支持3D Touch

  • 在UIViewController生命周期的viewWillAppear中做判斷:
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        //3D Touch可用
    }
    else{
        //3D Touch不可用
    }
}

UIForceTouchCapability是個(gè)枚舉

@property (nonatomic, readonly) UIForceTouchCapability forceTouchCapability NS_AVAILABLE_IOS(9_0);
typedef NS_ENUM(NSInteger, UIForceTouchCapability) {
    UIForceTouchCapabilityUnknown = 0,        //3D Touch檢測(cè)失敗
    UIForceTouchCapabilityUnavailable = 1,    //3D Touch不可用
    UIForceTouchCapabilityAvailable = 2       //3D Touch可用
};
  • 也可以通過以下方法實(shí)現(xiàn)判斷,當(dāng)界面環(huán)境發(fā)生改變時(shí)會(huì)調(diào)用該方法:
-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    if (previousTraitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        NSLog(@"3D Touch可用");
    }
    else{
        NSLog(@"3D Touch不可用");
    }
}

3D Touch開發(fā)

iOS9提供了四類API(Home Screen Quick Action锯茄、UIKit Peek & Pop 厢塘、WebView Peek & Pop 和UITouch Force Properties)用于操作3D Touch(Pressure Sensitivity 茶没、 Peek and Pop 和 Quick Actions)。

1晚碾、Home Screen Quick Actions

用力按壓主屏幕的應(yīng)用Icon抓半,可以通過3D Touch呼出一個(gè)快捷菜單,點(diǎn)擊快速進(jìn)入相關(guān)功能模塊格嘁。


Map Home Screen Quick Actions

其中系統(tǒng)自帶的圖片有以下類型:

typedef NS_ENUM(NSInteger, UIApplicationShortcutIconType) {
    UIApplicationShortcutIconTypeCompose,
    UIApplicationShortcutIconTypePlay,
    UIApplicationShortcutIconTypePause,
    UIApplicationShortcutIconTypeAdd,
    UIApplicationShortcutIconTypeLocation,
    UIApplicationShortcutIconTypeSearch,
    UIApplicationShortcutIconTypeShare,
    UIApplicationShortcutIconTypeProhibit       NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeContact        NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeHome           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMarkLocation   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeFavorite       NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeLove           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCloud          NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeInvitation     NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeConfirmation   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMail           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeMessage        NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeDate           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTime           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCapturePhoto   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeCaptureVideo   NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTask           NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeTaskCompleted  NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeAlarm          NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeBookmark       NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeShuffle        NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeAudio          NS_ENUM_AVAILABLE_IOS(9_1),
    UIApplicationShortcutIconTypeUpdate         NS_ENUM_AVAILABLE_IOS(9_1)
} NS_ENUM_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;
創(chuàng)建Quick Action有兩種方式:靜態(tài)和動(dòng)態(tài)
  • 靜態(tài)創(chuàng)建
    靜態(tài)創(chuàng)建只需在Info.plist上添加相關(guān)功能設(shè)置:



    也可以右擊Info.plist -> Open As -> Source Code,輸入:

<key>UIApplicationShortcutItems</key>
    <array>
        <dict>
            <key>UIApplicationShortcutItemIconType</key>
            <string>UIApplicationShortcutIconTypeSearch</string>
            <key>UIApplicationShortcutItemSubtitle</key>
            <string>搜索好友</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>搜索</string>
            <key>UIApplicationShortcutItemType</key>
            <string>1</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict/>
        </dict>
        <dict>
            <key>UIApplicationShortcutItemIconType</key>
            <string>UIApplicationShortcutIconTypeAdd</string>
            <key>UIApplicationShortcutItemSubtitle</key>
            <string>添加好友</string>
            <key>UIApplicationShortcutItemTitle</key>
            <string>添加</string>
            <key>UIApplicationShortcutItemType</key>
            <string>2</string>
            <key>UIApplicationShortcutItemUserInfo</key>
            <dict/>
        </dict>
    </array>
  • 動(dòng)態(tài)創(chuàng)建
    代碼創(chuàng)建3D Touch的item:
    UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"3" localizedTitle:@"掃一掃"];
    UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"3DSearch"];
    UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"4" localizedTitle:@"設(shè)置" localizedSubtitle:nil icon:icon userInfo:nil];
    [UIApplication sharedApplication].shortcutItems = @[item1,item2];

創(chuàng)建方法:

-(instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo NS_DESIGNATED_INITIALIZER;
-(instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle;

設(shè)置圖片方法:

+(instancetype)iconWithType:(UIApplicationShortcutIconType)type;
+(instancetype)iconWithTemplateImageName:(NSString *)templateImageName;笛求。

動(dòng)態(tài)+靜態(tài) 創(chuàng)建

注意:
(1)系統(tǒng)限制每個(gè)App最多能夠顯示4個(gè)Action Item,其中包括靜態(tài)方式和動(dòng)態(tài)方式進(jìn)行創(chuàng)建的糕簿,超過個(gè)數(shù)不顯示探入。
(2)如果靜態(tài)和動(dòng)態(tài)方式同時(shí)使用的時(shí)候,給UIApplication的shortcutItems賦值的時(shí)候不會(huì)覆蓋靜態(tài)創(chuàng)建的items懂诗。
(3)動(dòng)態(tài)創(chuàng)建的方式只有在程序第一次啟動(dòng)之后才會(huì)顯示蜂嗽。
(4)如果你要顯示系統(tǒng)圖片時(shí),info.plist中不要添加
UIApplicationShortcutItemIconFile屬性殃恒,因?yàn)楫?dāng)
UIApplicationShortcutItemIconFile和UIApplicationShortcutItemIconType同時(shí)存在時(shí)植旧,會(huì)優(yōu)先使用UIApplicationShortcutItemIconFile設(shè)置的圖片。
(5)Quick Actions顯示的icon在左邊或者右邊芋类,這個(gè)是跟你的app 放在你手機(jī)的位置有關(guān)系隆嗅,這個(gè)iOS會(huì)自動(dòng)處理掉。

點(diǎn)擊Home Screen Quick Actions的相應(yīng)回調(diào)
  • iOS9新增以下方法實(shí)現(xiàn)點(diǎn)擊 Home Screen Quick Action的相應(yīng)回調(diào)侯繁,我們可以通過shortcutItem的type或者localizedTitle屬性(因?yàn)檫@兩個(gè)屬性時(shí)必須設(shè)置的)判斷點(diǎn)擊了哪個(gè)item:
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler {
    NSInteger index = shortcutItem.type.integerValue;
    switch (index) {
        case 1:
            NSLog(@"搜索");
            break;
        case 2:
            NSLog(@"添加");
            break;
        case 3:
            NSLog(@"掃一掃");
            break;
        case 4:
            NSLog(@"設(shè)置");
            break;
        default:
            break;
    }
}
  • 還可以通過入口方法里面進(jìn)行判斷(該方法只會(huì)在程序從未啟動(dòng)到啟動(dòng)過程中才會(huì)被調(diào)用):
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if (launchOptions) {
        UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
        NSInteger index = item.type.integerValue;
        switch (index) {
            case 1:
                NSLog(@"搜索");
                break;
            case 2:
                NSLog(@"添加");
                break;
            case 3:
                NSLog(@"掃一掃");
                break;
            case 4:
                NSLog(@"設(shè)置");
                break;
            default:
                break;
        }
    }
    
    return YES;
}

2胖喳、Peek & Pop

A peek :
Appears while a user presses on an item that supports peek and disappears when the user’s finger lifts
Opens a detailed view of the item—called a pop—when users press a little deeper on the peek view
Can provide quick actions related to the item when users swipe up within the peek view

A peek preview in Safari
Quick actions in a Safari peek
UIKit Peek & Pop
  • 給ViewController上的view注冊(cè)3D Touch(先判斷設(shè)備是否支持3D Touch)
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
    {
        [self registerForPreviewingWithDelegate:(id)self sourceView:self.view];
        
    }
  • 新建一個(gè)新的UIViewController名為:ContentViewController,以便之后peek時(shí)顯示該ContentViewController贮竟,在ContentViewController中重寫以下方法實(shí)現(xiàn)Quick actions:
-(NSArray<id<UIPreviewActionItem>> *)previewActionItems{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action1");
    }];
    
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"action2");
    }];
    NSArray *actions = @[action1,action2];
    UIPreviewActionGroup *group1 = [UIPreviewActionGroup actionGroupWithTitle:@"Action Group" style:UIPreviewActionStyleDefault actions:actions];
    NSArray *array = @[group1];
    return array;
}

注意:
1丽焊、該方法不是必須要重寫,根據(jù)自己的需求而定咕别。
2技健、這里是把兩個(gè)action放在了一個(gè)組里顯示,也可以直接顯示兩個(gè)action惰拱。

  • ViewController遵循UIViewControllerPreviewingDelegate協(xié)議:
//UIViewControllerPreviewingDelegate
//稍微重按調(diào)用該方法:(peek)
-(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location{
    //防止重復(fù)加入
    if ([self.presentedViewController isKindOfClass:[ContentViewController class]]){
        return nil;
    }
    else {
        ContentViewController *contentVC = [[ContentViewController alloc] init];
        return contentVC;
    }
}
//加重按壓調(diào)用該方法:(pop)
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
    //跳轉(zhuǎn)到某個(gè)ViewController
    ContentViewController *contentVC = [[ContentViewController alloc] init];
[self.navigationController pushViewController : contentVC animated:YES];
}
  • 效果圖:


    peek

    Quick actions

    點(diǎn)擊Action Group

    pop
WebKit Peek & Pop

WebKit Peek & Pop 的操作和UIKit差不多雌贱,只是顯示的是Web網(wǎng)頁。
顯示網(wǎng)頁有三種方法:
1偿短、openUrl離開應(yīng)用進(jìn)入safari打開網(wǎng)頁
2欣孤、UIWebView或者WKWebView自定義視圖在應(yīng)用內(nèi)打開網(wǎng)頁
3、在iOS9.0后新增SFSafariViewController類昔逗,用于顯示web網(wǎng)頁降传。并通過SFSafariViewControllerDelegate的以下方法實(shí)現(xiàn)回到應(yīng)用操作。

-(void)safariViewControllerDidFinish:(SFSafariViewController *)controller{
    [controller dismissViewControllerAnimated:YES completion:nil];
}

注意:
1勾怒、方法1不能實(shí)現(xiàn)3D Touch婆排。
2声旺、使用方法2實(shí)現(xiàn)3D Touch時(shí),要設(shè)置屬性 allowsLinkPreview 為Yes(默認(rèn)是NO)段只。

參考文檔

http://pingguohe.net/2015/10/12/3D-Touch-2.html
http://www.devzeng.com/blog/ios9-3d-touch.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腮猖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翼悴,更是在濱河造成了極大的恐慌缚够,老刑警劉巖幔妨,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹦赎,死亡現(xiàn)場離奇詭異,居然都是意外死亡误堡,警方通過查閱死者的電腦和手機(jī)古话,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锁施,“玉大人陪踩,你說我怎么就攤上這事∠さ郑” “怎么了肩狂?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姥饰。 經(jīng)常有香客問我傻谁,道長,這世上最難降的妖魔是什么列粪? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任审磁,我火速辦了婚禮,結(jié)果婚禮上岂座,老公的妹妹穿的比我還像新娘态蒂。我一直安慰自己,他們只是感情好费什,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布钾恢。 她就那樣靜靜地躺著,像睡著了一般鸳址。 火紅的嫁衣襯著肌膚如雪瘩蚪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天氯质,我揣著相機(jī)與錄音募舟,去河邊找鬼。 笑死闻察,一個(gè)胖子當(dāng)著我的面吹牛拱礁,可吹牛的內(nèi)容都是我干的琢锋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼呢灶,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼吴超!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸯乃,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鲸阻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缨睡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸟悴,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年奖年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了细诸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陋守,死狀恐怖震贵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情水评,我是刑警寧澤猩系,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站中燥,受9級(jí)特大地震影響寇甸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜褪那,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一幽纷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧博敬,春花似錦友浸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祭往,卻和暖如春伦意,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硼补。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工驮肉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人已骇。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓离钝,卻偏偏與公主長得像票编,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卵渴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 前言 關(guān)于3D touch蘋果官方文檔是這么開始介紹的: 大意如下:iOS9開始慧域,所有新的手機(jī)都增加了一個(gè)三維的用...
    VV木公子閱讀 2,236評(píng)論 3 39
  • 前言 關(guān)于這篇文章 由于iPhone 6S發(fā)布不到一年的時(shí)間,很多新特性浪读、新技術(shù)還未普遍昔榴,不管是3D Touch的...
    Tangentw閱讀 4,502評(píng)論 8 18
  • 3D Touch簡介 2015年,蘋果發(fā)布了iOS9以及iphone6s/iphone6s Plus碘橘,其中最具有創(chuàng)...
    愛恨的潮汐閱讀 386評(píng)論 0 2
  • 專著:http://www.reibang.com/p/3443a3b27b2d 1.簡單的介紹一下3D Touc...
    violafa閱讀 1,017評(píng)論 1 0
  • 3D Touch簡介 2015年互订,蘋果發(fā)布了iOS9以及iphone6s/iphone6s Plus,其中最具有創(chuàng)...
    簡簡蝸牛閱讀 614評(píng)論 0 0