3D Touch是在iPhone6s之后且系统是iOS9以上才能使用的功能,详情见官方文档
(https://developer.apple.com/library/prerelease/content/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/index.html#//apple_ref/doc/uid/TP40016543)
3D Touch总的来说分如下两种
(1)A user can now press your Home screen icon to immediately access functionality provided by your app.
(2)Within your app, a user can now press views to see previews of additional content and gain accelerated access to features.
一种是按压应用icon弹出的快捷菜单,另一种是在应用里面,按压view弹出另一个视图,再深按一次可push到另一个页面。
一、Home Screen Quick Actions(按压应用图标)
在info.plist文件里添加一项UIApplicationShortcutItems,这是个数组,里面添加任意项,Item0里面的三项分别是图片名称、文本内容、类型,在AppDelegate里是根据这个类型跳转到指定页的。
在AppDelegate如下方法里实现跳转
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
if (articleType == kTypeAttetion) {
[self.tabbar setTabBarSelectedWithIndex:kTabbarTypeAttention];
} else {
[self.tabbar setTabBarSelectedWithIndex:kTabbarTypeHome];
}
HBBaseNavController *nc = (HBBaseNavController *)self.tabbar.selectedViewController;
[nc popToRootViewControllerAnimated:YES];
UIViewController *vc = [[UIViewController alloc] init];
[nc pushViewController:vc animated:YES];
跳转的时候要注意的是,先让TabBarViewController跳转到指定Tab,再让这个Tab下的NavigationController 回到根视图(popToRootViewController),然后再push到对应的ViewController里去。
二、Peek and Pop(弹出一个视图和push到一个新的页面)
1.注册事件
如果是在一个tableview上实现这个功能,则需要在cellForRow里面去注册这个事件,
if (IOS9_OR_LATER) {
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
if (!cell.hasRegister3DTouch) {
[[self viewController] registerForPreviewingWithDelegate:HBTouchDelegate sourceView:cell];
cell.hasRegister3DTouch = YES;
}
}
}
这里面有两点重要的处理:
*第一点是关于这个cell是否被注册过,由于tableview的cell是复用的,所以只注册一遍即可,否则在列表上拉加载几屏后会出现严重的卡顿。
*第二点是这个View所属ViewController的代理指向问题,如果有多个列表,每个列表里都要注册这个代理,这样每个列表里都要实现这个代理的方法,同样的方法要写很多遍,这明显不符合我们编程简洁、高效的宗旨,所以可以把代理的实现抽象成一个类,然后注册时将代理指向这个类(在上面代码中指的是HBTouchDelegate,实现的就是UIViewControllerPreviewingDelegate的两个代理方法)。
2.实现代理方法
#pragma mark - UIViewControllerPreviewingDelegate
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
UIView *sourceCell = [previewingContext sourceView];
if (![[sourceCell viewController].presentedViewController isKindOfClass:[HBPeekViewController class]]) {
HBPeekViewController *peekViewController = [HBPeekViewController new];
peekViewController.preferredContentSize = CGSizeMake(0, 300);//这个是弹出视图的宽高,默认是屏幕宽高
return peekViewController;
} else {
return nil;
}
}
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0) {
[[[previewingContext sourceView] viewController] jumpWithArticleEntity:(HBArticleEntity *)self.touchEntity];
}
3.peekViewController中给弹出的视图添加一些快捷操作,点赞、收藏、对上面的文字进行复制等等,只要在previewActionItems方法,创建UIPreviewAction到数组中,可以在UIPreviewAction的block里实现对应的操作即可
- (NSArray<id<UIPreviewActionItem>>*)previewActionItems {
// 生成UIPreviewAction
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"赞" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//do something
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"看全文" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//do something
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"收藏" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//do something
}];
NSArray *group = nil;
group = @[action1, action2, action3];
return group;
}
到这里3DTouch主要的几点就讲完啦!