在我们的app中使用3D Touch功能,主要分为以下三个模块:
- Home Screen Quick Actions
通过主屏幕的应用Icon,我们可以用3D Touch呼出一个菜单,进行快速定位应用功能模块相关功能的开发。如上面的日历。 - peek and pop
这个功能是一套全新的用户交互机制,在使用3D Touch时,ViewController中会有如下三个交互阶段:
(1)提示用户这里有3D Touch的交互,会使交互控件周围模糊
(2)继续深按,会出现预览视图
(3)通过视图上的交互控件进行进一步交互
这个模块的设计可以在网址连接上进行网页的预览交互。 - Force Properties
iOS9为我们提供了一个新的交互参数:力度。我们可以检测某一交互的力度值,来做相应的交互处理。例如,我们可以通过力度来控制快进的快慢,音量增加的快慢等。
实际的使用方法
Home Screen Quick Actions
有2种添加方式
- 静态添加
在info.plist里添加UIApplicationShortcutItems
UIApplicationShortcutItemType
1
UIApplicationShortcutItemIconType
1
UIApplicationShortcutItemTitle
title
UIApplicationShortcutItemSubtitle
subTitle
UIApplicationShortcutItemIconFile
UIApplicationShortcutItemUserInfo
首先是UIApplicationShortcutItems,他是一个数组类型,数组中的每一个元素表示一个入口标签。
然后是Item0,这是数组中的一个元素,字典类型。在这个字典中配置各个标签的相关属性。
UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串 必有项 我们可以监听该项的值来判断用户是从哪一个标签进入App的,该字段的值可以为空。
UIApplicationShortcutItemTitle 这个键值设置标签的标题 必有项 我们可以监听该项的值来判断用户是从哪一个标签进入App的
UIApplicationShortcutItemSubtitle 设置标签的副标题 可选项
UIApplicationShortcutItemIconType 设置标签的图标样式,系统提供了29中样式的图标,但大部分只能在9.1的系统上使用,只有少数可以在9.0的系统中使用,这一部分会在后边详细介绍 可选项
UIApplicationShortcutItemIconFile 设置自定义标签图片文件的路径 可选项
UIApplicationShortcutItemUserInfo 设置用户信息,是一个字典类型,可以用来传值 可选项
2.动态添加
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch];
UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"chuan" localizedTitle:@"title" localizedSubtitle:@"" icon:icon1 userInfo:nil];
[UIApplication sharedApplication].shortcutItems = @[item1];
///3dtouch回调
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
if ([shortcutItem.type isEqualToString:@"chuan"]) {
//执行操作
}
}
peek and pop
首先需要继承代理
在viewwillappear里判断是否打开了3d touch功能
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
self.isOpen3DTouch = YES;
}
在支持3D Touch的设备上,用户可以在程序运行期间通过设置 -> 通用 -> 辅助功能 -> 3D Touch来关闭3D Touch功能,所以我们有必要通过重写-traitCollectionDidChange:方法随时处理
-(void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection{
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable){
self.isOpen3DTouch = YES;
}
}
我这里是对cell进行的按压处理
if (self.isOpen3DTouch) { [self registerForPreviewingWithDelegate:self sourceView:cell]; }
#pragma mark - UIViewControllerPreviewingDelegate
- (UIViewController *)previewingContext:(id)previewingContext viewControllerForLocation:(CGPoint)location{
//通过预览上下文获取到当前按压的视图,判断indexPath值
NSIndexPath *indexPath = [_boaterTable indexPathForCell:(UITableViewCell *)previewingContext.sourceView];
//通过上下文可以调整不被虚化的范围
previewingContext.sourceRect = CGRectMake(0, 0, kScreenWidth, 102);
///这里是需要预览的视图
GWJobInfoViewController *ivc =[[GWJobInfoViewController alloc] init];
ivc.title = @"求职信息";
ivc.model = self.dataArr[indexPath.section];
ivc.isSearch = YES;
ivc.touch = ^(NSString *msg){
[self.view makeToast:msg];
};
//可以调整预览视图的大小
// ivc.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 200);
return ivc;
}
- (void)previewingContext:(id)previewingContext commitViewController:(UIViewController *)viewControllerToCommit{
[self showViewController:viewControllerToCommit sender:self];
}
在预览是视图里实现-(NSArray
此方法,可以实现上拉实现功能
-(NSArray> *)previewActionItems
{
// 生成UIPreviewAction 自定义action
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"邀请加入" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
}];
//可以有多个功能 以数组形式返回
NSArray *actions = @[action1];
return actions;
}
Force Properties
这个功能目前使用的比较少,这里就展示个小demo,按压改变背景色。
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
// UITouch *touch = touches.anyObject;
//
// /**
// * maximumPossibleForce 最大 6.67
// */
// NSLog(@"%.2f,%2f",touch.force,touch.maximumPossibleForce); //iOS 9.0之后
//
// CGFloat radio = touch.force / touch.maximumPossibleForce;
//
// self.view.backgroundColor = [UIColor colorWithRed:radio green:radio blue:radio alpha:1];
}