3DTouch學(xué)習(xí)與總結(jié)

大年初一,在家無事
甚是無聊,撰文一篇


自蘋果在2015年發(fā)布3DTouch功能以來
iPhone 6s之后的機(jī)型全都匹配了3DTouch功能
說來慚愧
還沒自己寫過3DTouch相關(guān)的代碼
于是研究了一波

我的研究大概包括以下三個方面:
  • 在應(yīng)用icon上呼出3DTouch菜單
  • 在程序內(nèi)部的Peek和Pop
  • Widget開發(fā)

一: 在應(yīng)用icon上呼出3DTouch菜單

微信的效果圖

搞出這種效果有兩種方式:

  • 在plist里面添加字段
  • 在didFinishLaunchingWithOptions中用代碼添加

第1種方式 : 在plist里面添加字段:

屏幕快照 2018-02-16 下午9.24.56.png

UIApplicationShortcutItemTitle : 必有用作按鈕的標(biāo)題
UIApplicationShortcutItemSubtitle : 非必有,用作按鈕子標(biāo)題
UIApplicationShortcutItemType : 必有,根據(jù)這個字段來判斷點了哪個按鈕
UIApplicationShortcutItemIconFile : 非必有, 圖片的名字(自定義)
UIApplicationShortcutItemIconType :非必有, 圖片的類型(系統(tǒng)提供)
UIApplicationShortcutItemUserInfo : 非必有,設(shè)置用戶信息,是一個字典類型,可以用來傳值

說明 :

少了任意必有項,這個按鈕都不顯示
UIApplicationShortcutItemIconFile和UIApplicationShortcutItemIconType必有其一
最多創(chuàng)建四個按鈕

UIApplicationShortcutItemIconType的類型 :
// Override point for customization after application launch.
    /**
     *
     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;
     */

第2種方式 : 在didFinishLaunchingWithOptions中用代碼添加

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        //自定義3DTouch按鈕
        UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc]initWithType:@"4" localizedTitle:@"自定義標(biāo)題1" localizedSubtitle:@"子標(biāo)題4" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMail] userInfo:nil];
        UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc]initWithType:@"5" localizedTitle:@"自定義標(biāo)題2" localizedSubtitle:@"子標(biāo)題5" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"icon"] userInfo:nil];
        [UIApplication sharedApplication].shortcutItems = @[item1,item2];
        return YES;
}

item1是用系統(tǒng)提供的圖片
item2是用自定義圖片
很簡單

然后就是按鈕的監(jiān)聽:

//點擊按鈕進(jìn)入
- (void)application:(UIApplication *)application performActionForShortcutItem:(nonnull UIApplicationShortcutItem *)shortcutItem completionHandler:(nonnull void (^)(BOOL))completionHandler {
        if ([shortcutItem.type isEqualToString:@"1"]) {
            //相應(yīng)的處理
        }else if ([shortcutItem.type isEqualToString:@"2"]) {
            //相應(yīng)的處理
        }else {
            //相應(yīng)的處理
        }
}

二: 在程序內(nèi)部的Peek和Pop

大多數(shù)用在tableView上
先看效果圖:


tableView

用力按一下之后

向上劃一下

使勁按下去

要實現(xiàn)這個效果
得先在TableViewController里面給cell注冊一下

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier" forIndexPath:indexPath];
        cell.textLabel.text = self.dataArray[indexPath.row];
        //想要peek 需要注冊一下
        [self registerForPreviewingWithDelegate:self sourceView:cell];
        return cell;
}

然后遵循UIViewControllerPreviewingDelegate協(xié)議
實現(xiàn)這個方法
返回peek的的控制器

- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
        //location 是以cell為坐標(biāo)系的坐標(biāo)
        //轉(zhuǎn)換成以tableview為坐標(biāo)系的坐標(biāo)
        CGPoint point = [self.tableView convertPoint:location fromView:[previewingContext sourceView]];
        //這樣就可以取到我點了第幾行cell
        NSIndexPath *index = [self.tableView indexPathForRowAtPoint:point];
        return [[WebViewController alloc]init];
}

當(dāng)再用力按的時候,就把這個控制器pop進(jìn)來

