從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