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

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

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

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

Xcode

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

Swift

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

Swift 2

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

Q&A

解決済

2回答

3200閲覧

UIScrollViewでの画像の表示

lyzmfeqpxs54

総合スコア237

iOS

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

Xcode

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

Swift

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

Swift 2

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

0グッド

0クリップ

投稿2016/09/29 09:37

編集2016/09/29 12:20

現在1000×10000のサイズの画像をスクロールビューに表示したいと考えています。スクロールビューは縦のみ動かせるようにし、画像が伸びたりはしたくないので下記コードのようにScaleAspectFitを使用しております。
しかし、このままだと画像の上下に空白ができてしまいます(画像自体は正しく表示されていますが、上下の空白のため非常に長いビューなってしまいます)。

この空白を表示せずに画像だけをスクロールできるようにする方法について
ご教示のほどお願い申し上げます。

// スクリーン画面のサイズを取得 let scWid: CGFloat = UIScreen.mainScreen().bounds.width //画面の幅 let scHei: CGFloat = UIScreen.mainScreen().bounds.height //画面の高さ // ScrollViewを生成. descriptionScrollView = UIScrollView() // ScrollViewの大きさを設定する. descriptionScrollView.frame = CGRectMake(scWid*0.05 ,scHei*0.1 ,scWid*0.9 ,scHei*0.7) //画像を用意 let myImage = UIImage(named: "大きい画像.png")! // UIImageViewを生成する. let myImageView = UIImageView() // myImageViewのimageにmyImageを設定する. myImageView.image = myImage // frameの値を設定する. myImageView.contentMode = UIViewContentMode.ScaleAspectFit myImageView.frame = CGRectMake(0, 0, scWid*0.9, newImage.size.height) // ScrollViewにmyImageViewを追加する. descriptionScrollView.addSubview(myImageView) // ScrollViewにcontentSizeを設定する. descriptionScrollView.contentSize = CGSizeMake(myImageView.frame.size.width, myImageView.frame.size.height) //バウンドしないようにする descriptionScrollView.bounces = false // ViewにScrollViewをAddする. self.view.addSubview(descriptionScrollView)

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

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

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

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

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

fuzzball

2016/09/29 11:10

newImageというのは何でしょうか?
guest

回答2

0

ベストアンサー

質問のコードを試してみましたが、画像の上下に空白ができると言っているのは、今スクロールビューのframeを

swift

1descriptionScrollView.frame = CGRectMake(scWid*0.05 ,scHei*0.1 ,scWid*0.9 ,scHei*0.7)

と設定していて、スクロールビューが画面いっぱいに表示されていないので、その外側の空白が表示されているだけのように見えます。
このコードがViewControllerのviewDidLoad()で実行されているものだとすると、

swift

1descriptionScrollView.frame = view.bounds

としたらどうですか?
こうすれば画面いっぱいにスクロールビューが表示されて空白はなくなると思いますけど。

投稿2016/09/29 10:17

TakeOne

総合スコア6299

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

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

lyzmfeqpxs54

2016/09/29 12:34

ご回答ありがとうございます。 スクロールビューのサイズ全画面ではなく、コーディングしたとおり descriptionScrollView.frame = CGRectMake(scWid*0.05 ,scHei*0.1 ,scWid*0.9 ,scHei*0.7) の中で行いたいのです。
TakeOne

2016/09/29 13:33

fuzzballさんが情報の追加修正依頼で書いているのですが `myImageView.frame = CGRectMake(0, 0, scWid*0.9, newImage.size.height)` のnewImageと言うのがエラーになるので、私はこれをmyImageの間違いだろうと思って勝手に修正して確認したのですが、もしかして、myImageでない別のnewImageという別の画像があって、それを使っているのですか? だったら、それが問題の原因だと思います。
lyzmfeqpxs54

2016/09/29 14:22

失礼いたしました。newImageではなくmyImageの間違いです。
TakeOne

2016/09/29 15:44 編集

言っている意味がわかりました。スクロールビューの外に空白ができると言っているのではなくて、スクロールビューの中で画像の上下に空白ができると言っているのですね。 でしたら、横サイズ1000の画像を横320くらいに縮めて表示しているのですから、ScaleAspectFitを指定したら縦も比例して3200くらいに縮まります。なのにmyImageViewの高さにmyImage.size.height(=10000)を指定しているから上下に余白ができるのだと思います。 myImageView.frame = CGRectMake(0, 0, scWid*0.9, myImage.size.height*scWid*0.9/myImage.size.width) とすべきだと思います。
lyzmfeqpxs54

2016/09/30 00:00

ご回答ありがとうございます。 説明が悪く、お手間をおかけして申し訳ございませんでした。 ご教示いただきたいた方法でやりたいことの実現ができました。 また、理由も合わせてご教示いただき、うまく表示できなかった原因も理解することができました。本当にありがとうございます。 また、よろしくお願いいたします。
guest

0

おまけ

AVFoundationにScaleAspectFit後のサイズを求められる関数(AVMakeRectWithAspectRatioInsideRect)があるので、これを利用してみます。

swift

1(前略) 2import AVFoundation 3(中略) 4 // frameの値を設定する. 5 myImageView.contentMode = .ScaleAspectFit 6 //幅はScrollViewと同じ、高さは仮に無限大としておく 7 myImageView.frame = CGRectMake(0, 0, CGRectGetWidth(descriptionScrollView.frame), CGRectGetHeight(CGRectInfinite)) 8 print("frame(tmp)=", myImageView.frame) 9 //ScaleAspectFit後のサイズを求める 10 myImageView.frame.size = AVMakeRectWithAspectRatioInsideRect(myImage.size/*画像サイズ*/, myImageView.frame/*fitさせたい領域*/).size 11 print("frame(fit)=", myImageView.frame) 12(中略) 13 // ScrollViewにcontentSizeを設定する. 14 descriptionScrollView.contentSize = myImageView.frame.size //シンプルに! 15(後略)

投稿2016/09/30 01:08

編集2016/09/30 01:11
fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問