iOS 3D touch开发(一) Home Screen Quick Actions

3D touch介绍

3D touch 是ios9+、iphone6s+的新功能,简单的说3Dtouch就是用力按压,通过3Dtouch增加了一组手势交互方式。

3D touch主要常见的使用:

  • 1:Home Screen Quick Actions (主屏快捷行为入口)
  • 2:peek and pop (预览和弹出)
  • 3:Force Properties (按压力度)
  • 4: Web view peek and pop API (HTML链接预览功能)

后面会逐一进行介绍,本文主要介绍Home Screen Quick Actions

1:Home Screen Quick Actions

在主屏用力按压app图标,可以弹出一个快捷菜单,可以直接进入app的某个功能。

文字和图片会因为app在主屏的位置(如左上或右下)决定弹出菜单的位置以及文字在左还是icon在左。

有两种方法可以实现Home Screen Quick Actions,一种是使用.plist文件静态声明,另一种是使用 UIApplicationShortcutItem 对象构造。 静态构造的quick actions可以在你的app第一次安装时候就有效果,而动态构造方法必须在第一次运行之后才能有效果,当然,好处就quick actions可以 随时更新和修改。

.plist文件静态声明实现Home Screen Quick Actions

参考官网说明

快速示例:

<key>UIApplicationShortcutItems</key>
 <array>
     <dict>
       <!--标题-->
       <key>UIApplicationShortcutItemTitle</key>
       <string>New Message</string>
       <!--副标题-->
       <key>UIApplicationShortcutItemSubtitle</key>
       <string>open-favorites</string>
       <!--使用系统图标类型-->
       <key>UIApplicationShortcutItemIconType</key>
       <string>UIApplicationShortcutIconTypeCompose</string>
       <!--  选项自定义icon-->
       <!-- <key>UIApplicationShortcutItemIconFile</key>
        <string></string>--><!-- icon文件的路径,必须使用项目内的资源文件 -->
       <!--  app应用标识-->
       <key>UIApplicationShortcutItemType</key>
       <string>com.mycompany.myapp.newmessage</string>
       <!--  可以用来传递一些数据-->
       <key>UIApplicationShortcutItemUserInfo</key>
       <dict>
         <key>key2</key>
         <string>value2</string>
       </dict>
     </dict>
     <dict>
       <key>UIApplicationShortcutItemIconFile</key>
       <string>open-favorites</string>
       <key>UIApplicationShortcutItemTitle</key>
       <string>Favorites</string>
       <key>UIApplicationShortcutItemType</key>
       <string>com.mycompany.myapp.openfavorites</string>
       <key>UIApplicationShortcutItemUserInfo</key>
       <dict>
         <key>key1</key>
         <string>value1</string>
       </dict>
     </dict>
   </array>

这里直接编辑plist的xml文件,增加了一个key,类型为dictnory,也可以手动添加,比较麻烦,还是xml简单。

完成后效果图:

UIApplicationShortcutItemIconType 这个key可以使用一些系统自定义的icon, 可选的类型的枚举如下,详细介绍和每个图片的样子可以参考这里

enum UIApplicationShortcutIconType : Int {
    case Compose
    case Play
    case Pause
    case Add
    case Location
    case Search
    case Share
    case Prohibit
    case Contact
    case Home
    case MarkLocation
    case Favorite
    case Love
    case Cloud
    case Invitation
    case Confirmation
    case Mail
    case Message
    case Date
    case Time
    case CapturePhoto
    case CaptureVideo
    case Task
    case TaskCompleted
    case Alarm
    case Bookmark
    case Shuffle
    case Audio
    case Update
}
OBJECTIVE-C
typedef enum UIApplicationShortcutIconType : NSInteger {
   UIApplicationShortcutIconTypeCompose,
   UIApplicationShortcutIconTypePlay,
   UIApplicationShortcutIconTypePause,
   UIApplicationShortcutIconTypeAdd,
   UIApplicationShortcutIconTypeLocation,
   UIApplicationShortcutIconTypeSearch,
   UIApplicationShortcutIconTypeShare,
   UIApplicationShortcutIconTypeProhibit,
   UIApplicationShortcutIconTypeContact,
   UIApplicationShortcutIconTypeHome,
   UIApplicationShortcutIconTypeMarkLocation,
   UIApplicationShortcutIconTypeFavorite,
   UIApplicationShortcutIconTypeLove,
   UIApplicationShortcutIconTypeCloud,
   UIApplicationShortcutIconTypeInvitation,
   UIApplicationShortcutIconTypeConfirmation,
   UIApplicationShortcutIconTypeMail,
   UIApplicationShortcutIconTypeMessage,
   UIApplicationShortcutIconTypeDate,
   UIApplicationShortcutIconTypeTime,
   UIApplicationShortcutIconTypeCapturePhoto,
   UIApplicationShortcutIconTypeCaptureVideo,
   UIApplicationShortcutIconTypeTask,
   UIApplicationShortcutIconTypeTaskCompleted,
   UIApplicationShortcutIconTypeAlarm,
   UIApplicationShortcutIconTypeBookmark,
   UIApplicationShortcutIconTypeShuffle,
   UIApplicationShortcutIconTypeAudio,
   UIApplicationShortcutIconTypeUpdate
} UIApplicationShortcutIconType;

