3D touch 静态、动态设置及进入APP的跳转方式

申明Quick Action有两种方式:静态和动态

静态是在info.plist文件中申明,动态则是在代码中注册,系统支持两者同时存在。

-系统限制每个app最多显示4个快捷图标,包括静态和动态

静态

在app的plist文件中增加如下申明:

<key>UIApplicationShortcutItems</key>

<array>

<dict>


    <key>UIApplicationShortcutItemIconType</key>

    <string>UIApplicationShortcutIconTypeSearch</string>


    <key>UIApplicationShortcutItemSubtitle</key>

    <string>shortcutSubtitle1</string>


    <key>UIApplicationShortcutItemTitle</key>

    <string>shortcutTitle1</string>


    <key>UIApplicationShortcutItemType</key>

    <string>First</string>


    <key>UIApplicationShortcutItemUserInfo</key>

    <dict>

    <key>firstShorcutKey1</key>

    <string>firstShortcutKeyValue1</string>

   </dict>


</dict>

</array>



UIApplicationShortcutItemType:其实是快捷方式的id,唯一标签

UIApplicationShortcutItemTitle:标题

UIApplicationShortcutItemSubtitle:副标题

UIApplicationShortcutItemIconType:图标

UIApplicationShortcutItemIconFile: 自定义图标,上面IconType定义将被忽略。图标格式35x35像素单色。

UIApplicationShortcutItemUserInfo:额外信息

系统自带图标的样式分别是:

UIApplicationShortcutIconTypeCompose,

    UIApplicationShortcutIconTypePlay,

    UIApplicationShortcutIconTypePause,

    UIApplicationShortcutIconTypeAdd,

    UIApplicationShortcutIconTypeLocation,

    UIApplicationShortcutIconTypeSearch,

    UIApplicationShortcutIconTypeShare,

    UIApplicationShortcutIconTypeProhibit       NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeContact        NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeHome           NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeMarkLocation   NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeFavorite       NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeLove           NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeCloud          NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeInvitation     NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeConfirmation   NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeMail           NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeMessage        NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeDate           NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeTime           NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeCapturePhoto   NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeCaptureVideo   NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeTask           NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeTaskCompleted  NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeAlarm          NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeBookmark       NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeShuffle        NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeAudio          NS_ENUM_AVAILABLE_IOS(9_1),

    UIApplicationShortcutIconTypeUpdate         NS_ENUM_AVAILABLE_IOS(9_1)

NS_ENUM_AVAILABLE_IOS(9_1)  有这个的是在9.1 系统后才支持的,注意下哈。

 

 

上面的看不懂,没关系,照着下面的图打,就行。

我打的时候,没提示,打错一个字母就没效果。

实际效果:

 


 

 

 

 

动态

UIApplication对象多了一个支持快捷方式的数组

@property(nonatomic, copy) NSArray <UIApplicationShortcutItem *> *shortcutItems



如果需要增加快捷方式,可以赋值给shortcutItems属性。

如果静态和动态方式同时使用的话,赋值的时候也不会覆盖静态方式申明的快捷方式,不用担心。

UIApplicationShortcutItem对象init方法

(instancetype)initWithType:(NSString *)type 

      localizedTitle:(NSString *)localizedTitle

   localizedSubtitle:(NSString *)localizedSubtitle

                icon:(UIApplicationShortcutIcon *)icon

            userInfo:(NSDictionary *)userInfo`



各个字段跟上面静态方式申明的时候意义一样。

其中定义快捷方式图标UIApplicationShortcutIcon,有3种init方法:

`

// 根据系统预置图标类型

-(instancetype)iconWithType:(UIApplicationShortcutIconType)type


// 根据app bundle里面的图标名称自定义

-(instancetype)iconWithTemplateImageName:(NSString *)templateImageName


// 根据通讯录联系人名称

