3DTouch的簡單使用.
介紹
3DTouch是iOS9的時(shí)候出來,對硬件也有要求,也就是說只有iPhone6s之后的手機(jī)才有這個(gè)功能
應(yīng)用icon快捷菜單
應(yīng)用icon快捷菜單,幾乎所有的應(yīng)用都在用,即使沒有添加這個(gè)功能,系統(tǒng)也會默認(rèn)給你添加一個(gè)分享XXX的快捷選項(xiàng).
比如:


這里有兩個(gè)方法,一是在info.plist中添加. 二是純代碼添加.
還有一種3DTouch是在應(yīng)用程序打開后,在應(yīng)用內(nèi)的3DTouch.類似于京東商城的APP中,選按某一個(gè)商品后的彈框,向上滑動(dòng)會出現(xiàn)一個(gè)關(guān)注的選項(xiàng),可以直接關(guān)注該商品. 繼續(xù)用力按壓會跳轉(zhuǎn)到目標(biāo)商品的詳情頁面.
如圖:

大家會注意到支付寶3DTouch出來的內(nèi)容和QQ不太一樣.


大家可以看到,支付寶的上面多了一塊內(nèi)容.這個(gè)是widget.我們放到最后再說,今天先實(shí)現(xiàn)類似微信和QQ的.
代碼實(shí)現(xiàn)icon快捷鍵
創(chuàng)建一個(gè)應(yīng)用,在AppDelegate.m中進(jìn)行實(shí)現(xiàn).
首先在方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ }中創(chuàng)建UIApplicationShortcutIcon 和 UIMutableApplicationShortcutItem,并添加給APP.
UIApplicationShortcutIcon *icon0 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd];
UIMutableApplicationShortcutItem *item0 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"add" localizedTitle:@"進(jìn)入add" localizedSubtitle:@"系統(tǒng)圖標(biāo)add" icon:icon0 userInfo:nil];
[[UIApplication sharedApplication] setShortcutItems:@[item0]];
效果圖如下:

從效果圖中可以看到如何設(shè)置標(biāo)題和副標(biāo)題,如果我們想像微信那樣只要一個(gè)標(biāo)題,不要副標(biāo)題,只需要將副標(biāo)題內(nèi)容改為:
nil即可.如圖:

除此之外我們還可以自定義圖標(biāo).做成像微信那樣.只能添加四個(gè),系統(tǒng)會默認(rèn)再加一個(gè)分享,一共五個(gè).
上代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 首先判斷是否支持3DTouch
if(self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
{
[self setup3DTouch];
}
return YES;
}
-(void)setup3DTouch{
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"pic1"];
UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"pic2"];
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"pic3"];
UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"pic4"];
UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"pic1" localizedTitle:@"進(jìn)入pic1" localizedSubtitle:@"自定義圖標(biāo)pic1" icon:icon1 userInfo:nil];
UIMutableApplicationShortcutItem *item2 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"pic2" localizedTitle:@"進(jìn)入pic2" localizedSubtitle:@"自定義圖標(biāo)pic2" icon:icon2 userInfo:nil];
UIMutableApplicationShortcutItem *item3 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"pic3" localizedTitle:@"進(jìn)入pic3" localizedSubtitle:@"自定義圖標(biāo)pic3" icon:icon3 userInfo:nil];
UIMutableApplicationShortcutItem *item4 = [[UIMutableApplicationShortcutItem alloc]initWithType:@"pic4" localizedTitle:@"進(jìn)入pic4" localizedSubtitle:@"自定義圖標(biāo)pic4" icon:icon4 userInfo:nil];
[[UIApplication sharedApplication] setShortcutItems:@[item1,item2,item3,item4]];
}
效果圖如下:

當(dāng)我們點(diǎn)擊每一個(gè)圖標(biāo)的時(shí)候,想條件特定的頁面,只需要在AppDelegate.m中添加一個(gè)方法.
#pragma mark - 通過快捷選項(xiàng)進(jìn)入app的時(shí)候會調(diào)用該方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
HomeDetailController *vc = [[HomeDetailController alloc] init];
//1.獲得shortcutItem的type type就是初始化shortcutItem的時(shí)候傳入的唯一標(biāo)識符
NSString *type = shortcutItem.type;
//2.可以通過type來判斷點(diǎn)擊的是哪一個(gè)快捷按鈕 并進(jìn)行每個(gè)按鈕相應(yīng)的點(diǎn)擊事件
if ([type isEqualToString:@"pic1"]) {
vc.name = @"pic1";
}else if ([type isEqualToString:@"pic2"]){
vc.name = @"pic2";
}else if ([type isEqualToString:@"pic3"]){
vc.name = @"pic3";
}else if ([type isEqualToString:@"pic4"]){
vc.name = @"pic4";
}
[(UINavigationController *)self.window.rootViewController pushViewController:vc animated:YES];
}
應(yīng)用內(nèi)3DTouch跳轉(zhuǎn)(仿京東)
先附上一個(gè)京東的效果動(dòng)畫.

我們先控制器中在創(chuàng)建一個(gè)tableView,并遵守代理UIViewControllerPreviewingDelegate,再創(chuàng)建一個(gè)要跳轉(zhuǎn)的目標(biāo)控制器.
我們先實(shí)現(xiàn)這個(gè)效果,廢話不多說,直接上代碼.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _datas.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
}
cell.textLabel.text = _datas[indexPath.row];
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
NSLog(@"3D Touch 可用!");
//給cell注冊3DTouch的peek(預(yù)覽)和pop功能
[self registerForPreviewingWithDelegate:self sourceView:cell];
} else {
NSLog(@"3D Touch 無效");
}
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
HomeDetailController *vc = [[HomeDetailController alloc]init];
vc.name = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
[self.navigationController pushViewController:vc animated:YES];
}
//2.第二步
#pragma mark - UIViewControllerPreviewingDelegate(實(shí)現(xiàn)代理的方法)
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
HomeDetailController *vc = [[HomeDetailController alloc]init];
//獲取按壓的cell所在行,[previewingContext sourceView]就是按壓的那個(gè)視圖
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell* )[previewingContext sourceView]];
//設(shè)定預(yù)覽的界面
vc.preferredContentSize = CGSizeMake(0.0f,500.0f);
vc.name = [NSString stringWithFormat:@"我是%ld,用力按一下進(jìn)來",(long)indexPath.row];
//調(diào)整不被虛化的范圍,按壓的那個(gè)cell不被虛化(輕輕按壓時(shí)周邊會被虛化,再少用力展示預(yù)覽,再加力跳頁至設(shè)定界面)
CGRect rect = CGRectMake(0, 0, self.view.frame.size.width,40);
previewingContext.sourceRect = rect;
return vc;
}
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
[self.navigationController pushViewController:viewControllerToCommit animated:YES];
}
再在目標(biāo)控制器里面添加代碼.
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
// setup a list of preview actions
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"關(guān)注" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"關(guān)注");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"收藏" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"收藏");
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"特別關(guān)心" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"特別關(guān)心");
}];
NSArray *actions = @[action1,action2,action3];
return actions;
}
效果圖如下:

最后附上代碼:https://github.com/coderXuanhe/-3DTouch
未完待續(xù)...........
喜歡的小伙伴點(diǎn)個(gè)贊吧.