如果不使用系统icon也可以使用UIApplicationShortcutItemIconFile这个key自定义,需要注意的是图片必须预先添加进项目,而不能使用网络路径

动态构造,利用UIApplicationShortcutItem实现Home Screen Quick Actions

看过了plish构造Home Screen Quick Actions后,对于动态构造也很容易理解,其实就是构造出一个或多个 UIApplicationShortcutItem 对象。 我们写一个方法来实现Home Screen Quick Actions


  //动态注册Home Screen Quick Actions
  func registHomeScreenQuickActions(){
    let item1 = UIApplicationShortcutItem(type: "com.mycompany.myapp.newmessage", localizedTitle: "title", localizedSubtitle: "subtitle", icon: UIApplicationShortcutIcon(type: .Home), userInfo: nil);
    // UIApplicationShortcutItem 代表一个item
    // type: 唯一标示符的属性
    // localizedTitle: 显示的标题
    // localizedSubtitle: 显示的二级标题
    // icon:显示的图片,可以自定义,也可以使用系统提供的样式
    // userInfo: 包含一些信息

    // 自定义的icon
    //icon:UIApplicationShortcutIcon(templateImageName: "like")
    UIApplication.sharedApplication().shortcutItems = [item1];
  }

然后我们在 didFinishLaunchingWithOptions方法中执行 registHomeScreenQuickActions() ,启动程序后就发现 quick actions 变成了3个

接收快速启动的参数

想要接收3d touch启动点击的选项和配置的上下文数据,可以在 AppDelegate 中实现委托 application performActionForShortcutItem

  //接收Home Screen Quick Actions启动参数
  func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {
      NSLog("%@", shortcutItem);
      if let userInfo = shortcutItem.userInfo {
        NSLog("userinfo:%@", userInfo);
      }
  }

我们来分别用2个菜单启动后,可以看到控制台输出的信息

2016-03-25 18:01:08.019 3DTouchDemo[4021:2518999] <UIApplicationShortcutItem: 0x136d34d90; type: com.mycompany.myapp.newmessage, title: New Message>
2016-03-25 18:01:08.030 3DTouchDemo[4021:2518999] userinfo:{
    key2 = value2;
}
2016-03-25 18:01:17.023 3DTouchDemo[4021:2518999] <UIApplicationShortcutItem: 0x136e20200; type: com.mycompany.myapp.openfavorites, title: Favorites>
2016-03-25 18:01:17.024 3DTouchDemo[4021:2518999] userinfo:{
    key1 = value1;
}

其他

最后在说一次,3D touch 是ios9+、iphone6s+的新功能,所以一般只能使用iphone6s以上机型,真机调试才会有效果。

ViewController里面有一个属性可以判断是否有3d touch功能

// 判断设备是否支持 3D Touch
if self.traitCollection.forceTouchCapability == UIForceTouchCapability.Available {
    print("支持")
} else {
    print("不支持")
}

不过有一个插件也可以用模拟器体验3d touch功能,需要安装一个插件SBShortcutMenuSimulator

使用方法我就不介绍了,在推荐阅读中的文章3D Touch开发初体验中最后有比较详细的介绍。

下一篇会介绍3d touch的另一个常用功能,peek and pop (预览和弹出)

demo

本文的demo下载

感谢收看,如果对大家有帮助,请github上follow和star,本文发布在刘彦玮的技术博客,转载请注明出处

推荐阅读

Loading Disqus comments...
Table of Contents