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

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

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

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

Q&A

解決済

1回答

1294閲覧

UIScrollView ページ スクロールによる画像の表示

shuyaaa

総合スコア22

Swift

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

0グッド

1クリップ

投稿2019/03/14 23:40

編集2019/03/23 19:50

サーバから画像をアルバム形式で取得してその一覧を表示させたのちに、タップされた画像を最初に表示させ残りの画像はスクロールによって表示させたいです。
しルによる画像変更はできるのですが、どの画像をタップしても一枚めの画像が表示されてしまいます。
どこの記述をどのように変えれば良いのでしょうか。

swift

1import UIKit 2 3class image_detailViewController: UIViewController { 4 5 //タップされた画像 6 var recieve_touch_image: UIImage? 7 //アルバム一覧の配列 8 var recieve_image_list: Array<UIImage> = [] 9 10 // ScrollScreenの高さ 11 var scrollScreenHeight:CGFloat! 12 // ScrollScreenの幅 13 var scrollScreenWidth:CGFloat! 14 15 var pageNum:Int! 16 17 var imageWidth:CGFloat! 18 var imageHeight:CGFloat! 19 var screenSize:CGRect! 20 21 @IBOutlet weak var image: UIImageView! 22 @IBOutlet weak var scrView: UIScrollView! 23 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 28 // 下向きにスワイプした時のジェスチャーを作成 29 let downSwipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(self.closeModalView)) 30 downSwipeGesture.direction = .down 31 32 // 画面にジェスチャーを登録 33 view.addGestureRecognizer(downSwipeGesture) 34 35 36 screenSize = UIScreen.main.bounds 37 38 // ページスクロールとするためにページ幅を合わせる 39 scrollScreenWidth = screenSize.width 40 41 let imageTop:UIImage = recieve_touch_image! 42 pageNum = recieve_image_list.count 43 44 imageWidth = imageTop.size.width 45 imageHeight = imageTop.size.height 46 scrollScreenHeight = scrollScreenWidth * imageHeight/imageWidth 47 48 for i in 0 ..< pageNum { 49 // UIImageViewのインスタンス 50 let image:UIImage = recieve_image_list[i] 51 let imageView = UIImageView(image:image) 52 53 var rect:CGRect = imageView.frame 54 rect.size.height = scrollScreenHeight 55 rect.size.width = scrollScreenWidth 56 57 imageView.frame = rect 58 imageView.tag = i + 1 59 60 // UIScrollViewのインスタンスに画像を貼付ける 61 self.scrView.addSubview(imageView) 62 63 } 64 65 setupScrollImages() 66 67 } 68 69 func setupScrollImages(){ 70 71 // ダミー画像 72 let imageDummy:UIImage = recieve_touch_image! 73 var imgView = UIImageView(image:imageDummy) 74 var subviews:Array = scrView.subviews 75 76 // 描画開始の x,y 位置 77 var px:CGFloat = 0.0 78 let py:CGFloat = (screenSize.height - scrollScreenHeight)/2 79 80 for i in 0 ..< subviews.count { 81 imgView = subviews[i] as! UIImageView 82 if (imgView.isKind(of: UIImageView.self) && imgView.tag > 0){ 83 84 var viewFrame:CGRect = imgView.frame 85 viewFrame.origin = CGPoint(x: px, y: py) 86 imgView.frame = viewFrame 87 88 px += (scrollScreenWidth) 89 90 } 91 } 92 // UIScrollViewのコンテンツサイズを画像のtotalサイズに合わせる 93 let nWidth:CGFloat = scrollScreenWidth * CGFloat(pageNum) 94 scrView.contentSize = CGSize(width: nWidth, height: scrollScreenHeight) 95 96 } 97 98 override func didReceiveMemoryWarning() { 99 super.didReceiveMemoryWarning() 100 // Dispose of any resources that can be recreated. 101 } 102 103 104 105 // 画面を閉じる 106 @objc func closeModalView() { 107 dismiss(animated: true, completion: nil) 108 } 109 110 111} 112

例えば、以下のように画像の一覧があり(var recieve_image_list: Array<UIImage> = [])、
イメージ説明
どの画像をタップしても(var recieve_touch_image: UIImage?)
イメージ説明
といいう一番左の画像が表示されてしまいます。

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

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

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

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

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

fuzzball

2019/03/15 02:03 編集

「一番左の画像」だと思った根拠を書いて下さい。一番右の可能性はないですか? もっと分かりやすい画像でテストした方がいいです。(画像を使用せず背景色を変えるのがお手軽)
shuyaaa

2019/03/23 19:52

例として使うには不適切な画像でしたので訂正させていただいました。
fuzzball

2019/03/25 00:20

Aをタップすれば [A] B C Bをタップすれば A [B] C Cをタップすれば A B [C] となればいいということですかね?(括弧の付いてる画面が初期画面)
shuyaaa

2019/03/25 09:51

ご返信ありがとうございます。 その通りです。その動きを期待しているのですが、どのようなアルゴリズムを組めば良いのかわからなく、質問させていただきました。 説明不足ですみませんでした。
fuzzball

2019/03/25 09:56

それならtakabosoftさんの回答の通りです。contentOffsetを設定して下さい。
guest

回答1

0

ベストアンサー

質問の内容がよくわかりませんが、

期待する動きとしては、
「タップした画像が見えるようにスクロール位置が設定されている」で、
現実は
「スクロール位置が初期値のまま」
という感じでしょうか?

であれば、スクロール位置の初位置を設定していないように見えますので、設定してください。
その場合、UIScrollViewのcontentOffsetプロパティをいじれば良いかなと思います。

投稿2019/03/15 00:40

takabosoft

総合スコア8356

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

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

shuyaaa

2019/03/15 01:03

質問内容の記述が下手で申し訳ございません。 期待する動きは 「タップされた画像をまず表示して、ほかのアルバムにある画像は配列順にスクロールで見ることができる。」で、 現実は 「スクロールして他の画像を見ることはできるが、一枚目に表示されるのはタップした画像でなく、配列の一枚目の画像が表示されてしまう」
takabosoft

2019/03/15 01:08

配列の画像を並べているだけで、 recieve_touch_imageを1番目に表示するように組んでませんよね? そこを変えてください。 ちなみに、アルバムにA,B,Cと画像があって、Bをタップしたら B,A,Cと並べて表示したいのか、B,A,B,Cと表示したいのか、その他なのかどれでしょう?
shuyaaa

2019/03/15 01:35

ご返信ありがとうございます。 「ちなみに、アルバムにA,B,Cと画像があって、Bをタップしたら B,A,Cと並べて表示したいのか、B,A,B,Cと表示したいのか、その他なのかどれでしょう?」 についてですが、タッチされた画像を一枚めに表示し、順番はrecieve_image_listのまま、つまりA,B,Cと並べて表示したいです。 receive_touch_image(B)を1枚目に表示されるようにrecieve_image_listの配列の順番を変えると(B、C、A)Bの画像を表示した後、左スクロールでAの画像が表示されませんでした。 お手数おかけして申し訳ございません。
takabosoft

2019/03/15 01:41

うーん、すみませんが、何をしたいのか、何が課題なのかが私には読み取れません。。
takabosoft

2019/03/15 01:50 編集

recieve_touch_imageに画像B, recieve_image_listに画像A,B,C が入っていたら 画面にはB,A,B,Cと並べて表示したいんじゃないんでしょうかね? (コメント編集してちょっと順番変えました)
shuyaaa

2019/03/23 19:59

ご返信遅くなり申し訳ございません。 ご質問の 「recieve_touch_imageに画像B, recieve_image_listに画像A,B,C が入っていたら 画面にはB,A,B,Cと並べて表示したいんじゃないんでしょうかね?」 ということですが、この並びだと順番が保持されなく、Bを表示した後、右スクロールでAが表示されてしまいました。 期待する動きは、例えばタップされたBを表示した後、左にスクロールするとA、右にスクロースするとC、といった形にしたいです。 また最初の方の質問にあった 「配列の画像を並べているだけで、 recieve_touch_imageを1番目に表示するように組んでませんよね? そこを変えてください。」 ですが、確かに配列の画像を並べているだけでrecieve_touch_imageを1番目に表示するように組んでいなく、この解決方法が考えられませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問