Edited at

画像をダブルタップとピンチイン・ピンチアウトで拡大・縮小する Swift3編

More than 1 year has passed since last update.

ちょっと必要に迫られて1、常に同じ画像を起動と同時に表示して、ピンチで拡大/縮小、ダブルタップで拡大、というアプリを、一晩で作ることになりました。

調べてみると、まさにうってつけのページがありましたが、正直Swift3ではまったく動きませんでした。ので、ちょっと手直しをさせていただきましたので、貼っておきます。


コード


ViewController.swift

class ViewController: UIViewController, UIScrollViewDelegate {

@IBOutlet var myImageView: UIImageView!
@IBOutlet var myScrollView: UIScrollView!

override func viewDidLoad() {
super.viewDidLoad()

self.myScrollView.delegate = self

let doubleTapGesture = UITapGestureRecognizer(target: self, action:#selector(self.doubleTap))
doubleTapGesture.numberOfTapsRequired = 2
self.myImageView.addGestureRecognizer(doubleTapGesture)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
//print("pinch")
return self.myImageView
}

func doubleTap(gesture: UITapGestureRecognizer) -> Void {
//print(self.myScrollView.zoomScale)
if (self.myScrollView.zoomScale < self.myScrollView.maximumZoomScale) {
let newScale = self.myScrollView.zoomScale * 3
let zoomRect = self.zoomRectForScale(scale: newScale, center: gesture.location(in: gesture.view))
self.myScrollView.zoom(to: zoomRect, animated: true)
} else {
self.myScrollView.setZoomScale(1.0, animated: true)
}
}

func zoomRectForScale(scale:CGFloat, center: CGPoint) -> CGRect{
let size = CGSize(
width: self.myScrollView.frame.size.width / scale,
height: self.myScrollView.frame.size.height / scale
)
return CGRect(
origin: CGPoint(
x: center.x - size.width / 2.0,
y: center.y - size.height / 2.0
),
size: size
)
}
}



変更点



  • UIScrollViewUIImageViewをStoryBoardからロードするので、そちらで設定できる項目は極力そちらにまかせます


  • varよりもletです

  • 型推論を活用します

  • 最初の引数にもラベルが必要になっています

  • selectorの指定方法が#selector()に変わっています


脚注





  1. 島内に岡山県-香川県の県境がある石島に行くことになり、実際に県境マニアのみなさんが上陸した際の地図画像を、道なき道を進みつつ随時確認するために必要になりました。iPhone付属の写真アプリでは、アプリプロセスが終了したらまた画像を選び直さなければならなくなってしまい、それは獣道を進む最中の大きなコストです。ので、タスクリストからもアプリアイコンタップからもイッパツで画像表示ができるものを欲したわけです。