-(instancetype)iconWithContact:(CNContact *)contact`




// 下面demo, 可以直接复制进入application.m 里使用

//快捷方式响应方法

- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED{

/*   //这是我的demo里面的控制器 跳转方法, 原理就是根据shortcutItem.type 判断跳转页面

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    ViewController *mainView = [storyboard instantiateViewControllerWithIdentifier:@"mainController"];

    UINavigationController *mainNav = [[UINavigationController alloc] initWithRootViewController:mainView];

    self.window.rootViewController = mainNav;

    [self.window makeKeyAndVisible];

   

    //判断先前我们设置的快捷选项标签唯一标识,根据不同标识执行不同操作

    if([shortcutItem.type isEqualToString:@"Video"  ]){

        VideoViewController *videoVC= [VideoViewController new];

        [self.window.rootViewController presentViewController:videoVC animated:YES completion:^{

        }];

    } else if ([shortcutItem.type isEqualToString:@"PIC"]) {

        PICViewController *picVC = [PICViewController new];

        [mainNav pushViewController:picVC animated:NO];

    } else if ([shortcutItem.type isEqualToString:@"NEW"]) {

        NewViewController *newVC = [NewViewController new];

        [mainNav pushViewController:newVC animated:NO];

    }



    if (completionHandler) {

        completionHandler(YES);

    }

   */

   

   // 打印userInfo (传值用)  type(这是快捷方式的唯一标签,根据它的返回值进行判断,在执行需要的操作)

    NSLog(@"userInfo %@ type %@",shortcutItem.userInfo,shortcutItem.type);

   

}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Override point for customization after application launch.

    //代码的方式添加快捷方式 动态

    if (application.shortcutItems.count==0) {

        //

        UIMutableApplicationShortcutItem *shortItem1=[[UIMutableApplicationShortcutItem alloc] initWithType:@"UIApplicationShortcutIconTypePlay" localizedTitle:@"段子" localizedSubtitle:@"进入段子" icon:[UIApplicationShortcutIcon iconWithType: UIApplicationShortcutIconTypePlay]userInfo:@{@"firstShortcutKey1":@"fristShorcut"}];

        UIMutableApplicationShortcutItem *shortItem2=[[UIMutableApplicationShortcutItem alloc] initWithType:@"UIApplicationShortcutIconTypePlay" localizedTitle:@"视频" localizedSubtitle:@"进入视频" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePause] userInfo:@{@"firstShortcutKey1":@"secondShorcut"}];

         UIMutableApplicationShortcutItem *shortItem3=[[UIMutableApplicationShortcutItem alloc] initWithType:@"UIApplicationShortcutIconTypePlay" localizedTitle:@"图片" localizedSubtitle:@"进入图片" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePause] userInfo:@{@"firstShortcutKey1":@"thridShorcut"}];

         UIMutableApplicationShortcutItem *shortItem4=[[UIMutableApplicationShortcutItem alloc] initWithType:@"UIApplicationShortcutIconTypePlay" localizedTitle:@"资讯" localizedSubtitle:@"进入资讯" icon:[UIApplicationShortcutIcon iconWithType:UIApplicationShortcutIconTypePause] userInfo:@{@"firstShortcutKey1":@"fiveShorcut"}];

       

        application.shortcutItems=@[shortItem1,shortItem2,shortItem3,shortItem4];

       

    }

    return YES;

}

 

测试效果如下:

 最后一个小点: APP 图标在屏幕的哪侧,快捷方式就在哪侧。

 右边


 

左边:


原文链接:http://www.cnblogs.com/DafaRan/p/5949169.html

本人在开发时候的一些问题:

1:图片在自定义添加的时候需要写到项目内文件内,写入bundle的话无法读取到。

2:在事件响应的时候需要给系统设置个延迟,哪怕是0.01,否则无法获取到tabbar的内容,并且也得不到返回的层,返回不了。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

         });


3:在跳VC时适当使用present或push两种方法的选择。

其他内容后需补充

猜你喜欢

转载自blog.csdn.net/y2888886/article/details/53392861
今日推荐