天天看點

iOS開發,3DTouch(swift版本)的使用

    從iOS9,iPhone6s問世,蘋果引進了3dTouch。雖然這篇部落格有點晚了,但是最近公司項目要求使用3dTouch,是以還是先寫個demo,寫個部落格總結一下吧。

    3dTouch可以使用在兩個地方,一個是應用内的3dTouch,一個是應用外的3dTouch(主要是APP ICON)。

 1.應用外(app icon)的3dTouch的使用。

tip:目前,每個上線之後的app,App Store都會給加上預設的3dTouch,這個3dTouch隻有分享這個功能,是以你也不用自己費勁去添加這個分享的功能了。

下面開始介紹app圖示如何使用3dTouch的功能。

<1>添加3dTouch需要展現的功能。

在AppDelegate的入口裡面添加下面的代碼。

/***建立應用圖示上的3D touch快捷選項***/
- (void)creatShortcutItem {
    
    UIApplicationShortcutIcon *newsIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeHome];
    UIApplicationShortcutItem * newsItem = [[UIApplicationShortcutItem alloc]initWithType:News localizedTitle:@"檢視新聞界面" localizedSubtitle:nil icon:newsIcon userInfo:nil];
    
    UIApplicationShortcutIcon *imageIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLocation];
    UIApplicationShortcutItem * imageItem = [[UIApplicationShortcutItem alloc]initWithType:ImageEnlarge localizedTitle:@"圖檔放大界面" localizedSubtitle:nil icon:imageIcon userInfo:nil];
    
    UIApplicationShortcutIcon *smartLockIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeShuffle];
    UIApplicationShortcutItem * smartLockItem = [[UIApplicationShortcutItem alloc]initWithType:SmartLock localizedTitle:@"手勢解鎖界面" localizedSubtitle:nil icon:smartLockIcon userInfo:nil];
    
    /***以棧的方式進入,先進後出,newsItem在顯示的界面中是最低下的一個***/
    [UIApplication sharedApplication].shortcutItems = @[newsItem,imageItem,smartLockItem];
}
           

<2>處理3DTouch的回調API。

/***響應3DTouch的系統API***/
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
    [self jumpToControllerForShortcutItem:shortcutItem];
    if (completionHandler) {
        completionHandler(YES);
    }
}

/***跳進指定的控制器***/
-(void)jumpToControllerForShortcutItem:(UIApplicationShortcutItem *)shortcutItem{
    
    if (!shortcutItem) {
        return;
    }
    if([shortcutItem.type isEqualToString:News]){
        /***新聞分類界面***/
        NewsListViewController *newsVC=[[NewsListViewController alloc] init];
        newsVC.title = @"新聞分類";
        [[WTManager CurrentController] pushViewController:newsVC animated:YES];
        
    }else if ([shortcutItem.type isEqualToString:ImageEnlarge]){
        /***圖檔放大界面***/
        EnlargeImageController *enlargeVC=[[EnlargeImageController alloc] init];
        enlargeVC.title = @"圖檔放大";
        [[WTManager CurrentController] pushViewController:enlargeVC animated:YES];
    }else{
        /***手勢解鎖界面***/
        GestureLockController *vc=[[GestureLockController alloc] init];
        vc.title=@"手勢解鎖";
        [[WTManager CurrentController] pushViewController:vc animated:YES];
    }
}
           

    2.應用内的3dTouch的使用。

在這裡,我是采用Swift,模仿微信會話界面的3DTouch來制作Demo的。

<1>給需要添加3DTouch的視圖(view)注冊預覽到對應的控制器,設定代理

/*** 首先,在控制器層判斷目前的系統是否支援3DTouch,如果支援為他的子視圖指派 ***/
 if #available(iOS 9.0, *) {
            if self.traitCollection.forceTouchCapability == .available {
                /***3DTouch可用***/
                
                threeDTouchViewModel.superController = self
            }else{
                /***3DTouch不可用***/
            }
        } else {
            // Fallback on earlier versions
        }
           
/*** 在這裡,将UITableViewCell注冊UIPreview到_superController(該視圖所存在的父控制器)。并遵循UIViewControllerPreviewingDelegate協定,隻有iOS9支援3DTouch ***/
if _superController != nil {
            if #available(iOS 9.0, *) {
                _superController?.registerForPreviewing(with: self as UIViewControllerPreviewingDelegate, sourceView: cell!)
            } else {
                // Fallback on earlier versions
            }
        }
           

<2>實作代理方法,為預覽添加可執行的操作

/*** 在這裡要說明一下,我這裡的預覽跟點選進去的預覽是兩個不同的控制器,就為了模仿微信在預覽的時候也是有标題的效果***/

/***預覽(peek)***/
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        /***擷取按壓的cell所在行,[previewingContext sourceView]就是按壓的那個視圖***/
        if #available(iOS 9.0, *) {
            
            /***設定預覽的界面***/
            let vc = ThreeDTouchTestViewController()
            vc.preferredContentSize = CGSizeMake(width: 0, height: 500)
            
            /***調整不被虛化的範圍,按壓的那個cell不被虛化(輕輕按壓時周邊會被虛化,再少用力展示預覽,再加力跳頁至設定界面)***/
            previewingContext.sourceRect = CGRectMake(x: 0, y: 0, width: KScreenWidth_Swift,height: 80)
            
            return vc
            
        } else {
            // Fallback on earlier versions
            let vc = ThreeDTouchTestViewController()
            return vc
        }
    }
    
    /***點選進入(pop)***/
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        WTManager.currentController().pushViewController(ThreeDTouchTestOneViewController(), animated: true)
    }
           
/*** 這裡是在預覽的控制器裡面添加可執行的操作***/
@available(iOS 9.0, *)
    override var previewActionItems: [UIPreviewActionItem]{
        var items = [UIPreviewAction]()
        let action1 = UIPreviewAction.init(title: "收藏", style: UIPreviewActionStyle.default, handler: { (action: UIPreviewAction, previewViewController: UIViewController) in
            print("收藏")
        })
        
        let action2 = UIPreviewAction.init(title: "喜歡", style: UIPreviewActionStyle.default, handler: { (action: UIPreviewAction, previewViewController: UIViewController) in
            print("喜歡")
        })
        items.append(action1)
        items.append(action2)
        return items;
    }
           

謝謝觀看,歡迎指正,不定時更新。

QQ:2799569272

版權聲明:本文為CSDN部落客「weixin_33924220」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33924220/article/details/91735593