3D-Touch的使用

同步至CoderHannのGitHub博客

2015年9月10日,蘋果在新品發(fā)布會上宣布了3D-Touch功能着降。這是一種立體觸控技術,屏幕可感應不同的感壓力度觸控,很明顯這種技術給APP的交互又增添了樣式棠绘。Hann作為一名iOS開發(fā)者自然對這種新技術感到好奇,經過一番的資料搜集與學習再扭,成功的將這種功能添加到正在開發(fā)的APP中氧苍。將3DTouch有關的知識點記錄下來以供自己查閱,也給有需求的開發(fā)人員提供一些參考泛范。

3DTouch的使用

開發(fā)者應該關注哪幾部分让虐?

  • 外部啟動標簽(Home Screen Quick Actions)
  • peek、pop以及action的使用

外部啟動標簽(Home Screen Quick Actions)

外部啟動標簽給快速使用APP的某些特定功能提供了便利罢荡,按壓具有3DTouch功能的APP圖標可以激活標簽赡突。外部標簽的添加上分為兩種:靜態(tài)添加標簽、動態(tài)添加標簽区赵。靜態(tài)標簽是直接在項目的info.plist配置惭缰,動態(tài)標簽需要在AppDelegate啟動入口進行添加。下面是兩種方式的添加笼才,以及添加所涉及到的類漱受、類型介紹。

靜態(tài)標簽

上圖所示為靜態(tài)標簽在info.plist中的配置內容骡送,即在plist中添加Array類型的UIApplicationShortcutItems以及字典類型的標簽實體昂羡,下面對這些key和value進行介紹:

// info.plist

UIApplicationShortcutItems[{

UIApplicationShortcutItemIconFile:圖標名,(如果使用系統(tǒng)圖標key為UIApplicationShortcutItemIconType)

UIApplicationShortcutItemTitle:標簽名稱摔踱,(必須設置)

UIApplicationShortcutItemSubtitle:子標簽名稱虐先,

UIApplicationShortcutItemType:標簽的ID,(必須設置)

{UIApplicationShortcutItemUserInfo[{key:value}...](附加信息)

}...]

動態(tài)標簽

在添加動態(tài)標簽之前我們先來了解幾個相關的類:

UIApplicationShortcutIcon標簽圖標類

@interface UIApplicationShortcutIcon : NSObject <NSCopying>

// 使用系統(tǒng)icon時用這個API創(chuàng)建UIApplicationShortcutIcon對象.
+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;

// 使用提供的圖片自定義UIApplicationShortcutIcon對象昌渤,templateImageName為圖片名.
+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;
@end

UIApplicationShortcutItem標簽類

@interface UIApplicationShortcutItem : NSObject <NSCopying, NSMutableCopying>
/**
  * type: 標簽ID
  * localizedTitle: 標簽名稱
  * localizedSubtitle: 子標題名稱
  * icon: 標簽圖標對象
  * userInfo: 附加信息
  */
- (instancetype)initWithType:(NSString *)type localizedTitle:(NSString *)localizedTitle localizedSubtitle:(nullable NSString *)localizedSubtitle icon:(nullable UIApplicationShortcutIcon *)icon userInfo:(nullable NSDictionary *)userInfo;

// 圖標對象
@property (nullable, nonatomic, copy, readonly) UIApplicationShortcutIcon *icon;

// 對應靜態(tài)標簽的UIApplicationShortcutItemUserInfo.
@property (nullable, nonatomic, copy, readonly) NSDictionary<NSString *, id <NSSecureCoding>> *userInfo;
@end

在了解這兩個類后我們來看看動態(tài)添加標簽的代碼:

// AppDelegate.m
// - (BOOL)application:didFinishLaunchingWithOptions:
// 動態(tài)添加快捷啟動
    UIApplicationShortcutIcon *iconThree = [UIApplicationShortcutIcon iconWithTemplateImageName:@"showItemIconThree"];
    UIApplicationShortcutItem *itemThree = [[UIApplicationShortcutItem alloc] initWithType:@"shortcutTypeThree" localizedTitle:@"動態(tài)標簽" localizedSubtitle:nil icon:iconThree userInfo:nil];
    [[UIApplication sharedApplication] setShortcutItems:@[itemThree]];

現在你可以使用靜態(tài)赴穗、動態(tài)以及混合方式創(chuàng)建快捷啟動標簽,注意啟動標簽最多可以有4個膀息。下面就是我們創(chuàng)建的三個標簽:


標簽的點擊事件交互

// AppDelegate.m
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
    
    UINavigationController *nav = (UINavigationController *)self.window.rootViewController;
    BSDetailViewController *detailVC = [[BSDetailViewController alloc] init];
    
    if ([shortcutItem.type isEqualToString:@"shortcutTypeOne"]) {
        detailVC.navTitle = @"靜態(tài)標簽一";
        
    } else if ([shortcutItem.type isEqualToString:@"shortcutTypeTwo"]) {
        detailVC.navTitle = @"靜態(tài)標簽二";
        
    } else if ([shortcutItem.type isEqualToString:@"shortcutTypeThree"]) {
        detailVC.navTitle = @"動態(tài)標簽";
        
    }
    
    [nav pushViewController:detailVC animated:YES];
}

到此外部啟動標簽的創(chuàng)建以及處理事件都已經介紹完了般眉,如果看文章比較枯燥請配合demo源碼進行查看.

peek、pop & action

在設置了具有peek潜支、pop的頁面跟用戶交互的時候主要有三個階段:①輕按:提示用戶這個有預覽功能甸赃,即被選中的空間會凸顯出來周圍變得模糊。②加大力度:進入peek預覽模式冗酿,如果設置了該預覽模式下的一些操作可以向上滑動顯示actions埠对。③更大力度:激活pop络断,該階段一般是跳到指定的控制器。

