iOS 3D Touch開發(fā)(完整埋涧、詳細(xì)版)

一、3D Touch 簡(jiǎn)介

在iOS 9中奇瘦,新 iPhone 將第三維度添加到了用戶界面棘催。

  • 用戶現(xiàn)在可以用力摁下主屏按鈕來快速調(diào)出應(yīng)用提供的功能菜單。
  • 在應(yīng)用中耳标,用戶現(xiàn)在可以用力摁下視圖以查看更多內(nèi)容的預(yù)覽并且快速訪問一些功能巧鸭。
Home Screen Quick Actions

本文主要講解 3D Touch 各種場(chǎng)景下的開發(fā)方法,開發(fā)主屏幕應(yīng)用 icon 上的快捷選項(xiàng)標(biāo)簽(Home Screen Quick Actions)麻捻,靜態(tài)設(shè)置 UIApplicationShortcutItem 纲仍,動(dòng)態(tài)添加 UIApplicationShortcutItem呀袱,以及 Peek 和 Pop 的實(shí)現(xiàn)。

二郑叠、Home Screen Quick Actions

添加Home Screen Quick Actions有兩種方式:
1夜赵、通過Plist文件靜態(tài)設(shè)置;
2乡革、通過代碼動(dòng)態(tài)添加寇僧。

兩種方法的區(qū)別在于:通過Plist設(shè)置無需運(yùn)行程序,也就是說在下載App后沸版,不需要打開應(yīng)用嘁傀,就可以即可喚出Home Screen Quick Actions;而通過代碼動(dòng)態(tài)添加的视粮,必須在第一次下載后打開App细办,才能出現(xiàn)Home Screen Quick Actions。

1. 通過Plist文件靜態(tài)設(shè)置

在應(yīng)用的 Info.plist 文件中添加UIApplicationShortcutItems數(shù)組蕾殴。
數(shù)組中添加字典笑撞,如下圖所示:

Info.plist文件配置

其中,字典的Key有以下選項(xiàng):

名稱 說明 是否必須
UIApplicationShortcutItemTitle 標(biāo)簽的標(biāo)題 必填
UIApplicationShortcutItemType 標(biāo)簽的唯一標(biāo)識(shí) 必填
UIApplicationShortcutItemIconType 使用系統(tǒng)圖標(biāo)的類型钓觉,如搜索茴肥、定位、home等 可選
UIApplicationShortcutItemIconFile 使用項(xiàng)目中的圖片作為標(biāo)簽圖標(biāo) 可選
UIApplicationShortcutItemSubtitle 標(biāo)簽副標(biāo)題 可選
UIApplicationShortcutItemUserInfo 字典信息荡灾,如傳值使用 可選

第一個(gè)圖片使用系統(tǒng)自帶的瓤狐,第二個(gè)是使用Assets.xcassets文件夾中的圖片,當(dāng)完成設(shè)置后批幌,效果如下:

通過Plist文件靜態(tài)設(shè)置
2. 通過代碼動(dòng)態(tài)添加
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
     let item1 = UIApplicationShortcutItem(type: "2", localizedTitle: "code add item1", localizedSubtitle: "code add subtitle", icon: UIApplicationShortcutIcon(templateImageName: "shortcut_scorecard"), userInfo: nil)
     let item2 = UIApplicationShortcutItem(type: "3", localizedTitle: "code add item2", localizedSubtitle: nil, icon: UIApplicationShortcutIcon(type: .add), userInfo: nil)
        
     application.shortcutItems = [item1, item2]
     return true
}

效果如下:

通過代碼動(dòng)態(tài)添加

注意:目前Home Screen Quick Actions最多只能添加4個(gè)芬首。
無論用哪種方式添加,當(dāng)點(diǎn)擊item后逼裆,都會(huì)調(diào)用AppDelegate中的application(_:performActionFor:completionHandler:)方法:

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
     print(shortcutItem.type) // 通過type來判斷是點(diǎn)擊了哪一個(gè)按鈕
}

三郁稍、Peek and Pop(預(yù)覽與跳轉(zhuǎn))

  • Peek:輕按,屏幕視圖就會(huì)過渡到Peek胜宇,一個(gè)你設(shè)置的用來展示更多內(nèi)容的視圖-就像Mail app做的一樣耀怜。如果用戶這時(shí)結(jié)束了觸碰,Peek就會(huì)消失并且應(yīng)用回到交互開始之前的狀態(tài)桐愉。當(dāng)你用力按下屏幕按到一定程度時(shí)财破,系統(tǒng)會(huì)彈出一個(gè)預(yù)覽視圖,這個(gè)過程就稱之為Peek从诲。
  • Pop:或者這個(gè)時(shí)候左痢,用戶可以在peek界面上更用力按下來跳轉(zhuǎn)到使用peek呈現(xiàn)的視圖,這個(gè)過渡動(dòng)畫會(huì)使用系統(tǒng)提供的pop過渡。pop出來的視圖會(huì)填滿你應(yīng)用的根視圖并顯示一個(gè)返航按鈕可以回到交互開始的地方。再用力按下去就會(huì)展開到預(yù)覽視圖的控制器俊性,這過程就是Pop略步。

