如何将 UICollectionView 放在 stackView 中?

Posted

技术标签:

【中文标题】如何将 UICollectionView 放在 stackView 中?【英文标题】:How can I put UICollectionViews in stackView? 【发布时间】:2019-08-17 14:01:56 【问题描述】:

我想像这张图片一样将 3 个 collectionViews 放在 stackViews 中。但是,当我模拟它时,我看不到我设计的 collectionViews。

Here is my Design. 3 CollectionViews in StackView

过去,我曾尝试过此站点CollectionView Disappears within StackView (Swift) 的此解决方案。但是,它不起作用。

class SecondViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource 
    let tcells:Int = 3, pcells:Int = 4
    var p1name:String = " ", p2name:String = " "
    var binScore: Array<Int> = [0,0,0,0]
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        if collectionView == timerReset 
            return tcells
        
        return pcells
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        if collectionView == p1board 
            if let p1nc: p1Name = collectionView.dequeueReusableCell(withReuseIdentifier: "p1Name", for: indexPath) as? p1Name
                p1nc.p1n.text! = p1name
                return p1nc
            
            if let p1jc: p1Judge = collectionView.dequeueReusableCell(withReuseIdentifier: "p1Judge", for: indexPath) as? p1Judge 
                return p1jc
            
            if let p1sc: p1Score = collectionView.dequeueReusableCell(withReuseIdentifier: "p1Score", for: indexPath) as? p1Score 
                return p1sc
            
        
        else if collectionView == p2board 
            if let p2nc: p2Name = collectionView.dequeueReusableCell(withReuseIdentifier: "p2Name", for: indexPath) as? p2Name
                p2nc.p2n.text! = p2name
                return p2nc
            
            if let p2jc: p2Judge = collectionView.dequeueReusableCell(withReuseIdentifier: "p2Judge", for: indexPath) as? p2Judge 
                return p2jc
            
            if let p2sc: p2Score = collectionView.dequeueReusableCell(withReuseIdentifier: "p2Score", for: indexPath) as? p2Score 
                return p2sc
            
        
        else 
            if let mtm: matchTimer = collectionView.dequeueReusableCell(withReuseIdentifier: "matchTimer", for: indexPath) as? matchTimer
                return mtm
            
            if let gtm: groundTimer = collectionView.dequeueReusableCell(withReuseIdentifier: "groundTimer", for: indexPath) as? groundTimer 
                return gtm
            
            if let rbtn: resetBtn = collectionView.dequeueReusableCell(withReuseIdentifier: "resetBtn", for: indexPath) as? resetBtn 
                return rbtn
            
        
        return UICollectionViewCell()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    @IBOutlet weak var timerView: UIStackView!
    @IBOutlet weak var p1board: UICollectionView! // left side
    @IBOutlet weak var timerReset: UICollectionView! // mid
    @IBOutlet weak var p2board: UICollectionView! // right side

    override func viewDidLoad() 
        super.viewDidLoad()

        timerView.addArrangedSubview(p1board)
        timerView.addArrangedSubview(timerReset)
        timerView.addArrangedSubview(p2board)

        NSLayoutConstraint.activate([
            timerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            timerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            timerView.topAnchor.constraint(equalTo: view.topAnchor),
            timerView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            p1board.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.3)
        ])

    

    override var preferredStatusBarStyle: UIStatusBarStyle 
        return .lightContent
    

【问题讨论】:

【参考方案1】:

如果您想以编程方式将约束添加到视图(在本例中为 timerView),您必须这样做:

timerView.translatesAutoresizingMaskIntoConstraints = false

集合视图也需要知道它们的宽度和高度。所以你有两个选择:

1) 为每个集合视图添加高度和宽度约束。

2) 如果您希望集合视图具有相同的宽度,请将堆栈的分布设置为平均填充。

timerView.distribution = .fillEqually

PD:看你的设计,我认为你应该使用三个 TableViews 而不是 CollectionViews。

【讨论】:

如果你不介意,我可以问推荐的书籍、讲座或指南来学习 ios 开发吗? 这是 iOS 11 的,反正我还是推荐它:itunes.apple.com/es/course/developing-ios-11-apps-with-swift/…

以上是关于如何将 UICollectionView 放在 stackView 中?的主要内容,如果未能解决你的问题,请参考以下文章

将 UICollectionView 和 UITableView 放在 iOS 的 UIScrollView 中是一种好习惯吗?

将浮动 UIButton 放在 UICollectionView 之上

具有流式布局的 UICollectionView 不会将多个项目放在一行上

如何堆叠 UICollectionView 部分

如何根据 UITableViewCell 中的内容调整水平 UICollectionView 的高度

UICollectionview 将数据追加到数组 Swift