iOS詳解3DTouch的使用

3DTouch的簡單使用.

介紹

3DTouch是iOS9的時(shí)候出來,對硬件也有要求,也就是說只有iPhone6s之后的手機(jī)才有這個(gè)功能

應(yīng)用icon快捷菜單

應(yīng)用icon快捷菜單,幾乎所有的應(yīng)用都在用,即使沒有添加這個(gè)功能,系統(tǒng)也會默認(rèn)給你添加一個(gè)分享XXX的快捷選項(xiàng).
比如:

系統(tǒng)默認(rèn)的

微信

這里有兩個(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不太一樣.


支付寶

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)建UIApplicationShortcutIconUIMutableApplicationShortcutItem,并添加給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]];

效果圖如下:

系統(tǒng)自定義的icon

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

除此之外我們還可以自定義圖標(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]];
    
}

效果圖如下:


自定義圖標(biāo)

當(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è)贊吧.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,211評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,431評論 4 61
  • 手握一把蘇格拉底的麥穗 心跟著欲望飄向未知遠(yuǎn)方 麥田的守望者已經(jīng)淘汰了 停不下來成了悲苦的宿命 不要問放棄還是繼續(xù)...
    月圓天心閱讀 349評論 0 1
  • 首發(fā)自公號: 思想的隧道 《躍遷》第二章“高手戰(zhàn)略”中介紹了頭部效應(yīng),這種效應(yīng)我們在日常生活或者商業(yè)世界經(jīng)常見到。...
    思想隧道閱讀 482評論 0 1
  • 對于已經(jīng)獲得認(rèn)證與備案的學(xué)校也還要注意其在辦學(xué)過程中是否堅(jiān)持標(biāo)準(zhǔn)要求,現(xiàn)在有的地區(qū)已經(jīng)針對國際課程建立了年檢制度和...
    奈彭澤閱讀 115評論 0 0

友情鏈接更多精彩內(nèi)容