輕按狀態(tài):


press
press

peek預覽:


peek
peek

actions:
action
action

pop激活:


pop
pop

要達到上述效果项玛,在開發(fā)中都需要做什么呢斤彼?下面一步一步揭曉!

peek & pop

首先我們將能觸發(fā)peek盆顾、pop功能的控制器遵守UIViewControllerPreviewingDelegate協(xié)議

// BSTableViewController.m
@interface BSTableViewController()<UIViewControllerPreviewingDelegate,BSDetailViewControllerDelegate>
@end

然后注冊該控制器作為peek和pop預覽的代理以及提供預覽視圖容器

// BSTableViewController.m
// 重要
[self registerForPreviewingWithDelegate:self sourceView:self.view];

實現代理方法:

// BSTableViewController.m
// UIViewControllerPreviewingDelegate
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
    self.selectedCell = [self searchCellWithPoint:location];
    previewingContext.sourceRect = self.selectedCell.frame;
    
    NSLog(@"peek");
    BSDetailViewController *detailVC = [[BSDetailViewController alloc] init];
    detailVC.delegate = self;
    detailVC.navTitle = self.selectedCell.textLabel.text;
    return detailVC;
}

- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
    NSLog(@"pop");
    [self tableView:self.tableView didSelectRowAtIndexPath:[self.tableView indexPathForCell:self.selectedCell]];
}

actions

上面的一步操作使我們的主界面BSTableViewController有了輕按跪腹、peek以及pop的功能,還有個是action开伏,這個action不屬于主界面而是詳情界面BSDetailViewController的事件,在demo里面膀跌,詳情將事件代理了主界面去處理事情。
BSDetailViewController生成事件方法:

// BSDetailViewController.m
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
    //
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"刪除" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        if ([self.delegate respondsToSelector:@selector(detailViewController:DidSelectedDeleteItem:)]) {
            [self.delegate detailViewController:self DidSelectedDeleteItem:self.navTitle];
        }
    }];
    //
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"返回" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        if ([self.delegate respondsToSelector:@selector(detailViewControllerDidSelectedBackItem:)]) {
            [self.delegate detailViewControllerDidSelectedBackItem:self];
        }
    }];
    
    NSArray *actions = @[action1,action2];
    
    return actions;
}

好了固灵,上面將peek捅伤、pop以及action也介紹完了,看到這你應該對3DTouch的使用有了一定的認識巫玻,還想更深入的學習有關3Dtouch請查看官方文檔丛忆,想看本博客demo源碼的點擊我CoderHann進行查看。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末仍秤,一起剝皮案震驚了整個濱河市蘸际,隨后出現的幾起案子,更是在濱河造成了極大的恐慌徒扶,老刑警劉巖粮彤,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異姜骡,居然都是意外死亡导坟,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門圈澈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惫周,“玉大人,你說我怎么就攤上這事康栈〉莸荩” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵啥么,是天一觀的道長登舞。 經常有香客問我,道長悬荣,這世上最難降的妖魔是什么菠秒? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮氯迂,結果婚禮上践叠,老公的妹妹穿的比我還像新娘言缤。我一直安慰自己,他們只是感情好禁灼,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布管挟。 她就那樣靜靜地躺著,像睡著了一般弄捕。 火紅的嫁衣襯著肌膚如雪哮独。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天察藐,我揣著相機與錄音,去河邊找鬼舟扎。 笑死分飞,一個胖子當著我的面吹牛,可吹牛的內容都是我干的睹限。 我是一名探鬼主播譬猫,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羡疗!你這毒婦竟也來了染服?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤叨恨,失蹤者是張志新(化名)和其女友劉穎柳刮,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體痒钝,經...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡秉颗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了送矩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚕甥。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖栋荸,靈堂內的尸體忽然破棺而出菇怀,到底是詐尸還是另有隱情,我是刑警寧澤晌块,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布爱沟,位于F島的核電站,受9級特大地震影響匆背,放射性物質發(fā)生泄漏钥顽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一靠汁、第九天 我趴在偏房一處隱蔽的房頂上張望蜂大。 院中可真熱鬧闽铐,春花似錦、人聲如沸奶浦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澳叉。三九已至隙咸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間成洗,已是汗流浹背五督。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓶殃,地道東北人充包。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像遥椿,于是被迫代替她去往敵國和親基矮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內容

  • 前言 關于3D touch蘋果官方文檔是這么開始介紹的: 大意如下:iOS9開始冠场,所有新的手機都增加了一個三維的用...
    VV木公子閱讀 2,216評論 3 39
  • 前言 關于這篇文章 由于iPhone 6S發(fā)布不到一年的時間家浇,很多新特性、新技術還未普遍碴裙,不管是3D Touch的...
    Tangentw閱讀 4,477評論 8 18
  • iOS 9之后提供以下幾個3D Touch API: 1.Home screen quick action 主屏幕...
    DeadRoach閱讀 751評論 1 1
  • 3D Touch介紹 從iPhone 6s開始钢悲,產品都添加了一項硬件屬性,叫做3D touch舔株。作為屏幕的一部分譬巫,...
    歪筆書生_閱讀 605評論 0 0
  • 我還活著? 葉澤瞇著眼睛督笆,有些懵芦昔,他看著天空中的太陽,很溫暖很刺眼娃肿,確實……還活著咕缎! 抬頭看一眼四周,發(fā)現自己正躺...
    相忘蠶閱讀 259評論 0 1