3Dtouch实现

3DTouch分为三个内容:

1. 在点击app icon 的手长按并且用力一点,就会出现 几个Item。

2.(1)在app 里面长按也要用力往下压,就会可以弹出一个自定义的 ViewController。这个时候如果你放手了那么就会消失。

   (2)如果长按往下压弹出了自定义的ViewController 之后,接着往上移动,就可以出现选择Action。

3. 如果长按往下压弹出了自定义的ViewController,然后更加用力一点按压, 那么就会相当于push 进来了。

一、主屏静态和动态快速选项

    1. 在 Info.plist文件里静态添加快速选项

先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:

必填项(下面两个键值是必须设置的):

UIApplicationShortcutItemType   快捷通道类型的字符串,处理点击事件事时的唯一标识,用于区分item

UIApplicationShortcutItemTitle 这个键值设置标签的标题

选填项(下面这些键值不是必须设置的):

UIApplicationShortcutItemSubtitle 设置标签的副标题

UIApplicationShortcutItemIconType 设置标签Icon类型

UIApplicationShortcutItemIconFile  设置标签的Icon文件

UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)

2.动态添加快速选项

例如:

    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_register.png"];
    NSDictionary *info1 = @{@"scheme":@"devzeng://register"};
    UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.registerPage" localizedTitle:@"注册" localizedSubtitle:@"注册新用户" icon:icon1 userInfo:info1];
  NSArray *shortcutItems=[[NSArray alloc]initWithObjects:item1,item2, nil];
  [UIApplication sharedApplication].shortcutItems = shortcutItems;

注:最多可添加4个。

最后,使用这个方法来处理3dtouch点击事件,包括跳转至哪个界面

-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler

二、peek (预览)

弹出悬浮的controller时,按压事件是加在该controller上的

  1. 首先判断设备是否支持3DTouch

    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
        {
            NSLog(@"3D Touch  可用!");
        }
        else
        {
            NSLog(@"3D Touch 无效");
        }

  2.  如果支持,则注册delegate,此处的delegate是UIViewControllerPreviewingDelegate,是按压controller的代理     

      [self registerForPreviewingWithDelegate:self sourceView:self.view];

    3.实现代理,并做相应的处理,弹出悬浮

       -(UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location

             if ([self.presentedViewController isKindOfClass:[弹出悬浮controller class]]) {
        return nil;
    }
    
    弹出悬浮controller *con = [[弹出悬浮controller alloc] init];
    return con;


    4.添加向上滑动悬浮controller时从底下出来的action,这个是要添加到悬浮controller类里的

-(NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"收藏" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        NSLog(@"click");
    }];
        //想要显示多个就定义多个 UIPreviewAction
        NSArray *actions = @[action1];
        return actions;
}

三、pop (详阅)

还是UIViewControllerPreviewingDelegate代理方法,添加在最初按压的controller上

//全屏展示方法,可有可无,只是加上的话全屏展示时动画更流畅
-(void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
    [self showViewController:viewControllerToCommit sender:self];
}

四、SBShortcutMenuSimulator的安装和使用

在终端中一次运行如下指令:

1
2
3
git clone https: //github .com /DeskConnect/SBShortcutMenuSimulator .git
cd  SBShortcutMenuSimulator
make

如果电脑中有多个Xcode版本,先做如下操作,如果只有Xcode7,则可以跳过

1
sudo  xcode- select  -switch  /Applications/Xcode2 .app /Contents/Developer/

注意:上面命令中,Xcode2.app是你电脑中Xcode的名字,这里如要特别注意,如果名字中有空格,需要修改一下,把空格去掉,否则会影响命令的执行。

之后在SBShortcutMenuSimulator的目录中执行如下操作:

1
2
xcrun simctl spawn booted launchctl debug system /com .apple.SpringBoard --environment DYLD_INSERT_LIBRARIES=$PWD /SBShortcutMenuSimulator .dylib
xcrun simctl spawn booted launchctl stop com.apple.SpringBoard

如果没有报错,我们可以通过向指定端口发送消息的方法来在模拟器上模拟3D Touch的效果:

1
echo  'com.apple.mobilecal'   nc  127.0.0.1 8000

其中,com.apple.mobilecal是应用的Bundle ID ,如果要测试我们的应用,将其改为我们应用的BundleID即可,上面的示例应用是系统日历:

发布了41 篇原创文章 · 获赞 4 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章