不可滚动的多个集合视图

时间:2018-02-21 11:40:44

标签: ios swift uicollectionview

我正在尝试开发一个iOS应用程序,它有03个UICollectionViews由同一个ViewController处理。 (我之所以选择03 UICollectionViews而不是选择部分和不同原型单元的原因是因为我可能需要在将来添加与这些部分之间的集合视图无关的其他内容)

 ________________
|  _   _
| | | | |
| |_| |_| . . .  (UICollectionView1)
|_______________

 _______________
|  _   _
| | | | |
| |_| |_| . . .  (UICollectionView2)
|_______________

我的问题如下:

每个CollectionViews中的单元格中没有一个是可变的,如果数量超过宽度约束,它就会变形(到目前为止一直很好)。但是,如果单元格数导致超出高度约束,则UICollectionView的高度约束会导致滚动条出现而不是简单地布置单元格

我尝试过一些方法来实现这一点,其中大部分内容都围绕以下问题提供的建议

how to set dynamic height of a Collection View, the 'view' not the 'cells'?

How to adjust height of UICollectionView to be the height of the content size of the UICollectionView?

最后我尝试了这个

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

但是随后UICollectionViewCell中的内容非常紧张,仍然存在滚动问题。

我不介意视图控制器的主视图(放置所有其他UICollectionViews的视图)变得可滚动(实际上这是需求的一部分),我只是不希望UICollectionViews像某些行为一样HTML iframe并允许滚动,但只是按照UICollectionView的宽度约束布局单元格

在伪代码中,类似这样的东西

array = (cell1, cell2, cell3)
for i in array 
    if currentCollectionViewRow is filled
       wrapToNextLine()
    add cell{i} to view controller

感谢任何帮助。甚至帮助提出更好的方法来实现此功能以及最佳实践而不是黑客代码

修改

我执行了@Saad Chaudhry提到的指示,但无济于事。我的布局如下:CollectionView Layout

如您所见,堆栈视图按照建议包含两个集合视图。现在,IDE提出了以下抱怨:Ambiguous Layout

我尝试直观地添加约束,然后尝试使用IDE选项自动添加约束无济于事。大多数情况下,屏幕上没有数据单元格。

有关更多信息,没有堆栈视图,只有两个集合视图,我得到以下模拟:Without Stack Views

使用堆栈视图我得到模拟:With stack views并注意缺少第二个集合视图

如果我然后将堆栈视图约束为0,0,0,0,则会返回每个集合视图高度不明确的问题。如果单元格数量很大(来自数据源),提供高度会导致“在该集合视图中”滚动。

我只想首先渲染所有黑色方块,然后再渲染黄色方块。父视图可以滚动,而且不是单个集合视图

我的控制器代码:

import UIKit

class DemoCollectionViewController: UICollectionViewController {

    @IBOutlet weak var nonPriorityCollectionView: UICollectionView!
    @IBOutlet weak var priorityCollectionView: UICollectionView!

    private let reuseIdentifier = "priorityCell"
    fileprivate let sectionInsets = UIEdgeInsets(top: 50.0, left: 20.0, bottom: 50.0, right: 20.0)
    fileprivate var priorityItems = [PriorityItem]()
    fileprivate let itemsPerRow: CGFloat = 3

    private let nonPriorityReuseIdentifier = "nonPriorityCell"
    fileprivate var nonPriorityItems = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
        self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: nonPriorityReuseIdentifier)

        loadPriorityItems()
        loadNonPriorityItems()
    }

    func loadPriorityItems(){
        let item1 = PriorityItem(image: #imageLiteral(resourceName: "User"))
        let item2 = PriorityItem(image: #imageLiteral(resourceName: "User"))
        let item3 = PriorityItem(image: #imageLiteral(resourceName: "User"))
        let item4 = PriorityItem(image: #imageLiteral(resourceName: "User"))

        priorityItems = [item1, item2, item3, item4, item1, item2, item3, item4]
    }

    func loadNonPriorityItems(){
        let item1 = "Item 1"
        let item2 = "Item 2"
        let item3 = "Item 3"
        let item4 = "Item 4"

        nonPriorityItems = [item1, item2, item3, item4]
    }
}

// MARK: UICollectionViewDataSource
extension DemoCollectionViewController {

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if collectionView == self.priorityCollectionView {
            return priorityItems.count
        }
        else{
            return nonPriorityItems.count
        }
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if collectionView == self.priorityCollectionView {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
            cell.backgroundColor = UIColor.black
            return cell
        } else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: nonPriorityReuseIdentifier, for: indexPath)
            cell.backgroundColor = UIColor.yellow
            return cell
        }
    }
}

extension DemoCollectionViewController : UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let paddingSpace = sectionInsets.left * (itemsPerRow + 1)
        let availableWidth = view.frame.width - paddingSpace
        let widthPerItem = availableWidth / itemsPerRow

        return CGSize(width: widthPerItem, height: widthPerItem)
    }

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        insetForSectionAt section: Int) -> UIEdgeInsets {
        return sectionInsets
    }

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

请帮我弄清楚这个问题。我现在觉得由于我面临的复杂性,集合视图不是实现这一目标的理想方式......

0 个答案:

没有答案