サーバから画像をアルバム形式で取得してその一覧を表示させたのちに、タップされた画像を最初に表示させ残りの画像はスクロールによって表示させたいです。
しルによる画像変更はできるのですが、どの画像をタップしても一枚めの画像が表示されてしまいます。
どこの記述をどのように変えれば良いのでしょうか。
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?)
といいう一番左の画像が表示されてしまいます。
「一番左の画像」だと思った根拠を書いて下さい。一番右の可能性はないですか?
もっと分かりやすい画像でテストした方がいいです。(画像を使用せず背景色を変えるのがお手軽)
例として使うには不適切な画像でしたので訂正させていただいました。
Aをタップすれば [A] B C
Bをタップすれば A [B] C
Cをタップすれば A B [C]
となればいいということですかね?(括弧の付いてる画面が初期画面)
ご返信ありがとうございます。
その通りです。その動きを期待しているのですが、どのようなアルゴリズムを組めば良いのかわからなく、質問させていただきました。
説明不足ですみませんでした。
それならtakabosoftさんの回答の通りです。contentOffsetを設定して下さい。
回答1件
あなたの回答
tips
プレビュー