3DTouch是iOS9出的新特性,用户可以在手机主屏幕和app内部使用
1. 主屏幕的快捷操作
当用户按压应用图标是会弹出快捷操作列表,当用户选择选择一个快捷操作是,应用会被激活或者启动,同事你的代理对象会收到快捷操作的信息。
- 固定的快捷操作:需要在
Info.plist
里设置 UIApplicationShortcutItems - 动态的快捷操作:需要使用
UIApplicationShortcutItem
类和相关方法创建快捷操作,并设置UIApplication
的shortcutItems
的属性
2. 应用内使用
当用户按压时会经历三个阶段:
- 看看内容预览是否有效
- 展示预览内容
- present出内容预览页面
3. 使用
- 检查3D-Touch是否可用
//通过forceTouchCapability属性判断3DTousch是否可用
//UIForceTouchCapabilityUnknown、UIForceTouchCapabilityUnavailable、UIForceTouchCapabilityAvailable
//实现UITraitEnvironment协议的类都可以直接调用,UIScreen、UIWindow、UIViewController、UIView都实现了该协议
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
NSLog(@"可用");
}
//重写该方法可以监听状态改变改变
- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection
如果3DTouch不可用需要自己写 UILongPressGestureRecognizer来代替
主屏幕快捷操作—固定的快捷操作
需要在
Info.plist
文件中添加UIApplicationShortcutItems
UIApplicationShortcutItemType快捷操作的类型,需要这个识别快捷操作
UIApplicationShortcutItemTitle快捷操作的标题
UIApplicationShortcutItemSubtitle快捷操作的子标题
UIApplicationShortcutItemIconType快捷操作的图标
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. //如果程序被杀掉,在这里拿到快捷操作 if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){ UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey]; if(shortcutItem){ //根据type判断要指定哪个操作 } } return YES; } //设置完plist文件后需要在appdelegate中重写该方法 - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler { //根据type来判断执行不同的操作 if([shortcutItem.type isEqualToString:@"search"]){ NSLog(@"search"); }else if([shortcutItem.type isEqualToString:@"open"]){ NSLog(@"open"); } completionHandler(YES); }
主屏幕快捷操作——— 动态的快捷操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0){ UIApplicationShortcutItem *shortcutItem = launchOptions[UIApplicationLaunchOptionsShortcutItemKey]; if(shortcutItem == nil){ UIApplicationShortcutItem *firstItem = [[UIApplicationShortcutItem alloc] initWithType:@"first" localizedTitle:@"第一个" localizedSubtitle:@"子标题" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun1"] userInfo:nil]; UIApplicationShortcutItem *secondItem = [[UIApplicationShortcutItem alloc] initWithType:@"second" localizedTitle:@"第二个" localizedSubtitle:@"子标题" icon:[UIApplicationShortcutIcon iconWithTemplateImageName:@"sun2"] userInfo:nil]; application.shortcutItems = @[firstItem,secondItem]; }else{ //根据type判断要指定哪个操作 } } return YES; } //自定义图标需要正方形,单一颜色,35*35的图才可以使用
应用内使用
应用内使用3DTouch需要使用
UIPreviewAction
和UIPreviewActionGroup
类以及UIPreviewActionItem
协议
- (void)viewDidLoad {
[super viewDidLoad];
_imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 70, 70)];
_imgView.center = self.view.center;
_imgView.image = [UIImage imageNamed:@"sun"];
_imgView.userInteractionEnabled = YES;
[self.view addSubview:_imgView];
//先判断3DTouch是否可用
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
//注册,首先是一个代理,sourceView是你需要将3DTouch加到的view上
[self registerForPreviewingWithDelegate:self sourceView:_imgView];
}
}
//实现代理方法
#pragma UIViewControllerPreviewingDelegate
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location {
//location是按压在应用3DTouch视图上的位置
//设置sourceRect,应用3DTouch视图的bounds
previewingContext.sourceRect = _imgView.bounds;
//这是需要弹出的controller
DetailViewController *detailVC = [[DetailViewController alloc] init];
//预览是后的大小
detailVC.preferredContentSize = CGSizeMake(0, 300);
return detailVC;
}
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit {
//present预览的controller
[self showViewController:viewControllerToCommit sender:self];
}
//这是再DetailViewController.m文件中的重写的,当弹出预览时,上滑预览视图,出现预览视图中快捷选项
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems {
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"action1" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action1");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"action2" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action2");
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"action3" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"action3");
}];
return @[action1,action2,action3];
}