LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-07-05

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

1. ViewControllerを準備します

2. ピンチする画面を用意します

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

スクリーンショット 2018-07-05 13.45.09.png

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

スクリーンショット 2018-07-05 13.37.19.png

3. Pinch Gesture Recognizerを追加します

  • 画面右下のパレットで「Pinch」を入力し、「Pinch Gesture Recognizer」を表示します

スクリーンショット 2018-07-05 13.32.41.png

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

スクリーンショット 2018-07-05 13.46.32.png

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

  • ViewController.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]を押しながらピンチ動作を確認します

スクリーンショット 2018-07-05 13.45.46.png

5. 画面を遷移している場合

  • 画面を遷移してUIViewなどを表示している場合には、以下のように記述することでpinchGestureが使用可能になります
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)
        }
    }
}

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3