ジェスチャを扱うプログラムを考えます。 ここでは最もピンチを扱うプログラムを作成してみます。 この例では、ピンチの親クラスである UIGestureRecognizer のメソッドにアクセスして マルチタッチの位置を取得しています。
ImageViewはデフォルトではジェスチャを認識しないように設定されていますので、 ジェスチャを認識するように変更(User Interaction Enabled, Multiple Touch をともにチェック)します。
プログラムの中で、ピンチ ジェスチャにおいて、 Began, Changed, Ended それぞれの状態で枠を表示します。 Ended な状態でのマルチタッチの位置を枠として rects に追加しています (この例では rects は特に活用していません)。
ViewController.swiftに追加するコード(赤字部分) |
import UIKit class ViewController: UIViewController { var rects: [CGRect]? var backupImage: UIImage? @IBOutlet weak var myImageView: UIImageView! @IBAction func pinchImageView(sender: UIPinchGestureRecognizer) { var r: CGRect? if (sender.numberOfTouches() >= 2) { let p:CGPoint = sender.locationOfTouch(0, inView: myImageView) let q:CGPoint = sender.locationOfTouch(1, inView: myImageView) r = CGRect(x: min(p.x,q.x), y: min(p.y,q.y), width: abs(p.x-q.x), height: abs(p.y-q.y)) } switch sender.state { case .Began: print("began \(r)") backupImage = myImageView.image if r != nil { myImageView.image = makeUIImage(backupImage, r) } case .Changed: print("changed \(r)") if r != nil { myImageView.image = makeUIImage(backupImage, r) } case .Ended: print("ended \(r)") if r != nil { myImageView.image = makeUIImage(backupImage, r) rects!.append(r!) } default: print("default \(r)") } } func makeUIImage(image: UIImage?, _ rect:CGRect?) -> UIImage { let sz:CGSize = myImageView.frame.size UIGraphicsBeginImageContext(sz) let context: CGContextRef = UIGraphicsGetCurrentContext()! if image != nil { image!.drawInRect(CGRectMake(0,0,image!.size.width,image!.size.height)) } CGContextSetLineWidth(context, 1.0) CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0) if rect != nil { CGContextStrokeRect(context, rect!) } let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img } override func viewDidLoad() { super.viewDidLoad() rects = Array<CGRect>() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } |
ImageViewの上でピンチした場所が、赤い枠として表示に追加されます。 ピンチ ジェスチャーは拡大縮小のためのジェスチャとして想定されているようですが、 ここでは親クラスの UIGestureRecognizer にアクセスすることでマルチタッチ(複数の指)の位置を取得しています。