3D Touch 有两种方式,一种是在按压icon图标出现快捷标签跳转到相应界面,这里的快捷标签最多只能有四个;另一种是在app内实现按压预览,预览图片或文字等。
下面先说第一种3D Touch 方式!这种方式很简单,只需在info.plist文件里添加相应参数就可以了,如下图:
在info.plist文件的UIApplicationShortcutItems下添加参数:
//这两个为必有项
- UIApplicationShortcutItemTitle:标签的名字,自己随便取咯!
- UIApplicationShortcutItemType:标签标识,在application中用到,也是自己随便取的哦!
//以下为可选项 - UIApplicationShortcutItemIconType:标签前图标的样式,此为系统图片,也可用下面的自定义图片!
- UIApplicationShortcutItemSubtitle:标签副标题!
- UIApplicationShortcutItemIconFile:自定义图片的路径!
- UIApplicationShortcutItemUserInfo:设置用户信息,是一个字典类型,可以用来传值!
info.plist文件里添加参数
添加完成后就可以运行程序啦!效果如下:
(http://upload-images.jianshu.io/upload_images/2455662-bba6ed5447ddaa30.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)运行效果图
当然也可以用代码实现,在application:didFinishLaunchingWithOptions:中添加代码
// 创建标签的ICON图标。 UIApplicationShortcutIcon *icon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch]; // 创建一个标签,并配置相关属性。 UIApplicationShortcutItem *item = [[UIApplicationShortcutItem alloc] initWithType:@"com.playmoster.app" localizedTitle:@"play master" localizedSubtitle:nil icon:icon userInfo:nil]; // 将标签添加进Application的shortcutItems中,最多可添加四个哦! [UIApplication sharedApplication].shortcutItems = @[item];
那么点击标签如何进入指定的界面呢,iOS9提供了一个新方法,在ApplicationDelegate中的
- (void)application:(UIApplication *)application performActionForShortcutItem:(nonnull UIApplicationShortcutItem *)shortcutItem completionHandler:(nonnull void (^)(BOOL))completionHandler
方法
if ([shortcutItem.type isEqualToString:@"com.playmoster.app"]) { //跳转到你想要跳转的页面,先跳转到首页,再在首页中处理你的跳转逻辑 ViewController *ctrl = [[ViewController alloc] init]; ctrl.shortcutItemType = 0; UINavigationController *navCtrl = [[UINavigationController alloc]initWithRootViewController:ctrl]; self.window.rootViewController = navCtrl;}
这样就ok了,你的程序就可以实现3D Touch在icon上面的功能了!
下面我们说一下3D Touch的预览功能!
在开始前我们需要在ViewController中添加一个UITableView的首页,如图,这个大家自己随便写一个咯!
用来实现3D Touch的UITableView
接下来我们要实现3D Touch的预览功能啦!
第一步、我们要注册3D Touch:这里是在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中注册的。
//代理设为当前界面,sourceView为按压的视图,只要是UIView类型的都可以注册!
[self registerForPreviewingWithDelegate:self sourceView:cell];
} else {
NSLog(@"no support 3D Touch!");
}```
第二步、实现两个代理方法,当压力超过一定值后,会直接跳转到预览界面
```- (UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location {
// 初始化预览界面
SelectViewController *ctrl = [[SelectViewController alloc] init];
//设定预览界面的大小
ctrl.preferredContentSize = CGSizeMake(0, kScreenHeight);
//设置未出现预览界面是周边模糊范围,rect为3D touch范围,范围以外为模糊区域
CGRect rect = CGRectMake(0, 0, kScreenWidth, 44);
previewingContext.sourceRect = rect;
return ctrl;
}```
```- (void)previewingContext:(id)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
//跳转到预览界面
[self showViewController:viewControllerToCommit sender:self];
}```
预览效果如图
![IMG_0610.PNG](http://upload-images.jianshu.io/upload_images/2455662-fa792eb79fab46f8.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
想要实现预览图片是上滑出现sheet的功能,只需实现下面几步,以下代码在预览界面实现
```- (NSArray<id<>UIPreviewActionItem>> *)previewActionItems {
// setup a list of preview actions
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"one" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//添加点击方法
NSLog(@"click one");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"two" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
//添加点击方法
NSLog(@"click two");
}];
NSArray *actions = @[action1, action2];
return actions;
}```
若要在点击方法里面实现页面跳转,则需要添加如下方法,注意:appDelegate是在ApplicationDelegate.h 文件中添加类方法
```+ (AppDelegate *)appDelegate;```
在.m文件中实现:
```+ (AppDelegate *)appDelegate {
return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}```
然后才能在预览界面中实现下面的方法
将跳转是用到的self都替换成[self topViewController]即可。
```- (UIViewController*)topViewController {
return [self topViewControllerWithRootViewController:[AppDelegate appDelegate].window.rootViewController];
}
-(UIViewController*)topViewControllerWithRootViewController:(UIViewController*)previewViewController {
if ([previewViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabBarController = (UITabBarController *)previewViewController;
return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
} else if ([previewViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController*)previewViewController;
return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
} else if (previewViewController.presentedViewController) {
UIViewController* presentedViewController = previewViewController.presentedViewController;
return [self topViewControllerWithRootViewController:presentedViewController];
} else {
return previewViewController;
}
}```
效果如下图:
![IMG_0611.PNG](http://upload-images.jianshu.io/upload_images/2455662-6ee0d903f26c7ee5.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
以上就是我所学习的一点3D Touch了,大家看看提点意见哈!!!