質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1312閲覧

Swift UIImageViewで枠のサイズ固定したまま中の画像をピンチで拡大できるようにする

lyzmfeqpxs54

総合スコア237

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/11/21 08:32

いつもお世話になっております。
タイトル通りなのですが、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

上記のソースですと、imageViewを直接拡大・縮小しているので枠ごと大きくなりますよね。

見た目だけの問題であれば、
imageViewの親として1つ view を追加して、はみ出した部分は表示しない。
などとするのはいかがでしょうか?

override func viewDidAppear(_ animated: Bool) { // 省略 let parentView = UIView(frame: CGRect(x: titleX ,y: titleY ,width: scWid - (titleX*2) ,height: (scWid - (titleX*2))*500/1600)) parentView.layer.masksToBounds = true self.view.addSubview(parentView) titleView = UIImageView(frame: CGRect(x: 0 ,y: 0 ,width: scWid - (titleX*2) ,height: (scWid - (titleX*2))*500/1600)) titleView.image = UIImage(named: "top_title.png") parentView.addSubview(titleView) let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.pinchAction(sender:))) pinchGesture.delegate = self titleView.isUserInteractionEnabled = true titleView.addGestureRecognizer(pinchGesture) }

実際に動かしているわけではないので、想定通りに動かなかったらごめんなさい。

投稿2018/11/21 08:47

norinor

総合スコア42

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lyzmfeqpxs54

2018/11/22 03:11

ご回答ありがとうございます。ご教示いただいた方法で無事解決できました。 またいろいろとご教示いただけますと幸いです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問