iOS开发之 3D Touch

图片来自网络

前言

3D Touch为用户提供了全新维度上的交互,在支持3D Touch的设备上,用户可以改变手指的按压力度使设备做出不同的响应。

3D Touch的主要功能:
1、Home Screen Quick Actions
2、Peek & Pop
3、Force Properties

下面介绍如何将3D Touch应用到项目中。

一、Home Screen Quick Actions

这一功能是通过重按主屏幕的icon呼出一个菜单,快速定位到相应的功能,有静态集成和动态集成两种方法,也可以将两种方法混用。

静态集成

静态集成是在info.plist文件中添加相应的键值对,如下:


01.jpeg

属性:

  • UIApplicationShortcutItemTitle 标签名,必须
  • UIApplicationShortcutItemType 标签类型,可用于判断用户点击的标签,必须
  • UIApplicationShortcutItemSubtitle 副标题,可选
  • UIApplicationShortcutItemIconType 使用系统图标,可选
  • UIApplicationShortcutItemIconFile 使用boundle或者image asset catalog中的图片,35*35点,可选

动态集成

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool方法中添加:

if #available(iOS 9.0, *) {
    //这里使用系统图标
    let shortcutIcon = UIApplicationShortcutIcon.init(type: UIApplicationShortcutIconType.search)
    let shortcut1 = UIApplicationShortcutItem(type: "2", localizedTitle: "搜索", localizedSubtitle: nil, icon: shortcutIcon, userInfo: nil)
    //这里使用自己的图片,但由于不符合要求,在标签中变成了一坨黑色的东西- -
    let shortIcon2 = UIApplicationShortcutIcon.init(templateImageName: "lvtuicon")
    let shortcut2 = UIApplicationShortcutItem(type: "3", localizedTitle: "分享", localizedSubtitle: nil, icon: shortIcon2, userInfo: nil)
    UIApplication.shared.shortcutItems = [shortcut1, shortcut2]
    } else {
        // Fallback on earlier versions
}

处理点击事件的函数:

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    //也可以通过shortcutItem.localizedTitle判断
    switch shortcutItem.type {
    case "0":
        print("新消息")
        break
    case "1":
        print("写文章")
        break
    case "2":
        print("搜索")
        break
    case "3":
        print("分享")
        break
    default:
        break
    }
}

在这个函数中根据不同的选择进行相应的快速导航操作。
效果:


02.jpeg

二、Peek & Pop

在添加这个功能前要首先检测功能的可用性

self.traitCollection.forceTouchCapability == UIForceTouchCapability.available

下面以UITableView为例,很常规的创建一个UITableView。

  • 注册PreView功能

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
      cell.textLabel!.text = "indexPath:\((indexPath as NSIndexPath).row)"
      if self.traitCollection.forceTouchCapability == UIForceTouchCapability.available {
          self.registerForPreviewing(with: self, sourceView: cell)
      }
      return cell
    }
    
  • 实现UIViewControllerPreviewingDelegate方法

    //预览
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
      //在这个方法中可以通过previewingContext.sourceRect改变弹起视图的Rect
      //location: 点击的位置
      let nextView = NextViewController()
      return nextView
    }
    //commit
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
      //使用show方法commit会有个弹性效果
      self.showDetailViewController(viewControllerToCommit, sender: self)
    }
    

效果:


03.jpeg

04.jpeg
  • 添加Peek Quick Actions功能
    在要进入的ViewController中重写:

    override var previewActionItems : [UIPreviewActionItem] {
      let action1 = UIPreviewAction(title: "收藏", style: UIPreviewActionStyle.default) { (action, viewController) in
          print("收藏")
      }
      let action2 = UIPreviewAction(title: "喜欢", style: UIPreviewActionStyle.default) { (action, viewController) in
          print("喜欢")
      }
      return [action1, action2]
    }
    

效果:


05.jpeg

三、Force Properties

iOS9.0为UITouch增加了force等一系列属性和方法。
获取压力值:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
print("按压力度:(touch.force)")
}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容