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上的
首先判断设备是否支持3DTouch
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
{
NSLog(@"3D Touch 可用!");
}
else
{
NSLog(@"3D Touch 无效");
}
如果支持,则注册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即可,上面的示例应用是系统日历: