2017. 2. 2. 16:51ㆍProgramming/Swift
아래 유튜브 동영상을 보고 그대로 따라한 것을 내 나름대로 정리해 보았다.
https://www.youtube.com/watch?v=NO9E5KxixOw
위 그림으로 보자면,
테이블뷰 메인화면을 만들고 해당 셀을 클릭 했을 경우, 일반적으로 AddStuffViewController로 넘어가게 된다.
여기서 해당 셀을 클릭하지 않고, 강하게 누르고 있을 경우, 즉 3D터치를 하였을 경우 PreviewViewController로 보여지게 끔 하려는 것이 목적이다.
아래 소스의 색이 칠해져 있는 것은 3d터치와 연관된 소스이니, 이부분만 참고하면 될 듯 싶다.
- MasterViewController.swift
import UIKit class MasterViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var MenuTable: UITableView? var data = ["Awesome Stuff","Interesting Stuff","Cool Stuff"]
var stuffType:String? = nil var quickActionString:String? = nil
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib.
MenuTable?.delegate = self MenuTable?.dataSource = self
if traitCollection.forceTouchCapability == .available { registerForPreviewing(with: self, sourceView: MenuTable!) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data.count }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = data[indexPath.row]
return cell }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let cell = MenuTable?.cellForRow(at: indexPath) { stuffType = cell.textLabel?.text self.performSegue(withIdentifier: "showStuff", sender: self) } }
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showStuff" { let stuffVC = segue.destination as? AddStuffViewController stuffVC?.detailInfo = stuffType } } } |
- MasterViewController+UIViewControllerPreviewing.swift
: 확장 클래스로 이 부분이 핵심이다.
import UIKit extension MasterViewController: UIViewControllerPreviewingDelegate { // PEEK func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = MenuTable?.indexPathForRow(at: location), let cell = MenuTable?.cellForRow(at: indexPath) else {return nil}
guard let previewVC = storyboard?.instantiateViewController(withIdentifier: "PreviewVC") as? PreviewViewController else {return nil}
previewVC.selectedItem = data[indexPath.row] quickActionString = data[indexPath.row]
previewVC.preferredContentSize = CGSize(width: 0, height: 150)
previewingContext.sourceRect = cell.frame
return previewVC }
// POP func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) { if let stuffVC = storyboard?.instantiateViewController(withIdentifier: "AddStuffVC") as? AddStuffViewController { stuffVC.detailInfo = quickActionString
show(stuffVC, sender: self) } } } |
- PreviewViewController.swift
: 3D 터치가 작동되었을 시 보여주는 형식이다.
: 3D 터치 작동 중 화면을 위로 올렸을 경우, "Do something" 과 "Do even more " 메뉴가 나타나게 된다.
import UIKit class PreviewViewController: UIViewController { var selectedItem: String? = nil var previewActions:[UIPreviewActionItem] { let item1 = UIPreviewAction(title: "Do something", style: .default) { (action:UIPreviewAction, vc:UIViewController) -> Void in print("Awesome") }
let item2 = UIPreviewAction(title: "Do even more", style: .default) { (action:UIPreviewAction, vc:UIViewController) -> Void in print("cool") }
return [item1,item2] }
@IBOutlet weak var previewLabel: UILabel?
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) previewLabel?.text = selectedItem }
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } |
- AddStruffViewController.swift
: 일반적인 테이블뷰 값을 보여주는 것이라 본 내용과는 크게 중요하지 않다.
- 3D 터치 프로젝트 파일
'Programming > Swift' 카테고리의 다른 글
swift3.0 설정으로 가기 (0) | 2017.02.17 |
---|---|
alertMessage 왼쪽 정렬 (0) | 2017.02.15 |
Notification - FCM 설정(3) : 소스 및 테스트 (0) | 2017.02.02 |
Notification - FCM 설정(2) : 선행 조건 (0) | 2017.02.02 |
Notification - FCM 설정(1) : 참고 URL (0) | 2017.02.01 |