亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swift玩轉3DTouch之Peek&Pop

2019-11-14 17:52:41
字體:
來源:轉載
供稿:網友

什么是3D Touch

3D Touch 是iOS9之后專為 iphone6s 機型加入的新特性,這一新技術移植于 Mac Book 上的 ForceTouch 更準確地說應該是 ForceTouch 在iPhone 上的實現吧。3D Touch 實質是一種新型的快捷單點觸控技術,在同一個點上通過不同的壓力感應觸發一種預覽行為。

在具體實現來說,3D Touch 包括以下三個技術內容:

  • Peek - 輕壓項目彈出預覽窗口
  • Pop - Peek 觸發之后再加力按壓預覽窗口彈出詳情窗口(相當于iOS 內的 Show Detail 行為)
  • application shortcut - 當輕壓 App 圖標時彈出的快捷菜單項

當初在看WWDC之時覺得這是一個很Cool的技術,也是成為促使人們購買6s的一大理由,本以為在軟件實現上會比較麻煩,但在iOS9新的SDK中這一技術實現之簡單實在令我有點小興奮。在蘋果的開發者網站上雖然有3D Touch 的3D Touch 的示例代碼,是一個用 UITableView 實現的一個完整示例,但這個示例過于復雜大多數代碼都是用于處理 UITableView 的,這樣反而掩蓋了 3D Touch 實現的細節。特此,我重新寫了一個更加簡單的示例,旨在將展示如何一步步來實現 3D Touch 的功能。

Interface Builder 支持

與 Xcode 6 相比 Xcode 7 的可視化編程能力有了很大幅度的提高,至少有很多地方不需要再重重復復地去Hardcode那些無聊的界面代碼(這早該改進了,10幾年前的DELPHI早就做出了最好的可視化設計范本)。值得稱贊的是 3D Touch 在此可以不用寫一句代碼就能實現了!

方法極為簡單,新建一個工程,拖入一個新的 ViewController 到 IB 里面,然后增加一個 segue 。然后在Segue的屬性中將 “Peek & Pop” 的勾選框勾上,那么就實現 3D Touch了。是不是很簡單,很沒有技術含量?但我喜歡!因為有效率。

有圖有真相,看看下面這張圖我想只要接觸了一點一點iOS編程的小伙伴們都一下就能搞出來了:

如果向下深究你會發現,事情遠遠沒有這么普通。因為通過IB我們還可以做更多的定制化。

這里有一些轉義 Peek 就是 PReview , Pop 就是Commit ,這一點我們得了解的。

從上圖就可知,當將選項從"Same as Commit Segue"/"Same as Action Segue" 改成 "Custom",那么 我們可以將Preview 與 Commit 時所采用的視圖控制器指定成特定的控制器類型,以增加更多的可自定控制,具體做法就與綁定視圖到指定控制器一樣,設置一下類名就行了,在此就不多加贅述了。

編程實現 3D Touch

如果你覺得上面的方法還不能滿足你的控制需要,那么我們還可以用Hardcode的方式來實現3D Touch。隨然過程有點繁復,但對于理解3DTouch的本質卻是有著莫大的好處。

UIViewControllerPreviewingDelegate

我們只要準備兩個視圖,一個為主視圖(ViewController)用于觸發 Peek,另一個為詳情視圖(DetailViewController)。

在iOS 中實現Peek 與 Pop 是很簡單的,iOS9的SDK中新增加了一個叫 UIViewControllerPreviewingDelegate 的接口。只要實現這個接口就可以令我們的程序支持3D Touch 了。

```swift

import UIKit

class ViewController: UIViewController, UIViewControllerPreviewingDelegate {

override func viewDidLoad() {    super.viewDidLoad()        // 注冊 3D Touch 的觸發視圖    if traitCollection.forceTouchCapability == .Available {        registerForPreviewingWithDelegate(self, sourceView: view)    }}// Mark - 實現 UIViewControllerPreviewingDelegatefunc previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {            return nil}func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {}

}

``

3D Touch 的所有秘密都在這個 UIViewControllerPreviewingDelegate 接口之內了。這個接口只有兩個方法,帶有返回值的就是實現 Peek 也就是 Preview, 而沒有返回值的就是 Pop 也就是Commit, 這一點很容易理解。但有點一必須指出,那就是如果要以編程方式實現3DTouch那就必須在控制器加載時就將 UIViewControllerPreviewingDelegate 通過 registerForPreviewingWithDelegate 方法注冊到當前的視圖控制器中,否則是不會觸發這個接口上的事件的。

Peek (Preview)

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {                return nil}

如果這個方法返回 nil 那么 Peek 行為將會失敗,iPhone 上只是會抖一下,而什么都不會觸發的。

如果我們原來的項目中是通過表格顯示列表,點擊表格單元進入詳情頁這種做法的話。這里所返回的 controller 實例就可以是原項目的詳情頁的controller 實例。只是這個視圖不會具有 NavigationBar 和 Statusbar ,而只是 view 的一個快照。當然,我們也可以單獨為項目的預瀏行為編寫獨特的視圖控制器,在這里直接返回控制器的實例就是了。

在我前不久的文章中曾介紹過iOS9 中的 SFSafariViewController ,那么在今天這個示例里面我就偷個懶,模擬在瀏覽器中的鏈接 Peek 行為,當用戶輕壓 示例中的 “Ray 的博客” 字樣時就直接 Peek 一個 Safari 的瀏覽器進行預覽。

那么我就在上述的代碼中加入:

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {            return  SFSafariViewController(URL: NSURL(string:"http://ray.dotnetage.com)!)}

運行看效果,你會發現:無論我輕壓屏幕的哪一個位置都會彈出 Safari 瀏覽器進行預覽,而不是像我所期望的,只是在輕壓 "Ray 的博客" 這個字樣時執行。這是因為當我們在前面采用了 registerForPreviewingWithDelegate(self, sourceView: view)
注冊3DTouch后,整個視圖的所有區域只要被Peek 都直接執行 上面的代碼,如果我們要固定在特定的區域,那么我們就得使用這里的一個參數:location:CGPoint。

通過這個參數我們就可以推測 iOS 是通過檢測我們手按壓在屏幕的哪一個具體的點上而觸發 Peek 行為的。當然了我們指壓下的范圍一定是多個點,而這個location 只是其中一個iOS認為最準確的位置而已。

要實現我的想法,只要用 CGRectContainsPoint() 方法檢查一下當前的點是不是在目標區域內,如果不是返回空就行了。那么代碼就可以這樣寫:

func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {            return CGRectContainsPoint(peekButton.frame, location) ? SFSafariViewController(URL: NSURL(string:"http://ray.dotnetage.com")!) : nil}

這就是最終效果:

如果我們壓下的是 table 的一個 cell 我們可以用 tableView.indexPathForRowAtPoint 方法重新獲取了對應的 cell 對象

動作菜單

當我們觸發了 Peek 行為之后,將預覽視圖向上推時可以在下方出現一個與 ActionSheet 類似的菜單快速操作當前預覽項目,這個功能就是 UIViewControllerPreviewingDelegate 的另一個方法 previewActionItems 。這個方法實現很簡單,只是將項目的具體操作實現為一個 UIPreviewActionItem 數組并返回即可,這個和 ActionSheet的實現方法極為相似。

注:previewActionItems 是一個 UIViewController 的新增方法

以下代碼示例是生成一個帶有“刪除”和“完成”的菜單項:

extension SFSafariViewController {        override public func previewActionItems() -> [UIPreviewActionItem] {                let deleteAction =  UIPreviewAction(title: "刪除",            style: UIPreviewActionStyle.Destructive,            handler: {                (previewAction,viewController) in                                NSLog("Delete")                        })                let doneAction = UIPreviewAction(title: "完成",            style: UIPreviewActionStyle.Default,            handler: {                (previewActin, viewController) in                                NSLog("Done")        })                return [doneAction, deleteAction]    }    }

運行效果如下:

好了對于Peek的控制就是這么多,但此時如果我們重壓觸發 Pop 會馬上什么都沒有了!為什么呢?因為我們還有另一個方法還沒有實現呢,這個方法實現起來也很簡單,直接用 showViewController()方法將viewControllerToCommit這個參數給顯示出來就是了,從這里我們就可以得出這樣的結論了,peek 被執行后所返回的 控制器實例將會被傳遞到 這個方法的 commitViewController 中。

具體代碼實現如下:

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {    showViewController(viewControllerToCommit, sender: self)}

That's all! 將以上的代碼寫好 Load 到我們的手機上就可以體驗這個小示例了。有一點比較遺憾的是,模擬器是不能模擬 3D Touch 的,只能在真機上調試,希望 Apple 會在下一個版本的 XCode 中加入3D Touch 的模擬器支持。

最后,奉上本文章的完整代碼示例: https://github.com/DotNetAge/PeepPopExample

小結

關于 Application shortcut 是個比較蛋痛的功能,雖然它能支持靜態與動態菜單,但是寫起來內容也不少,所以今天還是打算先寫到這里。以后再找時間專門寫一篇關于 Application shortcut 的文章吧。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.日韩系列| 日韩精品一二三四区| 国产欧美一区二区三区久久| 草民午夜欧美限制a级福利片| 亚洲一区二区三区在线视频| 中文字幕亚洲欧美日韩高清| 久久久久中文字幕2018| 69国产精品成人在线播放| 亚洲精品日韩丝袜精品| 国产亚洲日本欧美韩国| 欧美人与性动交a欧美精品| 国产精品扒开腿做爽爽爽视频| 青青草99啪国产免费| 狠狠做深爱婷婷久久综合一区| 日av在线播放中文不卡| 国产精品视频网址| 欧美色欧美亚洲高清在线视频| 精品日韩视频在线观看| 午夜精品久久久99热福利| 国产成人精品一区二区| 色久欧美在线视频观看| 国产情人节一区| 97福利一区二区| 亚洲无线码在线一区观看| 欧美精品生活片| 亚洲福利视频在线| 精品视频在线观看日韩| 在线亚洲男人天堂| 中文字幕无线精品亚洲乱码一区| 中文字幕少妇一区二区三区| 成人在线免费观看视视频| 国产精品美女999| 国产成人精品亚洲精品| 日韩欧美中文免费| 91久久精品国产91久久| 麻豆成人在线看| 亚洲成人激情小说| 91天堂在线视频| 国产精品成av人在线视午夜片| 疯狂蹂躏欧美一区二区精品| 91精品视频网站| 国产精品黄页免费高清在线观看| 高跟丝袜欧美一区| 在线精品国产欧美| 国产精品免费久久久久影院| www.日韩视频| 日韩视频欧美视频| 国产精品久久久久久一区二区| 亚洲一二三在线| 亚洲国产三级网| 国产精品永久免费观看| 亚洲精品av在线播放| 91色视频在线观看| 亚洲国产日韩欧美在线99| 国产在线精品自拍| 在线播放亚洲激情| 亚洲网站在线观看| 欧美成年人视频网站| 91av在线免费观看| 日韩欧美精品在线观看| 欧美亚洲在线观看| 国产精品揄拍一区二区| 538国产精品一区二区免费视频| 成人免费网站在线看| 欧美日韩第一页| 国产精品丝袜久久久久久高清| 国产成人一区二区三区| 欧美综合在线第二页| 91精品国产高清久久久久久91| 色综合久久精品亚洲国产| 主播福利视频一区| 欧美亚洲国产日本| 激情懂色av一区av二区av| 欧美另类99xxxxx| 国产精品久久久久aaaa九色| 国模精品视频一区二区| 国模吧一区二区| 热re91久久精品国99热蜜臀| 久久久视频免费观看| 日韩美女在线播放| 人人做人人澡人人爽欧美| 欧美日韩中文字幕综合视频| 日本不卡高字幕在线2019| 国产在线精品一区免费香蕉| 亚洲国产欧美自拍| 国产精品美女www| 欧美性videos高清精品| 欧美在线一区二区视频| 久久手机精品视频| 欧美另类第一页| 国产不卡在线观看| 欧美视频免费在线观看| 国产欧美韩国高清| 久久久精品国产亚洲| 这里只有精品在线观看| 不卡av在线播放| 亚洲精品一区av在线播放| 久久久天堂国产精品女人| 中文字幕欧美国内| 2019最新中文字幕| 久久久精品国产亚洲| 欧美国产日韩一区二区| 亚洲精品国产欧美| 午夜精品一区二区三区视频免费看| 成人在线小视频| 亚洲最大成人网色| 欧美一级大胆视频| 国产欧美日韩丝袜精品一区| 精品网站999www| 欧美日韩国产专区| 高清一区二区三区日本久| 亚洲第一av在线| 51色欧美片视频在线观看| 久久天天躁狠狠躁夜夜躁| 国语对白做受69| 91麻豆国产语对白在线观看| 国内精品久久久久| 大胆人体色综合| 亚洲性av在线| 欧美精品在线视频观看| 欧美性猛交xxxx免费看久久久| 亚洲色图欧美制服丝袜另类第一页| 国产精品激情自拍| 精品久久在线播放| 亚洲精品v天堂中文字幕| 岛国视频午夜一区免费在线观看| 精品久久在线播放| 国产精品高潮视频| 亚洲黄色有码视频| 九九热精品视频国产| xxxxx成人.com| 亚洲精品国产电影| 日韩欧美高清在线视频| 日韩电影中文字幕| 日韩av综合中文字幕| 国产成人免费av| 日韩免费电影在线观看| 国产偷国产偷亚洲清高网站| 国产成人一区二区| 日本不卡免费高清视频| 国产精品视频内| 98精品国产自产在线观看| 国产激情999| 亚洲精品理论电影| 成人黄色短视频在线观看| 日韩成人在线观看| 欧美高清理论片| 日韩中文字幕网站| 欧美视频第一页| 色综合91久久精品中文字幕| 亚洲美女动态图120秒| 国产精品美女主播| 国产激情综合五月久久| 少妇高潮久久77777| 日韩欧美高清在线视频| 啪一啪鲁一鲁2019在线视频| 欧美人成在线视频| 亚洲国产精品999| 亚洲第一视频在线观看| 精品国产欧美一区二区三区成人| 91精品国产综合久久久久久久久| 全色精品综合影院| 国产精品专区一| 国产欧美va欧美va香蕉在|