(初心者向け)Swiftで初アプリ - ピンチ動作を追加

Swiftを使って簡単なiPhoneアプリを作ってみます
ピンチ動作を追加してみます

#1. ViewControllerを準備します
- [(初心者向け)Swift3.0で初アプリ - 次画面を追加してみる](https://qiita.com/egplnt/items/2806aa6b88a966a82f8c)などを参照し、ピンチ動作を追加する画面とその画面に紐付けられたUIViewControlle.swiftを準備します

#2. ピンチする画面を用意します
- Label部品などを使ってピンチする対象にする画面を用意します
- たとえばこんな感じ。ピンチを試しやすように用意しています

<img width="388" alt="スクリーンショット 2018-07-05 13.45.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/6972a507-9c80-7956-22b1-a41147fab271.png">

- 画面右側の「Attribute Inspector」画面（下向きの矢印）で「User Interaction Enabled」を選択します

<img width="391" alt="スクリーンショット 2018-07-05 13.37.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/52953b3c-ad1e-44ac-9944-47a451bb8b3a.png">


#3. Pinch　Gesture Recognizerを追加します
- 画面右下のパレットで「Pinch」を入力し、「Pinch Gesture Recognizer」を表示します

<img width="262" alt="スクリーンショット 2018-07-05 13.32.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/2f59b490-ab4c-25e1-09dc-8344be646a2b.png">

- ピンチする対象の部品へPinch Gesture Recognizerをドラッグ＆ドロップします。Pinch Gestureが登録されたことを確認します

<img width="623" alt="スクリーンショット 2018-07-05 13.46.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/f77ec8aa-d289-ec47-a9f3-833dfaffc7fd.png">

- 登録されたPinch Gesture Recognizerをドラッグ＆ドロップしてViewController.swiftへ登録します

- ViewController.swiftに以下のような感じで記述します

```swift:PinchGesture

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label1: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func pinchGestureRecognized(_ sender: UIPinchGestureRecognizer) {
        label1.transform = CGAffineTransform(scaleX: sender.scale, y: sender.scale)
    }
}

```

#4. Simulatorで稼働を確認します
- Simulatorで[Option]を押しながらピンチ動作を確認します

<img width="436" alt="スクリーンショット 2018-07-05 13.45.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/d1d34634-d6cf-c719-eed5-b234cfdc51b7.png">

#5. 画面を遷移している場合
- 画面を遷移してUIViewなどを表示している場合には、以下のように記述することでpinchGestureが使用可能になります

```swift:pinchGestre_in_next_page
import UIKit
import CoreGraphics

class PDFShowViewController: UIViewController {

    var pages = 1
    var nowPage = 1
    var pdfView = PDFView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
    var pdfName = ConstStruct.pdf_name01
    // ここで受け取る
    var sendType:String = ""
    var sendYear:String = ""
    
    @IBOutlet weak var viewView: UIView!
   
    override func viewDidLoad() {
        super.viewDidLoad()
        print("sendType: ", sendType)
        print("sendYear: ", sendYear)
        
        if sendType == "abc" && sendYear == "2001" {
            pdfName = ConstStruct.pdf_name01
        } else if sendType == "xyz" && sendYear == "2012"{
            pdfName = ConstStruct.pdf_name01
        }
        print("pdfName: ", pdfName)
        
        let url = Bundle.main.bundleURL.appendingPathComponent(pdfName)
        let doc = CGPDFDocument(url as CFURL)
        
        pages = doc!.numberOfPages
        print("pages: ", pages)
        
        let page = doc!.page(at: nowPage)
        let myBoundSize: CGSize = UIScreen.main.bounds.size
        pdfView = PDFView(frame: CGRect(x: 0, y: 0, width: myBoundSize.width, height: myBoundSize.height))
        
        pdfView.backgroundColor = UIColor.white
        pdfView.page = page
        self.view.addSubview(pdfView)
    }
    
    //次ページへ
    
    @IBAction func downSwiped(_ sender: Any) {
        if nowPage < pages {
            nowPage = nowPage + 1
            print("original nowPage: ", nowPage)
            let url = Bundle.main.bundleURL.appendingPathComponent(pdfName)
            let doc = CGPDFDocument(url as CFURL)
            let page = doc!.page(at: nowPage)
            pdfView.page = page
            for subview in self.view.subviews {
                subview.setNeedsDisplay()
            }
        }
    }
    
    //前ページへ
    
    @IBAction func upSwiped(_ sender: Any) {
        if nowPage > 1 {
            nowPage = nowPage - 1
            let url = Bundle.main.bundleURL.appendingPathComponent(pdfName)
            let doc = CGPDFDocument(url as CFURL)
            let page = doc!.page(at: nowPage)
            pdfView.page = page
            for subview in self.view.subviews {
                subview.setNeedsDisplay()
            }
        }
    }
    
    // pinchGesture
    
    @IBAction func pinchGesture(_ sender: UIPinchGestureRecognizer) {
        print("pinch scale: \(sender.scale)")
        print("pinch velocity: \(sender.velocity)")
        //pinchGesture.scale = 1.0
        for subview in self.view.subviews {
            subview.transform = CGAffineTransform(scaleX: sender.scale, y: sender.scale)
            subview.setNeedsDisplay()
        }
}

    class PDFView: UIView {
        var page: CGPDFPage?
        
        override func draw(_ rect: CGRect) {
            guard let page = page else { return }
            
            let context = UIGraphicsGetCurrentContext()
            
            context!.translateBy(x: 0, y: rect.size.height)
            context!.scaleBy(x: 1.0, y: -1.0)
            
            let box = page.getBoxRect(.artBox)
            let xScale = rect.size.width / box.size.width
            let yScale = rect.size.height / box.size.height
            let scale = min(xScale, yScale)
            _ = (rect.size.width - box.size.width * scale) / 2
            let ty = (rect.size.height - box.size.height * scale) / 2
            
            context!.translateBy(x: 0, y: ty)
            context!.scaleBy(x: scale, y: scale)
            context!.drawPDFPage(page)
        }
    }
}

```


#参考
- [Pinch Gesture Recognizerの使い方。2つの指で部品を拡大縮小する](http://hajihaji-lemon.com/smartphone/swift/pinch-gesture-recognizer)を参考にさせていただきました