一. 添加点击桌面icon的3DTouch,有两种添加方式 (最多添加4个item)
1.静态添加
例如:
先添加了一个UIApplicationShortcutItems的数组,这个数组中添加的元素就是对应的静态标签,在每个标签中我们需要添加一些设置的键值:
必填项(下面两个键值是必须设置的):
UIApplicationShortcutItemType 这个键值设置一个快捷通道类型的字符串
UIApplicationShortcutItemTitle 这个键值设置标签的标题
选填项(下面这些键值不是必须设置的) :
UIApplicationShortcutItemSubtitle 设置标签的副标题
UIApplicationShortcutItemIconType 设置标签Icon类型
UIApplicationShortcutItemIconFile 设置标签的Icon文件
UIApplicationShortcutItemUserInfo 设置信息字典(用于传值)
2.动态添加
在这个方法中 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 动态添加
例如:
#pragma mark - 3DTouch
- (void)create3DTouchActionShow:(BOOL)isShow
{
UIApplication *application = [UIApplication sharedApplication];
UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMessage];
UIApplicationShortcutItem *item1 = [[UIApplicationShortcutItem alloc] initWithType:@"1"
localizedTitle:@"发通知"
localizedSubtitle:nil
icon:icon1
userInfo:nil];
UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeMail];
UIApplicationShortcutItem *item2 = [[UIApplicationShortcutItem alloc] initWithType:@"2"
localizedTitle:@"发投票"
localizedSubtitle:nil
icon:icon2
userInfo:nil];
UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeLove];
UIApplicationShortcutItem *item3 = [[UIApplicationShortcutItem alloc] initWithType:@"3"
localizedTitle:@"我的班级"
localizedSubtitle:nil
icon:icon3
userInfo:nil];
UIApplicationShortcutIcon *icon4 = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay];
UIApplicationShortcutItem *item4 = [[UIApplicationShortcutItem alloc] initWithType:@"4"
localizedTitle:@"我的智云"
localizedSubtitle:nil
icon:icon4
userInfo:nil];
if (isShow) { // 这里的isShow是我用来判断账号有没有登录 (已经登录的话直接跳转到响应功能 没有登录的话 跳转到登录页面)
application.shortcutItems = @[item1, item2, item3, item4];
}else{
application.shortcutItems = @[];
}
}
添加完item后 需要实现点击item后的方法
- (void)application:(UIApplication *)application performActionForShortcutItem:(nonnull UIApplicationShortcutItem *)shortcutItem completionHandler:(nonnull void (^)(BOOL))completionHandler
例如:
- (void)application:(UIApplication *)application performActionForShortcutItem:(nonnull UIApplicationShortcutItem *)shortcutItem completionHandler:(nonnull void (^)(BOOL))completionHandler
{
// type 是item的唯一标示 可以用来判断点击的是哪个item 当然也可以用别的方式判断 title等
// case 里面的实现自己写 下面是举例的4个方法
NSString *itemType = shortcutItem.type;
switch (itemType.intValue) {
case 1:{
MyCreatViewController *mvc = [[MyCreatViewController alloc]init];
mvc.mark =@"1";//发通知
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:mvc];
[self.window.rootViewController presentViewController:nav animated:YES completion:nil];
}
break;
case 2:{
MyCreatViewController *mvc = [[MyCreatViewController alloc]init];
mvc.mark =@"2";//发投票
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:mvc];
[self.window.rootViewController presentViewController:nav animated:YES completion:nil];
}
break;
case 3:{
ClassManageViewController *cmvc = [[ClassManageViewController alloc] init];
cmvc.hidesBottomBarWhenPushed = YES;
UITabBarController *tab = (UITabBarController *)self.window.rootViewController;
tab.selectedIndex = 4;
UINavigationController *me = (UINavigationController *)tab.selectedViewController;
[me pushViewController:cmvc animated:YES];
}
break;
case 4:{
MyZhiYunViewController *mzy = [[MyZhiYunViewController alloc] init];
mzy.hidesBottomBarWhenPushed = YES;
UITabBarController *tab = (UITabBarController *)self.window.rootViewController;
tab.selectedIndex = 4;
UINavigationController *me = (UINavigationController *)tab.selectedViewController;
[me pushViewController:mzy animated:YES];
}
break;
}}
到这里,桌面的3DTouch就实现了
二. 如果想点击cell 实现预览效果
在tableview所在的viewController 遵守 UIViewControllerPreviewingDelegate 协议
if (cell == nil) {
cell = [[NotifyGroupCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
// 判断是否有压力感应 (就是看能不能实现3DTouch)
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
// 注册需要实现3DTouch的View
[self registerForPreviewingWithDelegate:self sourceView:cell];
}
然后实现两个手势 peek 和 pop peek就是预览 pop就是在peek的基础上再用力按实现的方法
// peek 手势
- (UIViewController *)previewingContext:(id<UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
// 得到用力按的cell的位置
NSIndexPath *indexPath = [_tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
// 返回的controller就是需要预览的controller 比如 点击cell后跳转到A 这里返回A就可以
UIViewController *A = [[UIViewController alloc] init];
return A;
}
// pop手势
- (void)previewingContext:(id<UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
NSIndexPath *indexPath = [_tableView indexPathForCell:(UITableViewCell *)[previewingContext sourceView]];
[self tableView:_tableView didSelectRowAtIndexPath:indexPath];
}
在controller A 的.m文件中实现一个方法 就是在预览A时上滑页面下面出现的选项
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
/*
UIPreviewActionStyleDefault 默认
UIPreviewActionStyleSelected 带对勾的
:UIPreviewActionStyleDestructive 红色的
*/
UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"me" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"me");
}];
UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"you" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"you");
}];
UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"him" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
NSLog(@"him");
}];
NSArray *actions = @[action1, action2, action3];
return actions;
}