いつもお世話になっております。
タイトル通りなのですが、UIImageViewで枠のサイズは固定したまま中の画像をピンチで拡大できるようにしたいと考えております。現状以下のようにコードを書いているのですが、このままですと枠ごと(UIImageViewごと)拡大・縮小されてしまいます。
UIScrollViewを使用しない実装を考えているのですが、検索してもほとんど見つからずこちらに質問させていただきました。
正しい方法をご教示いただけますと幸いです。
よろしくお願いいたします。
Swift
1class ViewController: UIViewController,UIGestureRecognizerDelegate { 2 override func viewDidAppear(_ animated: Bool) { 3 super.viewDidAppear(animated) 4 5 // スクリーン画面のサイズを取得 6 let scWid: CGFloat = UIScreen.main.bounds.width //画面の幅 7 let scHei: CGFloat = UIScreen.main.bounds.height //画面の高さ 8 let posX = scWid*0.05 9 let titleY = scHei*0.10 10 // タイトル画像の作成 11 titleView = UIImageView(frame: CGRect(x: titleX ,y: titleY ,width: scWid - (titleX*2) ,height: (scWid - (titleX*2))*500/1600)) 12 titleView.image = UIImage(named: "top_title.png") 13 self.view.addSubview(titleView) 14 15 let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.pinchAction(sender:))) 16 pinchGesture.delegate = self 17 titleView.isUserInteractionEnabled = true 18 titleView.addGestureRecognizer(pinchGesture) 19 } 20 21 // 画像の拡大率 22 var currentScale:CGFloat = 1.0 23 24 @objc func pinchAction(sender: UIPinchGestureRecognizer) { 25 // imageViewを拡大縮小する 26 // ピンチ中の拡大率は0.3〜2.5倍、指を離した時の拡大率は0.5〜2.0倍とする 27 switch sender.state { 28 case .began, .changed: 29 // senderのscaleは、指を動かしていない状態が1.0となる 30 // 現在の拡大率に、(scaleから1を引いたもの) / 10(補正率)を加算する 31 currentScale = currentScale + (sender.scale - 1) / 10 32 // 拡大率が基準から外れる場合は、補正する 33 if currentScale < 0.3 { 34 currentScale = 0.3 35 } else if currentScale > 2.5 { 36 currentScale = 2.5 37 } 38 // 計算後の拡大率で、imageViewを拡大縮小する 39 titleView.transform = CGAffineTransform(scaleX: currentScale, y: currentScale) 40 default: 41 // ピンチ中と同様だが、拡大率の範囲が異なる 42 if currentScale < 0.5 { 43 currentScale = 0.5 44 } else if currentScale > 2.0 { 45 currentScale = 2.0 46 } 47 48 // 拡大率が基準から外れている場合、指を離したときにアニメーションで拡大率を補正する 49 // 例えば指を離す前に拡大率が0.3だった場合、0.2秒かけて拡大率が0.5に変化する 50 UIView.animate(withDuration: 0.2, animations: { 51 self.titleView.transform = CGAffineTransform(scaleX: self.currentScale, y: self.currentScale) 52 }, completion: nil) 53 54 } 55 } 56}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/22 03:11