iOS 3D touch的基本使用

在我们的app中使用3D Touch功能,主要分为以下三个模块:

  1. Home Screen Quick Actions
    通过主屏幕的应用Icon,我们可以用3D Touch呼出一个菜单,进行快速定位应用功能模块相关功能的开发。如上面的日历。
  2. peek and pop
    这个功能是一套全新的用户交互机制,在使用3D Touch时,ViewController中会有如下三个交互阶段:
    (1)提示用户这里有3D Touch的交互,会使交互控件周围模糊
    (2)继续深按,会出现预览视图
    (3)通过视图上的交互控件进行进一步交互
    这个模块的设计可以在网址连接上进行网页的预览交互。
  3. Force Properties
    iOS9为我们提供了一个新的交互参数:力度。我们可以检测某一交互的力度值,来做相应的交互处理。例如,我们可以通过力度来控制快进的快慢,音量增加的快慢等。

实际的使用方法

Home Screen Quick Actions

有2种添加方式

  1. 静态添加
    在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> *)previewActionItems此方法,可以实现上拉实现功能

-(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];
}

你可能感兴趣的:(iOS 3D touch的基本使用)