您的位置:首页 > 移动开发 > Swift

iOS开发,3DTouch(swift版本)的使用

2017-06-08 00:00 495 查看
摘要: 总结一下关于3DTouch的使用,虽然网上已经有了很多的博客

从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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  3dTouch