数十枚の画像のスライドビューを作成しようと考えています。
一度に全ての画像を取得すると、メモリ不足?でアプリが落ちてしまうので、参考サイトのように表示している画像とその両隣だけ取得しようと考えています。
環境
xcode8.2
swift3
下記サイトの用にスライドビューで画像を表示したいです。
画像の表示はできましたがスライドしたときに新たに画像情報を取得する方法がわかりません。
例えば、スライドして2枚目を表示したときに、1枚目と3枚目を取得する場合です。
現在は3枚の画像を表示し、スクロールするまでしかできていません。
lang
1 2import UIKit 3 4class ViewController: UIViewController, UIScrollViewDelegate { 5 6 @IBOutlet weak var scrollView: UIScrollView! 7 8 // Screenの高さ 9 var screenHeight:CGFloat! 10 // Screenの幅 11 var screenWidth:CGFloat! 12 // ファイル名 13 let fileName: [String] = ["01.jpg", "02.jpg", "03.jpg", .........] 14 15 // 真ん中の画像用インデックス 16 var centerIndex: Int = 0 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 scrollView.delegate = self 21 22 let screenSize: CGRect = UIScreen.main.bounds 23 screenWidth = screenSize.width 24 screenHeight = screenSize.height 25 26 // UIScrollViewのコンテンツサイズを画像のtotalサイズに合わせる 27 let nWidth:CGFloat = screenWidth * CGFloat(3) 28 scrollView.frame.size = CGSize(width: screenWidth, height: screenHeight) 29 scrollView.contentSize = CGSize(width: nWidth, height: screenHeight) 30 31 setupScrollImages() 32 33 } 34 35 override func didReceiveMemoryWarning() { 36 super.didReceiveMemoryWarning() 37 // Dispose of any resources that can be recreated. 38 } 39 40 func setupScrollImages(){ 41 // UIImageViewのインスタンス 42 for i in 0 ..< 3 { 43 var tempIndex:Int = 0; 44 if i == 0 { 45 if self.centerIndex <= 0 { 46 tempIndex = self.fileName.count - 1 47 } else { 48 tempIndex = self.centerIndex - 1 49 } 50 } else if i == 1 { 51 tempIndex = self.centerIndex 52 } else { 53 if self.centerIndex + 1 > self.fileName.count { 54 55 } 56 tempIndex = self.centerIndex + 1 57 } 58 let image:UIImage = UIImage(named:self.fileName[tempIndex])! 59 60 let imageView = UIImageView(image:image) 61 62 var rect:CGRect = imageView.frame 63 rect.size.height = screenHeight 64 rect.size.width = screenWidth 65 imageView.frame = rect 66 imageView.tag = i + 1 67 print(i) 68 // UIScrollViewのインスタンスに画像を貼付ける 69 self.scrollView.addSubview(imageView) 70 } 71 72 // ダミー画像 73 let imageDummy:UIImage = UIImage(named:"01.jpg")! 74 var imgView = UIImageView(image:imageDummy) 75 var subviews:Array = scrollView.subviews 76 77 // 描画開始の x,y 位置 78 var px:CGFloat = 0.0 79 let py:CGFloat = 0.0 80 81 for i in 0 ..< subviews.count { 82 imgView = subviews[i] as! UIImageView 83 if (imgView.isKind(of: UIImageView.self) && imgView.tag > 0){ 84 var viewFrame:CGRect = imgView.frame 85 86 viewFrame.origin = CGPoint(x: px, y: py) 87 imgView.frame = viewFrame 88 89 px += (screenWidth) 90 print(imgView.frame) 91 } 92 } 93 94 } 95 96 @IBAction func scrollViewDidScroll(_ scrollView: UIScrollView) { 97 // スクロール中の処理 98 } 99 100 @IBAction func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 101 // ドラッグ開始時の処理 102 } 103 104 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 105 print("スクロールした") 106 let moveToX:CGFloat = scrollView.contentOffset.x 107 print(moveToX) 108 if moveToX == scrollView.frame.size.width { 109 print("そのまま") 110 } else if moveToX <= 0 { 111 print("左に移動") 112 } else { 113 print("右に移動") 114 } 115 } 116 117} 118
初歩的な質問ですが、よろしくお願いいたします。
scrollViewDidEndDecelerating()はデリゲートメソッドですよね。@IBActionはとったほうがよいと思いますよ。
ご指摘ありがとうございます。修正いたしました。よく理解せずに使用しておりました。。。
回答1件
あなたの回答
tips
プレビュー