繁体   English   中英

如何通过水平滚动将UICollectionView的流布局更改为垂直列表

[英]How can I change my UICollectionView's Flow Layout to a vertical List with Horizontal Scrolling

基本上,我想创建的是一张表格,其中三个单元格彼此堆叠。 但是,如果有三个以上的单元格,我希望能够在“集合视图”上向左滑动以显示更多的单元格。 这是一张图片来说明。 在此处输入图片说明

现在,我将单元格排列在一个列表中,但是由于某种原因,我似乎无法更改滚动方向。 -他们仍然垂直滚动

这是我当前的流布局代码:

注意:我不会在视图控制器中包含Collection View代码,因为我认为它不相关。

导入Foundation导入UIKit

class HorizontalListCollectionViewFlowLayout: UICollectionViewFlowLayout {

     let itemHeight: CGFloat = 35





    func itemWidth() -> CGFloat {
        return collectionView!.frame.width
    }

    override var itemSize: CGSize {
        set {
            self.itemSize = CGSize(width: itemWidth(), height: itemHeight)
        }
        get {
            return CGSize(width: itemWidth(), height: itemHeight)
        }
    }

    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
        return collectionView!.contentOffset
    }

    override var scrollDirection: UICollectionViewScrollDirection {

        set {
            self.scrollDirection = .horizontal

        } get {

            return self.scrollDirection
        }
    }


}

如果您的单元格大小正确,则“水平流布局”将完全按照您想要的...向下填充。

这是一个简单的示例(只需将视图控制器设置为此类-无需IBOutlets):

//
//  ThreeRowCViewViewController.swift
//
//  Created by Don Mag on 6/20/17.
//

import UIKit

private let reuseIdentifier = "LabelItemCell"

class LabelItemCell: UICollectionViewCell {
    // simple CollectionViewCell with a label

    @IBOutlet weak var theLabel: UILabel!

    let testLabel: UILabel = {
        let label = UILabel()
        label.font = UIFont.systemFont(ofSize: 14)
        label.textColor = UIColor.black
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        addViews()
    }

    func addViews(){
        addSubview(testLabel)
        testLabel.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 8.0).isActive = true
        testLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor, constant: 0.0).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

class ThreeRowCViewViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    // 3 gray colors for the rows
    let cellColors = [
        UIColor.init(white: 0.9, alpha: 1.0),
        UIColor.init(white: 0.8, alpha: 1.0),
        UIColor.init(white: 0.7, alpha: 1.0)
    ]

    var theCodeCollectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // height we'll use for the rows
        let rowHeight = 30

        // just picked a random width of 240
        let rowWidth = 240

        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()

        // horizontal collection view direction
        layout.scrollDirection = .horizontal

        // each cell will be the width of the collection view and our pre-defined height
        layout.itemSize = CGSize(width: rowWidth - 1, height: rowHeight)

        // no item spacing
        layout.minimumInteritemSpacing = 0.0

        // 1-pt line spacing so we have a visual "edge" (with horizontal layout, the "lines" are vertical blocks of cells
        layout.minimumLineSpacing = 1.0

        theCodeCollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
        theCodeCollectionView.dataSource = self
        theCodeCollectionView.delegate = self
        theCodeCollectionView.register(LabelItemCell.self, forCellWithReuseIdentifier: reuseIdentifier)
        theCodeCollectionView.showsVerticalScrollIndicator = false

        // set background to orange, just to make it obvious
        theCodeCollectionView.backgroundColor = .orange

        theCodeCollectionView.translatesAutoresizingMaskIntoConstraints = false

        self.view.addSubview(theCodeCollectionView)

        // set collection view width x height to rowWidth x (rowHeight * 3)
        theCodeCollectionView.widthAnchor.constraint(equalToConstant: CGFloat(rowWidth)).isActive = true
        theCodeCollectionView.heightAnchor.constraint(equalToConstant: CGFloat(rowHeight * 3)).isActive = true

        // center the collection view
        theCodeCollectionView.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0).isActive = true
        theCodeCollectionView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0.0).isActive = true

    }

     func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 12
    }

     func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! LabelItemCell

        cell.backgroundColor = cellColors[indexPath.row % 3]
        cell.testLabel.text = "\(indexPath)"

        return cell
    }

}

我将“启用分页”部分交给您:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM