3D Touch應用:Peek & Pop

在UIViewController類別中採用UIViewControllerPreviewingDelegate來設定支援預覽與彈出。

這個效果就像Line裡面可以用按壓的方式查看聊天室的內容,達到真正的已讀不回!!!

步驟如下:

  1. 呼叫UIViewController中的registerForPreviewing方法,註冊view controller支援預覽與彈出
  2. 採用UIViewControllerPreviewingDelegate中的兩個方法,讓我們提供一個preview view controller跟一個commit view controller來回應使用者的按壓。

在viewDidLoad加入註冊,並檢查裝置是否支援3D Touch。

if(traitCollection.forceTouchCapability == .available){
registerForPreviewing(with: self as UIViewControllerPreviewingDelegate, sourceView: view)
}

接著實作UIViewControllerPreviewingDelegate協定中必須執行的兩個方法:

  1. previewingContext(_:viewControllerForLocation):使用者按壓來源view一定程度之後會開啟預覽(Peek)。來源視圖就是我們要實作的視圖。
  2. previewingContext(_:commitViewController:):準備顯示提交的view。
//觸控以CGPoint型態進行參數傳遞,推導出哪個cell被選取
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint)-> UIViewController?{
guard let indexPath = tableView.indexPathForRow(at: location)
//以取得的點,回傳該點所在列的路徑
else{
return nil
}
guard let cell = tableView.cellForRow(at: indexPath)
else{
return nil
}
guard let restaurantDetailViewController = storyboard?.instantiateViewController(withIdentifier: “RestaurantDetailViewController”) as? RestaurantDetailViewController//使用storyboard識別碼
else{
return nil
}
let selectedRestaurant = restaurants[indexPath.row]
restaurantDetailViewController.restaurant = selectedRestaurant
restaurantDetailViewController.preferredContentSize = CGSize(width: 0.0, height: 450.0)//這個可以不設定,會自動以預設尺寸呈現
previewingContext.sourceRect = cell.frame//設定預覽內容的cell要保持清楚
return restaurantDetailViewController
}
//pop部分,提交一個viewcontroller,呼叫showViewController來呈現。
func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController){
show(viewControllerToCommit, sender: self)
}

完畢之後記得檢查StoryBoard的識別碼是否設定成程式碼中所要求的,否則會找不到。

專案參考RestaurantTableViewController.swift