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

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

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

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

Swift

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

Q&A

解決済

1回答

2045閲覧

Xcode8 スクロールビューでスクロールするたびに画像を取得して表示する

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/01/27 07:12

編集2017/01/27 08:57

数十枚の画像のスライドビューを作成しようと考えています。
一度に全ての画像を取得すると、メモリ不足?でアプリが落ちてしまうので、参考サイトのように表示している画像とその両隣だけ取得しようと考えています。

環境
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

初歩的な質問ですが、よろしくお願いいたします。

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

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

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

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

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

fromageblanc

2017/01/27 08:50

scrollViewDidEndDecelerating()はデリゲートメソッドですよね。@IBActionはとったほうがよいと思いますよ。
退会済みユーザー

退会済みユーザー

2017/01/27 08:58

ご指摘ありがとうございます。修正いたしました。よく理解せずに使用しておりました。。。
guest

回答1

0

ベストアンサー

UICollectionViewの再利用機能を活用してはいかがですか?使い方はUITableViewと同じでreuseIdentifierを指定してセルで再利用するだけでとても似ていますのでこれを機会に勉強してみて下さい。
少し古い記事ですが、こちらが参考になるかと思います。

投稿2017/01/27 12:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/01/30 08:07

ご回答ありがとうございます。 画像を画面いっぱいに表示したいのですが UICollectionViewを使うなら一つのセルを画面サイズに設定する感じでしょうか? また一つの画像をボタンの部分を切り取って モーダル表示のボタンを置いたりすることも可能でしょうか?
退会済みユーザー

退会済みユーザー

2017/01/31 05:46

そんな感じです。とても便利なのでCollectionViewの基本を勉強してみて下さい!
退会済みユーザー

退会済みユーザー

2017/02/01 07:44

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問