3D 터치 구현

2017. 2. 2. 16:51Programming/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 터치 프로젝트 파일

ThreeTouch.zip

반응형