iOS系统3DTouch全解析

719 阅读1分钟

出处

动态添加比较快、稳


-(void)touch3D
{
    if (@available(iOS 9.0, *)) {
        UIApplicationShortcutIcon *searchShortcutIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypeSearch];
        
        UIApplicationShortcutItem *searchShortcutItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.liupeng.search" localizedTitle:@"Search" localizedSubtitle:@"Search Subtitle" icon:searchShortcutIcon userInfo:nil];
        
        UIApplicationShortcutIcon *playShortcutIcon = [UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePlay];
        UIApplicationShortcutItem *playShortcutItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.liupeng.play" localizedTitle:@"Play" localizedSubtitle:@"Play Subtitle" icon:playShortcutIcon userInfo:nil];
        
        UIApplicationShortcutIcon *qrShortcutIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_QR"];
        UIApplicationShortcutItem *qrShortcutItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.liupeng.qr" localizedTitle:@"QR" localizedSubtitle:@"QR Subtitle" icon:qrShortcutIcon userInfo:nil];
        
        UIApplicationShortcutIcon *payShortcutIcon = [UIApplicationShortcutIcon iconWithTemplateImageName:@"shortcut_pay"];
        UIApplicationShortcutItem *payShortcutItem = [[UIApplicationShortcutItem alloc] initWithType:@"com.liupeng.pay" localizedTitle:@"Pay" localizedSubtitle:@"Pay Subtitle" icon:payShortcutIcon userInfo:nil];
        
        [UIApplication sharedApplication].shortcutItems = @[searchShortcutItem, playShortcutItem, qrShortcutItem, payShortcutItem];
    } else {
        // Fallback on earlier versions
    }
   
    
}

//3DTouch回掉
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler
API_AVAILABLE(ios(9.0)){
    
    if ([shortcutItem.type isEqualToString:@"com.liupeng.search"])
    {
        // do something ...
        NSLog(@"com.liupeng.search");
    }
    else if ([shortcutItem.type isEqualToString:@"com.liupeng.play"])
    {
        // do something ...
        NSLog(@"com.liupeng.play");
    }
    // ...
}

自定义图标

系统图标

//// 使用系统提供的图标
        //+ (instancetype)iconWithType:(UIApplicationShortcutIconType)type;
        
        // 自定义图标
        //+ (instancetype)iconWithTemplateImageName:(NSString *)templateImageName;
        // 自定义图标需要使用镂空图标,同时建议1倍图标大小为35*35

需要实现Peek & Pop交互的控件所在的控制器遵守

<UIViewControllerPreviewingDelegate>
控件对象:[self registerForPreviewingWithDelegate:self sourceView:label];

peer时的回掉

- (nullable UIViewController *)previewingContext:(id <UIViewControllerPreviewing>)previewingContext viewControllerForLocation:(CGPoint)location
{
   // previewingContext.sourceView: 触发Peek & Pop操作的视图
   // previewingContext.sourceRect: 设置触发操作的视图的不被虚化的区域

   DetailViewController *detailVC = [[DetailViewController alloc] init];

   // 预览区域大小(可不设置)
   detailVC.preferredContentSize = CGSizeMake(0, 300);

   return detailVC;
}

pop时的回掉

- (void)previewingContext:(id <UIViewControllerPreviewing>)previewingContext commitViewController:(UIViewController *)viewControllerToCommit
{
   [self.navigationController pushViewController:viewControllerToCommit animated:YES];
}
 

额外选项

在Peek时希望提供一些快捷选项,需要在DetailViewController中重写previewActionItems的getter方法

// peek时的额外选项
- (NSArray<id<UIPreviewActionItem>> *)previewActionItems
{
    UIPreviewAction *action1 = [UIPreviewAction actionWithTitle:@"选项一" style:UIPreviewActionStyleDefault handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewAction *action2 = [UIPreviewAction actionWithTitle:@"选项二" style:UIPreviewActionStyleSelected handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewAction *action3 = [UIPreviewAction actionWithTitle:@"选项三" style:UIPreviewActionStyleDestructive handler:^(UIPreviewAction * _Nonnull action, UIViewController * _Nonnull previewViewController) {
        
    }];
    
    UIPreviewActionGroup *actionGroup = [UIPreviewActionGroup actionGroupWithTitle:@"选项组" style:UIPreviewActionStyleDefault actions:@[action1, action2]];
    
    return @[action1, action2, action3, actionGroup];
}