實(shí)現(xiàn)步驟:

  1. 注冊(cè)預(yù)覽代理
// Registers a view controller to participate with 3D Touch preview (peek) and commit (pop).
@available(iOS 9.0, *)
// 第一個(gè)參數(shù):代理
// 第二個(gè)參數(shù):哪個(gè)view執(zhí)行Peek
open func registerForPreviewing(with delegate: UIViewControllerPreviewingDelegate, sourceView: UIView) -> UIViewControllerPreviewing
  1. 遵守協(xié)議:UIViewControllerPreviewingDelegate
  2. 實(shí)現(xiàn)協(xié)議方法
// If you return nil, a preview presentation will not be performed
@available(iOS 9.0, *)
public func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
@available(iOS 9.0, *)
public func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController)

接下來用一個(gè)tableView的例子??來說明,實(shí)現(xiàn)以下效果:



代碼如下:

import UIKit

class ViewController: UIViewController {
    
    fileprivate lazy var array = [String]()
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        for i in 0...20 { array.append("第\(i)行") }
        // 注冊(cè)Cell
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        // 判斷系統(tǒng)版本定页,必須iOS 9及以上趟薄,同時(shí)檢測(cè)是否支持觸摸力度識(shí)別
        if #available(iOS 9.0, *), traitCollection.forceTouchCapability == .available {
            // 注冊(cè)預(yù)覽代理,self監(jiān)聽典徊,tableview執(zhí)行Peek
            registerForPreviewing(with: self, sourceView: tableView)
        }
    }
}

// MARK: - UITableViewDataSource
extension ViewController: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return array.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
        cell.textLabel?.text = array[indexPath.row]
        return cell
    }
}

// MARK: - UIViewControllerPreviewingDelegate
@available(iOS 9.0, *)
extension ViewController: UIViewControllerPreviewingDelegate {
    
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        // 模態(tài)彈出需要展現(xiàn)的控制器
        showDetailViewController(viewControllerToCommit, sender: nil)
        // 通過導(dǎo)航欄push需要展現(xiàn)的控制器
        // show(viewControllerToCommit, sender: nil)
    }
    
    func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        // 獲取indexPath和cell
        guard let indexPath = tableView.indexPathForRow(at: location), let cell = tableView.cellForRow(at: indexPath) else { return nil }
        // 設(shè)置Peek視圖突出顯示的frame
        previewingContext.sourceRect = cell.frame
        let vc = DetalViewController()
        // 返回需要彈出的控制權(quán)
        return vc
    }
}

在實(shí)際開發(fā)中杭煎,你可能會(huì)用到 UIView中的坐標(biāo)轉(zhuǎn)換 的幾個(gè)方法(可跳過不看):

// 將像素point由point所在視圖轉(zhuǎn)換到目標(biāo)視圖view中,返回在目標(biāo)視圖view中的像素值
open func convert(_ point: CGPoint, to view: UIView?) -> CGPoint
// 例如:point2 = view1.convert(point1, toView: view2):把point1從view1的坐標(biāo)系中卒落,轉(zhuǎn)換到view2的坐標(biāo)系中

// 將像素point從view中轉(zhuǎn)換到當(dāng)前視圖中羡铲,返回在當(dāng)前視圖中的像素值
open func convert(_ point: CGPoint, from view: UIView?) -> CGPoint
// 例如:point2 = view1.convert(point1, from: view2):把point1從view2的坐標(biāo)系中,轉(zhuǎn)換到view1的坐標(biāo)系中

// 將rect由rect所在視圖轉(zhuǎn)換到目標(biāo)視圖view中儡毕,返回在目標(biāo)視圖view中的rect
open func convert(_ rect: CGRect, to view: UIView?) -> CGRect
// 例如:rect2 = view1.convert(rect1, toView: view2):把rect1從view1的坐標(biāo)系中也切,轉(zhuǎn)換到view2的坐標(biāo)系中

// 將rect從view中轉(zhuǎn)換到當(dāng)前視圖中,返回在當(dāng)前視圖中的rect
open func convert(_ rect: CGRect, from view: UIView?) -> CGRect
// 例如:rect2 = view1.convert(rect1, toView: view2):把rect1從view2的坐標(biāo)系中妥曲,轉(zhuǎn)換到view1的坐標(biāo)系中