//pop
//使勁一按 就push
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
        //viewControllerToCommit 上個方法返回的vc
        [self.navigationController pushViewController:viewControllerToCommit animated:NO];
}

如果想添加操作按鈕
需要在將要彈出的控制器添加這個方法 :

- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
        UIPreviewAction *item1 = [UIPreviewAction actionWithTitle:@"贊" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
                NSLog(@"點贊");
        }];
        UIPreviewAction *item2 = [UIPreviewAction actionWithTitle:@"踩" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
                NSLog(@"點踩");
        }];
        UIPreviewAction *item3 = [UIPreviewAction actionWithTitle:@"X" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
                NSLog(@"點X");
        }];
//        UIPreviewActionGroup *group = [UIPreviewActionGroup actionGroupWithTitle:@"組" style:UIPreviewActionStyleDefault actions:@[]];
        return @[item1,item2,item3];    
}

還有值得說的一點就是UITouch對象添加了force
是一個記錄按壓力量的變量
取值是0~6.666
我們可以在touchesMoved里面打印一下

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        UITouch *t =touches.anyObject;
        NSLog(@"按壓力量 - %f",t.force);
}

三: Widget開發(fā)

先上效果圖 :


我在Widget里面隨便添加了一個按鈕

創(chuàng)建Widget


image

這個時候,你會看到項目目錄里面多了
image

如果習(xí)慣純代碼開發(fā),可以刪掉storyboard


image

在控制器里隨便添加點東西
運行就能看到效果了
如果想讓W(xué)idget可以展開
就像這樣:
image
image

可以添加以下代碼:


//改為擴(kuò)充模式(添加拓展按鈕)
- (void)viewWillAppear:(BOOL)animated {
        self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
}

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
        if (activeDisplayMode == NCWidgetDisplayModeCompact) {
                self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 105);
        }else {
                self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 500);
        }
}

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler {
    // Perform any setup necessary in order to update the view.
    
    // If an error is encountered, use NCUpdateResultFailed
    // If there's no update required, use NCUpdateResultNoData
    // If there's an update, use NCUpdateResultNewData

    completionHandler(NCUpdateResultNewData);
}

事件監(jiān)聽:

因為Widget是一個獨立的小應(yīng)用
所以需要添加:


image

主項目里面的AppDelegate:

//在widget進(jìn)入
- (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
        if ([url.description hasPrefix:@"widgetMain://"]) {
                NSLog(@"%@", url.description);
                //一些操作
        }
        return YES;
}
證書:

首先因為Widget是一個獨立的小應(yīng)用
因此證書也需要另外的一套
Bundle ID:widget的Bundle Id是在主項目的Bundle ID的基礎(chǔ)上加的,例
主項目:

com.dx.widgetTestMain

widget:

com.dx.widgetTestMain.widgetTest

widget的App ID創(chuàng)建的時候要配置 App Groups項,例:


配置之前

配置之后

在創(chuàng)建APP ID的時候
勾選App Groups即可


image

創(chuàng)建APP ID之后,需要去創(chuàng)建一個App Groups
image

在項目中還需要配置之前給Widget添加的App Groups
image

如果widget里面要使用主項目里面的類,需要做下面操作:


image

感謝閱讀
你的支持是我寫作的唯一動力

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,762評論 2 372

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

  • 自蘋果在2015年發(fā)布3dtouch功能以來, iPhone 6s之后的機(jī)型全都匹配了 3dtouch功能。此功能...
    _鏟屎官_閱讀 7,345評論 1 18
  • 3DTouch目前在手機(jī)上有兩種體現(xiàn)方式,一種是用力按下app的圖片icon,會彈出選項菜單,就像電腦上的右鍵。一...
    莦婼姑娘閱讀 456評論 2 3
  • 公司之前在新的版本中添加了3DTouch,今天就總結(jié)出來方面大家參考和查閱 一、3D Touch 的Quick A...
    zhanming閱讀 1,177評論 2 30
  • 一.3DTouch的主要作用: 0.demo地址在最下面 1.Home Screen Quick Actions ...
    哆啦_閱讀 2,285評論 6 5
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,577評論 28 53