对系统和硬件的要求
- iOS6s及之后
- 系统iOS9
功能
- 1 按压主屏幕上的应用图标,快速访问app功能
- 2 对控件添加功能,实现peek和pop功能
1 配置3DTouch主屏幕上的item
设置主屏幕图标按压效果有两种方式
1.1 在info.plist文件中进行配置
添加字段为UIApplicationShortcutItems 数组类型,内部每个字典代表一个item
UIApplicationShortcutItemType:标识符,主屏幕点击快捷方式启动应用,用来区分,必填
UIApplicationShortcutItemTitle:item标题,必填
UIApplicationShortcutItemSubtitle:子标题,可选
UIApplicationShortcutItemIconType:图标类型,iOS内置很多图片,可选
UIApplicationShortcutItemIconFile:可以自定义图片,值为项目中图片名称,可选
UIApplicationShortcutItemUserInfo,附带信息,可选
1.2.在代码中设置
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc]initWithType:@"item1" localizedTitle:@"Item1" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeAdd] userInfo:nil];
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc]initWithType:@"item2" localizedTitle:@"Item2" localizedSubtitle:nil icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLocation] userInfo:nil];
[UIApplication sharedApplication].shortcutItems = @[item1,item2];
当然如果你要同时设置它也认可,不过info.plist中的设置优先,相信很少有人这样干吧, 我就是个例外😁 ⬇⬇⬇
同时设置效果1.3 处理用户点击主屏幕按钮事件
用户点击之屏幕快捷功能启动应用,会掉AppDelegate 的一个方法,在方法内部处理即可
/**
* 如果用户通过点击主屏幕上的3DTouch快捷按钮进入应用程序会来到这个方法
*/
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
{
//-- 1 如果是用代码添加3DTouch的话 可以通过添加shortcutItem的type属性值来判断用户点击那个按钮,然后执行你自定义操作
//-- 2 如果是通过在plist文件中设置添加3DTouch,可以通过UIApplicationShortcutItemType的值来判断用户点击那个按钮,然后执行你自定义操作
NSLog(@"%@",shortcutItem.type);
}
2 给控件添加3DTouch功能
给控件添加3DTouch功能,调用当前控制器的方法,
[self registerForPreviewingWithDelegate:self sourceView:控件]
添加前必须判断设备是否支持
//-- 控件添加3DTouch功能 注意 必须要判断设备是否支持此功能
if ([self respondsToSelector:@selector(traitCollection)]) {
if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)])
{
if(self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable)
{
[self registerForPreviewingWithDelegate:self sourceView:cell];
}
}
}
遵守UIViewControllerPreviewingDelegate代理,在代理方法配置
在代理之前先说说3DTouch的3个阶段
- 用户轻轻按,控件周围变模糊 你不用参与
- 力度增加,会peek出视图,在第一代理方法中设置
- 力度继续增加,弹出控制器,在第二个带你方法设置
代理1 简单配置你将要显示的控制器就可以
/**
* 第二阶段回来到这个代理方法,手势力度递增 对你将要peek的控制器尽心设置
*/
- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location NS_AVAILABLE_IOS(9_0)
{
//-- 1 可以直接用sourceVIew获取cell location是你点击的那个点在这个cell坐标系中的位置
UITableViewCell * cell = (UITableViewCell *)[previewingContext sourceView];
NSString *title = cell.textLabel.text;
PeekVC *vc = [PeekVC new];
vc.showText = title;
// previewingContext.sourceRect = CGRectMake(550, 0, 10,10); 从哪里冒出来的
return vc;
}
属性介绍
previewingContext 可以理解为当前点击控件的一个上下文对象,它有一个sourceView属性,就是你点击的那个控件,还有一个sourceRect属性,这个兽性,官方文档,半天没有看懂,最后明白,你可以简单的理解为第一个代理方法执行完毕,将要执行peek,peek的view是从哪里跳出来的,可以从(0,0,0,0)或其他,只要你高兴。
Implement this method to return the preview view controller.
To indicate that a particular portion of the source view is responding to the user’s force touch, set the context object’s sourceRect property to the desired rectangle. For example, if the context object’s sourceView property is a table view, you can set the sourceRect property to the frame of the row indicated by the location parameter’s value. When the system presents the preview (peek), it appears to originate from the selected row.
You can disable preview by returning nil from this method.
代理2 更简单
/**
* 当你的手势力度继续增加的话,回来到第三阶段,可以设置将要显示的控制器,如果你不实现这个代理方法,则不会出现第三阶段
*/
- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit NS_AVAILABLE_IOS(9_0)
{
[self presentViewController:viewControllerToCommit animated:YES completion:nil];
}
好了,到这里你就完成了3DTouch功能了 附上代码
如果你想要实现类似系统短信那样,peek出来的时候上划可以快捷回复,不妨继续往下看
这个也就只需要实现一个方法就可以了,在上边的代理方法1中,有一个你配置的控制器,只需要在这个控制器中实现这个方法就可以
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
UIPreviewAction *action_01 = [UIPreviewAction actionWithTitle:@"Hello!" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"click Hello");
}];
UIPreviewAction *action_02 = [UIPreviewAction actionWithTitle:@"Hello22!" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"click Hello22");
}];
UIPreviewAction *action_03 = [UIPreviewAction actionWithTitle:@"Hello33!" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"click Hello33");
}];
UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"这是一组可选的操作" style:UIPreviewActionStyleDestructive actions:@[action_02, action_03]];
return @[action_01,actionGroup];
}
你可以在返回的数组中放三个UIPreviewAction,效果就是这样
IMG_3618.PNG当然你也可以放actionGroup进去,随心所欲,效果就是你点击那个组,进去又是一组按钮,
IMG_3619.PNG有不正之处,欢迎指出。
网友评论