zoukankan      html  css  js  c++  java
  • 3D touch 的 应用 --备用

    在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch技术。3D Touch的触控技术,被苹果称为新一代多点触控技术。其实,就是此前在Apple Watch上采用的Force Touch,屏幕可感应不同的感压力度。

    iOS9提供了四类API( Home Screen Quick Action 、 UIKit Peek & Pop、 WebView Peek & Pop 和 UITouch Force Properties )用于操作3D Touch。不过无论使用哪一种API,首先需要做的事情是检查3D Touch是否可用。 

    检测是否支持3D Touch

    在iOS9中提供如下的接口用于检查设备是否支持3D Touch:

    @property(nonatomic, readonly) UIForceTouchCapability forceTouchCapability;

    其中 UIForceTouchCapability 是一个枚举类型,具体的描述情况如下: 

    • UIForceTouchCapability 
      • UIForceTouchCapabilityUnknown //3D Touch检测失败
      • UIForceTouchCapabilityUnavailable //3D Touch不可用
      • UIForceTouchCapabilityAvailable //3D Touch可用

    这3个枚举值就是我们来判断设备是否开启3D Touch功能,可以在UIViewController生命周期的viewWillAppear中做如下判断:

    if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
      //do something
    }

    当然在生命周期内,如果用户有意修改了设备的3D Touch功能,我们还有一个地方来重新检测:

    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
      //do something
    }

    Home Screen Quick Action

    在iPhone 6s或者iPhone 6s Plus上面,当用户按压App的Icon图标的时候,会弹出Quick Action,当用户选择其中的Action的时候,App会启动并实现相应的功能。这一过程相当于在PC上面的右键快捷菜单的功能,如下图所示的效果:

    开发环境

    官方文档上指出Xcode7.0以上的模拟器不支持3D Touch,必须使用支持3D Touch的设备(iPhone 6s或者iPhone 6s Plus)进行调试。但是这并不能阻止我们在模拟器上面进行调试,GitHub上面早有大神提供了模拟器调试Quick Action的方法,项目的地址是: https://github.com/DeskConnect/SBShortcutMenuSimulator 。下面简单介绍一下安装的步骤: 

    ①编译

    git clone https://github.com/DeskConnect/SBShortcutMenuSimulator.git
    cd SBShortcutMenuSimulat
    make

    ②让SpringBoard支持SBShortcutMenuSimulator

    在开启模拟器的情况下,在SBShortcutMenuSimulator目录下面执行如下两行命令:

    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

    ③预览效果

    echo 'com.apple.mobilecal' | nc 127.0.0.1 8000 ,其中com.apple.mobilecal指的是系统自带的日历的Bundle ID,运行的时候替换成你的应用的Bundle ID即可。 

    创建方式

    上面的示例图中有四个Action Item,其中每个Action是使用UIApplicationShortcutItem这个对象进行描述的,下面列出每一个UIApplicationShortcutItem中能够包含的信息:

    创建Quick Action有两种方式:静态和动态

    ①以静态方式创建

    静态创建的方式是在Info.plist文件中进行声明的

    <key>UIApplicationShortcutItems</key>
    <array>
      <dict>
          <key>UIApplicationShortcutItemType</key>
          <string>com.devzeng.homePage</string>
          <key>UIApplicationShortcutItemTitle</key>
          <string>首页</string>
          <key>UIApplicationShortcutItemSubtitle</key>
          <string>这是首页</string>
          <key>UIApplicationShortcutItemIconFile</key>
          <string>icon_home.png</string>
          <key>UIApplicationShortcutItemUserInfo</key>
          <dict>
              <key>scheme</key>
              <string>devzeng://home</string>
          </dict>
      </dict>
      <dict>
          <key>UIApplicationShortcutItemType</key>
          <string>com.devzeng.about</string>
          <key>UIApplicationShortcutItemTitle</key>
          <string>关于我们</string>
          <key>UIApplicationShortcutItemSubtitle</key>
          <string>这是关于我们</string>
          <key>UIApplicationShortcutItemIconFile</key>
          <string>icon_about.png</string>
          <key>UIApplicationShortcutItemUserInfo</key>
          <dict>
              <key>scheme</key>
              <string>devzeng://about</string>
          </dict>
      </dict>
    </array>

    ②以动态方式创建

    动态创建是在程序初始化的时候用代码动态添加。 UIApplication 对象多了一个支持快捷方式的数组(shortcutItems), 如果需要增加快捷方式,可以赋值给shortcutItems属性。 

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

    示例代码如下:

    //创建ShortcutItem
    UIApplicationShortcutIcon *icon1 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_register.png"];//创建快捷item的icon即UIApplicationShortcutItemIconFile
    NSDictionary *info1 = @{@"scheme":@"devzeng://register"};//创建快捷item的userinfo即UIApplicationShortcutItemUserInfo
    UIMutableApplicationShortcutItem *item1 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.registerPage" localizedTitle:@"注册" localizedSubtitle:@"注册新用户" icon:icon1 userInfo:info1];
    //创建ShortcutItem
    UIApplicationShortcutIcon *icon2 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_shop.png"];
    NSDictionary *info2 = @{@"scheme":@"devzeng://shop"};
    UIMutableApplicationShortcutItem *item2 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.shopPage" localizedTitle:@"购物车" localizedSubtitle:@"查看购物车" icon:icon2 userInfo:info2];
    //创建ShortcutItem
    UIApplicationShortcutIcon *icon3 = [UIApplicationShortcutIcon iconWithTemplateImageName:@"icon_help.png"];
    NSDictionary *info3 = @{@"scheme":@"devzeng://help"};
    UIMutableApplicationShortcutItem *item3 = [[UIMutableApplicationShortcutItem alloc] initWithType:@"com.devzeng.helpPage" localizedTitle:@"帮助" localizedSubtitle:@"帮助手册" icon:icon3 userInfo:info3];
    //注册ShortcutItem
    [UIApplication sharedApplication].shortcutItems = items;

    说明:

    1)系统限制每个App最多能够显示4个Action Item,其中包括静态方式和动态方式进行创建的;

    2)如果静态和动态方式同时使用的时候,给UIApplication的shortcutItems赋值的时候不会覆盖

    响应回调

    当app在后台的时候UIApplication提供了一个回调方法

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

    我们依据这个回调中的shortcutItem的type和userinfo来做出不同的事件处理,而最后的completionHandler在API的说明中我们看到当应用并非在后台,而是直接重新开进程的时候,直接返回No,那么这个时候,我们的回调会放在

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

    UIApplication又给我们一个从launchOptions中获取这个shortcutItem的key(UIApplicationLaunchOptionsShortcutItemKey)

    UIApplicationShortcutItem *item = [launchOptions valueForKey:UIApplicationLaunchOptionsShortcutItemKey];
    //根据不同的Action响应不同的事件

    在performActionForShortcutItem回调中

    - (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void(^)(BOOL succeeded))completionHandler {
        if (shortcutItem) {
            //根据不同的Action响应不同的事件
        }
        if (completionHandler) {
            completionHandler(YES);
        }
    }



    本文出自 http://www.tuicool.com/articles/iiqEJ3N 感谢!
  • 相关阅读:
    [leetcode]Merge Intervals
    ffmpeg错误隐藏框架分析
    [置顶] Hash查找,散列查找
    VS2008LINK : fatal error LNK1000: Internal error during IncrBuildImage
    HDU1257:最少拦截系统(LIS)
    ubuntu系统使用dnw下载程序
    ubuntu系统使用minicom终端操作说明
    uboot显示logo的方式
    在XC2440的uboot中挂载U盘,利用FAT文件系统读写U盘文件
    不知道黑片,千万别说你懂“U盘”-解读Nand Flash
  • 原文地址:https://www.cnblogs.com/isItOk/p/5155237.html
Copyright © 2011-2022 走看看