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

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

ただいまの
回答率

90.45%

  • Swift

    8974questions

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

  • Xcode

    5057questions

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

【Swift,Xcode】スワイプでページをめくるアニメーション

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 917

nekokichi

score 29

右から左にスワイプすると、画面がスライドするようなアニメーションを実装するのが目的です。

UICollectionViewを使用したもので、下記のサイトを参考にしました。

Qiita そのまま使える!iOSアプリを作るためのswiftサンプル集

上記の記事のサンプルコードを見ながら、模写したのですが、
・色が反映されない
・スライドしない
という問題に直面しています。

サンプルコードの方では動作するのでサンプルコードを1度全部コピペしましたが、ダメでした。

Swift4以上では、仕様が変わったのでしょうか?

エラーが1つも起こらないので、解決方法がわからず困っています。

どうかご指摘願います。

import UIKit

class ViewController: UIViewController,UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var collectionView: UICollectionView! {
        didSet {
            collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cell")
        }
    }

    private let dataSource: [UIColor] = [.red, .green, .blue, .cyan, .yellow, .magenta]

    // MARK: - UICollectionViewDataSource

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return dataSource.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        let viewController = UIViewController()
        viewController.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
        viewController.view.backgroundColor = dataSource[indexPath.row]
        cell.addSubview(viewController.view)
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width, height: view.frame.height)
    }
}
import UIKit

class CollectionViewCell: UICollectionViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

}


イメージ説明

イメージ説明

※追記

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        let viewController = UIViewController()
        viewController.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
//        viewController.view.backgroundColor = dataSource[indexPath.row]
        cell.contentView.backgroundColor = dataSource[indexPath.row]
        cell.addSubview(viewController.view)
        return cell
    }


と書きましたが、変わりませんでした。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2018/10/04 17:21

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

0

https://teratail.com/questions/149958の質問と同様かと思いますが、セルにはcontentViewが乗っていて、その上にUIを並べます。背景色を変えたいときも、contentViewの背景色を変えて下さい。

どうしてもセルの背景色を変更することで色を変えたい、ということであれば、contentViewの背景色を透明(.clear)にして下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/04 14:33

    あちらにも同じことを書きましたが、collectionView(_:cellForItemAt:)は呼ばれていますか?
    dataSourceは設定していますか?

    キャンセル

0

スワイプでページめくりしたいのであれば、これでどうですか?
http://docs.fabo.io/swift/
を参考に作りました。

import UIKit

let devWidth  = UIScreen.main.bounds.size.width
let devHeight = UIScreen.main.bounds.size.height

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UIGestureRecognizerDelegate {

    private let dataSource: [UIColor] = [.red, .green, .blue, .cyan, .yellow, .magenta]

    var myCollectionView : UICollectionView!
    var count = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let layout = UICollectionViewFlowLayout()
        layout.itemSize = CGSize(width: 50.0, height: 50.0)
        layout.sectionInset = UIEdgeInsets(top: 16.0, left: 16.0, bottom: 32.0, right: 16.0)
        layout.headerReferenceSize = CGSize(width: 100.0, height: 30.0)

        myCollectionView = UICollectionView(frame: CGRect(x: 0.0, y: 20.0, width:devWidth, height: devHeight - 20.0), collectionViewLayout: layout)
        // Cellに使われるクラスを登録.
        myCollectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell")
        myCollectionView.delegate = self
        myCollectionView.dataSource = self
        myCollectionView.backgroundColor = dataSource[count]
        myCollectionView.isScrollEnabled = true
        self.view.addSubview(myCollectionView)

        // Swipe の判定
        let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeGesture(_:)))
        rightSwipe.direction = .right
        self.view.addGestureRecognizer(rightSwipe)

        let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.swipeGesture(_:)))
        leftSwipe.direction = .left
        self.view.addGestureRecognizer(leftSwipe)
    }


    @objc internal func swipeGesture(_ sender: UISwipeGestureRecognizer) {
        // UIViewアニメーションの設定開始
        UIView.beginAnimations("transition", context: nil)
        UIView.setAnimationDuration(0.5)

        // トランジションアニメーションの設定
        var transition = UIView.AnimationTransition.curlUp

        if sender.direction == .right {
            transition = UIView.AnimationTransition.curlDown
            count = count - 1
            if count < 0 {
                count = dataSource.count - 1
            }
        } else if sender.direction == .left {
            transition = UIView.AnimationTransition.curlUp
            count = count + 1
            if count >= dataSource.count {
                count = 0
            }
        }

        myCollectionView.backgroundColor = dataSource[count]

        UIView.setAnimationTransition(transition, for: self.view, cache: true)
        // UIViewアニメーション開始
        UIView.commitAnimations()
    }

    // Cellが選択された際に呼び出される

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("Num: \(indexPath.row)")
        print("Value:\(collectionView)")
    }
    // Cellの総数を返す
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }
    // Cellに値を設定する
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell : UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath as IndexPath)
        cell.backgroundColor = UIColor.gray
        return cell
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Swift

    8974questions

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

  • Xcode

    5057questions

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