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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

2349閲覧

拡大時のUIImageViewのクロップ

deltaZone

総合スコア12

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/12/10 09:16

編集2016/12/13 10:36

現在写真イメージを
▷UIScrollView▷UIImageViewという階層の
UIImageView.imageに乗せ

拡大のイベントを、UIScrollViewDelegateである
viewForZoomingInScrollViewや
scrollViewDidEndZoomingで
取れるようにしました。

そして今その拡大したイメージをクロップしたいと思っていますが
その拡大時のrectの取り方がわかりません。

swift

1 2 3 if let cropRef = CGImageCreateWithImageInRect(image.CGImage!, self.cropRect!){ 4 let cropImage = UIImage(CGImage: cropRef) 5 } 6 7

のように
クロップしたいのですが。。。

swift

1 2func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) { 3 4 cropRect = CGRectMake(scrollView.contentOffset.x* scale,scrollView.contentOffset.y* scale,scrollView.bounds.size.width* scale,scrollView.bounds.size.height* scale) 5 } 6

では上手くとれなかったです。

追記:
ログを出してみると
▷▷▷拡大前
▷scrollView frame = (0 0; 328 328) contentOffset: {0, 0}; contentSize: {0, 0}
▷scrollView Bounds = (0.0, 0.0, 328.0, 328.0)
▷ImageView frame = (0 0; 383 383)
▷ImageView's image = {2448, 2448}

▷▷▷拡大後
▷scrollView frame = (0 0; 328 328) contentOffset: {107.5, 128.5}; contentSize: {597.26526, 597.26526}
▷scrollView Bounds is (107.5, 128.5, 328.0, 328.0)
▷ImageView is frame = (0 0; 597.265 597.265)
▷ImageView's image = {2448, 2448}
のようになっていて拡大時にはscrollViewのcontentOffsetとcontentSizeの変化に合わせてそのboundsとその下階層にあるImageViewのframeが変わっています。

その後imageのサイズに1/scaleを乗算したものが
取得したい拡大時のrect.sizeであることがわかりましたが
imageの内、見えている部分の座標が未だに正確に取得できないです

picture説明
黄色 imageView.imageのサイズ、
青 scrollViewのframe(見えている部分)
緑 CGRectMake(scrollView.contentOffset.x/ scale,scrollView.contentOffset.y/ scale,scrollView.frame.size.width/ scale,scrollView.frame.size.height/ scale)で取れているように見える矩形

今知りたいのは黄色のimageの中での青の矩形の座標です。

イメージ説明

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

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

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

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

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

fuzzball

2016/12/12 07:00 編集

不要なtagは削除して下さい。それとも、Swift2とObjective-Cのどちらでもいいのでしょうか?
fuzzball

2016/12/12 07:00

どこを切り取ればいいのでしょうか?
fuzzball

2016/12/12 15:57 編集

で、どこを切り取ればいいのでしょうか?ImageViewからScrollViewに表示されている矩形(328x328?)を切り取ればいいのでしょうか?ImageViewのcontentModeは何にしてますか?
deltaZone

2016/12/12 16:32

>fuzzballさん 切り取りたいのは表示されている矩形でまちがいないです。contentModeはAspectFillに設定しています。
fuzzball

2016/12/13 00:22 編集

ちょっと気になったのですが、拡大前にscrollViewのサイズとimageViewのサイズが違うのはなぜでしょうか?
deltaZone

2016/12/13 01:08

>fuzzballさん ご指摘ありがとうございます。viewWillLayout時になぜかscrollViewが格納されているUIViewごと小さくなってしまっているようでした。constraintの設定を洗いなおしてみています。
guest

回答1

0

ベストアンサー

scrollView.contentOffsetには拡大後のオフセット値が入っているので、ここからscrollView.size(328x328)を切り取ればいいです。切り取るのは拡大前のimageView(のimage)なので値を変換します。変換と言ってもscaleで割るだけです。

swift

1let cropRect = CGRect(x: scrollView.contentOffset.x / scale, 2 y: scrollView.contentOffset.y / scale, 3 width: scrollView.frame.width / scale, 4 height: scrollView.frame.height / scale)

どうでしょうか?

scrollViewDidEndZoomingのタイミングだとオフセットがマイナス値になることもあるので、その辺を対策をする必要があるかも知れません。

投稿2016/12/13 00:47

fuzzball

総合スコア16731

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

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

deltaZone

2016/12/13 02:19

回答の方法で試みると、例えば2倍の拡大をしている時は 328/2 = 164のsizeとなるのでごく小さいサイズのimageしか取得できませんでした。 offsetについても原点からほぼ動かない状況です。。
fuzzball

2016/12/13 02:27 編集

>>328/2 = 164のsizeとなるのでごく小さいサイズのimageしか取得できませんでした。 これが間違いであるなら、あなたのやりたいことが私に伝わっていません。 言葉で説明出来ないのであれば、画像などを用意して説明して下さい。
fuzzball

2016/12/13 10:57

私のコードは、scrollViewに表示されている領域を元画像(等倍)から切り取っているので緑枠とは違います。 拡大した状態の画像が欲しいのであれば、私のコードで取得した画像をscale倍してやればいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問