四、Peek快速選項(xiàng)

如果用戶一直保持觸摸钦购,可以向上滑動(dòng)Peek視圖檐盟,系統(tǒng)會(huì)展示出你預(yù)先設(shè)置和peek關(guān)聯(lián)的peek快速選項(xiàng)。
每一項(xiàng)peek快速選項(xiàng)都是你應(yīng)用中的深度鏈接押桃。當(dāng)peek快速選項(xiàng)出現(xiàn)后葵萎,用戶可以停止觸摸而且peek會(huì)停留在屏幕中。用戶可點(diǎn)擊一個(gè)快速選項(xiàng)唱凯,喚出相關(guān)鏈接羡忘。


在本例中,實(shí)現(xiàn)以上效果磕昼,只需要在DetalViewController中添加以下代碼即可:

import UIKit

class DetalViewController: UIViewController {
    
    @available(iOS 9.0, *)
    lazy var previewActions: [UIPreviewActionItem] = {
        let a = UIPreviewAction(title: "這是一個(gè)default按鈕", style: .default, handler: { (action, vc) in
            // 這里實(shí)現(xiàn)點(diǎn)擊按鈕事件處理
        })
        let b = UIPreviewAction(title: "這是一個(gè)destructive按鈕", style: .destructive, handler: { (action, vc) in
            // 這里實(shí)現(xiàn)點(diǎn)擊按鈕事件處理
        })
        return [a, b]
    }()
    
    @available(iOS 9.0, *)
    override var previewActionItems: [UIPreviewActionItem] {
        return previewActions
    }
}

最后注意:以上全部功能必須要求為 iPhone 6s 及以上機(jī)型卷雕,并且是 iOS 9 及以上,才有效果票从,模擬器可以看到效果漫雕,不需要安裝任何插件,但必須要有觸摸盤才行峰鄙,在觸摸盤上的點(diǎn)擊就是3D Touch浸间。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吟榴,隨后出現(xiàn)的幾起案子魁蒜,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兜看,死亡現(xiàn)場(chǎng)離奇詭異锥咸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铣减,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門她君,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葫哗,你說我怎么就攤上這事缔刹。” “怎么了劣针?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵校镐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我捺典,道長(zhǎng)鸟廓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任襟己,我火速辦了婚禮引谜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擎浴。我一直安慰自己员咽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布贮预。 她就那樣靜靜地躺著贝室,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仿吞。 梳的紋絲不亂的頭發(fā)上滑频,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音唤冈,去河邊找鬼峡迷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛你虹,可吹牛的內(nèi)容都是我干的凉当。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼售葡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼看杭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挟伙,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤楼雹,失蹤者是張志新(化名)和其女友劉穎模孩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贮缅,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榨咐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谴供。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片块茁。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桂肌,靈堂內(nèi)的尸體忽然破棺而出数焊,到底是詐尸還是另有隱情,我是刑警寧澤崎场,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布佩耳,位于F島的核電站,受9級(jí)特大地震影響谭跨,放射性物質(zhì)發(fā)生泄漏干厚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一螃宙、第九天 我趴在偏房一處隱蔽的房頂上張望蛮瞄。 院中可真熱鬧谆扎,春花似錦挂捅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)周瞎。三九已至苗缩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間声诸,已是汗流浹背酱讶。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彼乌,地道東北人泻肯。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像慰照,于是被迫代替她去往敵國(guó)和親灶挟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 關(guān)于這篇文章 由于iPhone 6S發(fā)布不到一年的時(shí)間毒租,很多新特性稚铣、新技術(shù)還未普遍,不管是3D Touch的...
    Tangentw閱讀 4,497評(píng)論 8 18
  • 3D Touch 給iOS9的用戶一個(gè)維度的交互。在支持的設(shè)備上惕医,人們能夠在主屏幕界面通過按壓應(yīng)用程序圖標(biāo)耕漱,快速的...
    Jack__yang閱讀 596評(píng)論 0 2
  • 前言 關(guān)于3D touch蘋果官方文檔是這么開始介紹的: 大意如下:iOS9開始,所有新的手機(jī)都增加了一個(gè)三維的用...
    VV木公子閱讀 2,229評(píng)論 3 39
  • iOS 9設(shè)計(jì)規(guī)范 中文版 完整版譯者注:本文譯自蘋果官方人機(jī)界面指南 iOS Human Interface G...
    海寧Hennie閱讀 13,281評(píng)論 2 60
  • 專著:http://www.reibang.com/p/3443a3b27b2d 1.簡(jiǎn)單的介紹一下3D Touc...
    violafa閱讀 1,016評(píng)論 1 0