Swift 如何设置带分页的水平UICollectionView,但每页的项目从左到右排列&;自上而下

Swift 如何设置带分页的水平UICollectionView,但每页的项目从左到右排列&;自上而下,swift,uicollectionview,Swift,Uicollectionview,我已经完成了水平UICollectionView页面的设置,但目前每页的项目是从上到下和从左到右排列的,现在我希望项目是从左到右和从上到下排列的 例如: 目前: page 1 page 2 cell 1 | cell 3 || cell 5 | cell 7 cell 2 | cell 4 || cell 6 | cell 8 我的预期: page 1 page 2 cell 1 | cell 2 || cell 5

我已经完成了水平UICollectionView页面的设置,但目前每页的项目是从上到下和从左到右排列的,现在我希望项目是从左到右和从上到下排列的

例如:

目前:

      page 1             page 2
 cell 1 | cell 3 || cell 5 | cell 7
 cell 2 | cell 4 || cell 6 | cell 8
我的预期:

      page 1             page 2
 cell 1 | cell 2 || cell 5 | cell 6
 cell 3 | cell 4 || cell 7 | cell 8
我已经找到了很多天的解决方案,但在SWIFT中对我的案例没有任何结果


这是我的截图:


我在git上的源代码:


谢谢你的帮助

创建自定义集合视图单元格,该单元格采用由四个模型组成的数组:

|项目1 |项目2|

|项目3 |项目4|

为您的收藏视图注册它。使用数据对其进行配置(设置项1使用模型数组的第一个元素,第二个使用模型数组的第二个元素…)

现在,您的集合有2个单元格和2个模型阵列,以防您描述:

单元1:

|项目1 |项目2|

|项目3 |项目4|

单元2:

|项目5 |项目6|

|项目7 |项目8|

模型1:[项目1的数据、项目2的数据、项目3的数据、项目4的数据]

模型2:[项目5的数据、项目6的数据、项目7的数据、项目8的数据]

//////////////////////

另一个更简单的解决方案是重新安排数据源:

[data1,data2,data3,data4,data5,data6,data7,data8]

-->

[data1,data3,data2,data4,data5,data7,data6,data8]

用于重新排列的代码(适用于单个页面中包含4个元素的自定义案例,!非通用!):

<代码>导入基础 func重新排列(u数据:[Int])->[Int]{ var结果=数据 变量i=0 而i+1谢谢你的好主意!你救了我的命。但我不知道如何加载动态项。(项目将从服务器加载并显示到collectionview,我们不知道将显示多少项目)。你能帮我做一个演示吗?我没有时间写演示(对不起),但我已经写了一个重新排列数据源的代码(编辑的答案)。它只打印重新排列的数据,但您可以随意使用。感谢您的支持,我很喜欢在每页中重新排列项目的问题。在GitHub上查看我的结果:再次感谢@Levan Karanadze
//
//  ViewController.swift
//  CollectionView
//
//  Created by mac on 6/19/19.
//  Copyright © 2019 lhvan89. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var itemsCollectionView: UICollectionView!
    @IBOutlet weak var pageControl: UIPageControl!

    private let numberOfItemPerpage = 15

    var listItems: [Item] = [
        Item(title: "Behance", image: "behance", badge: 0),
        Item(title: "Deviantart", image: "deviantart", badge: 1),
        Item(title: "Dribbble", image: "dribbble", badge: 2),
        Item(title: "Dropbox", image: "dropbox", badge: 3),
        Item(title: "Facebook", image: "facebook", badge: 4),
        Item(title: "Flickr", image: "flickr", badge: 5),
        Item(title: "Foursquare", image: "foursquare", badge: 6),
        Item(title: "Google-plus", image: "google-plus", badge: 7),
        Item(title: "Instagram", image: "instagram", badge: 8),
        Item(title: "Line", image: "line", badge: 9),
        Item(title: "Linkedin", image: "linkedin", badge: 10),
        Item(title: "Myspace", image: "myspace", badge: 11),
        Item(title: "Path", image: "path", badge: 12),
        Item(title: "Pinterest", image: "pinterest", badge: 13),
        Item(title: "Quora", image: "quora", badge: 14),
        Item(title: "Skype", image: "skype", badge: 15),
        Item(title: "Snapchat", image: "snapchat", badge: 16),
        Item(title: "Soundcloud", image: "soundcloud", badge: 17),
        Item(title: "Spotify", image: "spotify", badge: 18),
        Item(title: "Swarm", image: "swarm", badge: 19),
        Item(title: "Telegram", image: "telegram", badge: 20),
        Item(title: "Tumblr", image: "tumblr", badge: 21),
        Item(title: "Twitter", image: "twitter", badge: 22),
        Item(title: "Viber", image: "viber", badge: 23),
        Item(title: "Vimeo", image: "vimeo", badge: 24),
        Item(title: "Vine", image: "vine", badge: 25),
        Item(title: "Whatsapp", image: "whatsapp", badge: 26),
        Item(title: "Yelp", image: "yelp", badge: 27),
        Item(title: "Youtube", image: "youtube", badge: 28),
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        itemsCollectionView.dataSource = self
        itemsCollectionView.delegate = self

         pageControl.numberOfPages = listItems.count/numberOfItemPerpage + (listItems.count % numberOfItemPerpage == 0 ? 0 : 1)

        // Do any additional setup after loading the view.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        itemsCollectionView.reloadData()
    }
}

extension ViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return listItems.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "itemCollectionViewCell", for: indexPath) as? itemCollectionViewCell else { return UICollectionViewCell() }
        cell.loadData(item: listItems[indexPath.row])
        return cell
    }
}

extension ViewController: UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let x = scrollView.contentOffset.x
        let w = scrollView.bounds.size.width
        let currentPage = Int(ceil(x/w))
        self.pageControl.currentPage = currentPage
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let itemWidth = collectionView.frame.size.width / 3
        let itemHeight = (collectionView.frame.size.height / 5) - 4
        return CGSize(width: itemWidth, height: itemHeight)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

}

import Foundation

func rearranged(_ data: [Int]) -> [Int] {
    var result = data
    var i = 0
    while i + 1 < data.count {
        if (i + 1) % 2 == 0 && (i + 1) % 4 != 0 {
            let tmp = data[i]
            result[i] = result[i + 1]
            result[i + 1] = tmp
            i += 1
        }
        i += 1
    }
    return result
}
var dataFromServer: [Int] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
let data = rearranged(dataFromServer)
print(data)