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

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

ただいまの
回答率

90.53%

  • Swift

    7217questions

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

  • Xcode

    4086questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 392
退会済みユーザー

退会済みユーザー

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

環境
xcode8.2
swift3

下記サイトの用にスライドビューで画像を表示したいです。

参考サイト

画像の表示はできましたがスライドしたときに新たに画像情報を取得する方法がわかりません。
例えば、スライドして2枚目を表示したときに、1枚目と3枚目を取得する場合です。

現在は3枚の画像を表示し、スクロールするまでしかできていません。

import UIKit

class ViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var scrollView: UIScrollView!

    // Screenの高さ
    var screenHeight:CGFloat!
    // Screenの幅
    var screenWidth:CGFloat!
    // ファイル名
    let fileName: [String] = ["01.jpg", "02.jpg", "03.jpg", .........]

    // 真ん中の画像用インデックス
    var centerIndex: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView.delegate = self

        let screenSize: CGRect = UIScreen.main.bounds
        screenWidth = screenSize.width
        screenHeight = screenSize.height

        // UIScrollViewのコンテンツサイズを画像のtotalサイズに合わせる
        let nWidth:CGFloat = screenWidth * CGFloat(3)
        scrollView.frame.size = CGSize(width: screenWidth, height: screenHeight)
        scrollView.contentSize = CGSize(width: nWidth, height: screenHeight)

        setupScrollImages()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func setupScrollImages(){
        // UIImageViewのインスタンス
        for i in 0 ..< 3 {
            var tempIndex:Int = 0;
            if i == 0 {
                if self.centerIndex <= 0 {
                    tempIndex = self.fileName.count - 1
                } else {
                    tempIndex = self.centerIndex - 1
                }
            } else if i == 1 {
                tempIndex = self.centerIndex
            } else {
                if self.centerIndex + 1 > self.fileName.count {

                }
                tempIndex = self.centerIndex + 1
            }
            let image:UIImage = UIImage(named:self.fileName[tempIndex])!

            let imageView = UIImageView(image:image)

            var rect:CGRect = imageView.frame
            rect.size.height = screenHeight
            rect.size.width = screenWidth
            imageView.frame = rect
            imageView.tag = i + 1
            print(i)
            // UIScrollViewのインスタンスに画像を貼付ける
            self.scrollView.addSubview(imageView)
        }

        // ダミー画像
        let imageDummy:UIImage = UIImage(named:"01.jpg")!
        var imgView = UIImageView(image:imageDummy)
        var subviews:Array = scrollView.subviews

        // 描画開始の x,y 位置
        var px:CGFloat = 0.0
        let py:CGFloat = 0.0

        for i in 0 ..< subviews.count {
            imgView = subviews[i] as! UIImageView
            if (imgView.isKind(of: UIImageView.self) && imgView.tag > 0){
                var viewFrame:CGRect = imgView.frame

                viewFrame.origin = CGPoint(x: px, y: py)
                imgView.frame = viewFrame

                px += (screenWidth)
                print(imgView.frame)
            }
        }

    }

    @IBAction func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // スクロール中の処理
    }

    @IBAction func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        // ドラッグ開始時の処理
    }

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        print("スクロールした")
        let moveToX:CGFloat = scrollView.contentOffset.x
        print(moveToX)
        if moveToX == scrollView.frame.size.width {
            print("そのまま")
        } else if moveToX <= 0 {
            print("左に移動")
        } else {
            print("右に移動")
        }
    }

}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fromageblanc

    2017/01/27 17:50

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/01/27 17:58

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

    キャンセル

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/30 17:07

    ご回答ありがとうございます。

    画像を画面いっぱいに表示したいのですが
    UICollectionViewを使うなら一つのセルを画面サイズに設定する感じでしょうか?

    また一つの画像をボタンの部分を切り取って
    モーダル表示のボタンを置いたりすることも可能でしょうか?

    キャンセル

  • 2017/01/31 14:46

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

    キャンセル

  • 2017/02/01 16:44

    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7217questions

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

  • Xcode

    4086questions

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