我已经在这个问题上困了将近一个星期了。我甚至还还原了我的代码并编写了与一些教程相同的代码,但我似乎无法将我的UICollectionView显示在视图中。我的视图控制器中还有很多其他代码,所以我将显示与UICollectionView相关的代码。这就是我目前所拥有的:
视图控制器:

class UARTModuleViewController: UIViewController, CBPeripheralManagerDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupMenuBar()
    }

    let menuBar: MenuBar = {
        let mb = MenuBar()
        return mb
    }()

    private func setupMenuBar() {
        view.addSubview(menuBar)
        let horizontalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
        let verticalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0(100)]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
        view.addConstraints(horizontalConstraint)
        view.addConstraints(verticalConstraint)
    }
}

梅努巴尔·斯威夫特:
class MenuBar : UIView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    lazy var collectionView : UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = UIColor.red
        cv.dataSource = self
        cv.delegate = self
        return cv
    }()

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

        self.addSubview(collectionView)
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")

        //took out constraints here just to make the warning mentioned below easier to follow.
    }

我确实实现了我的协议,但我添加这些协议并不是为了节省我发布的代码量。在加载UARTModuleViewController后,我确实收到此警告:
[LayoutConstraints]无法同时满足约束。
我试过推理,但似乎没有找到解决办法。我也有一个cell类,但认为没有必要包含它,因为我无法显示UICollectionView我唯一可以补充的是,我在故事板中添加的视图中间有一个UIImageView并对其进行了限制,例如:ios - UICollectionView未显示以查看-LMLPHP
有人对我可能做错什么有什么建议吗提前感谢您的帮助或建议。

最佳答案

根据评论:
首先,每次在代码中使用约束时,必须将translatesAutoresizingMaskIntoConstraints = false设置为要添加约束的视图。
您不会告诉集合视图填充整个MenuBar空间。
应用于MenuBarsetupMenuBar的约束不能确定视图的大小和位置。
这些更改应该应用于告诉MenuBar填充宽度、60 pt高度和屏幕底部的位置:

private func setupMenuBar() {
    view.addSubview(menuBar)
    menuBar.translatesAutoresizingMaskIntoConstraints = false // this will make your constraint working
    menuBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true // every constraint must be enabled.
    menuBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
    menuBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    menuBar.heightAnchor.constraint(equalToConstant: 60).isActive = true
}

要让集合视图填充整个MenuBar视图,请使用MenuBarinit(frame:)方法执行此操作:
override init(frame: CGRect) {
    super.init(frame: frame)

    self.addSubview(collectionView)
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")

    collectionView.translatesAutoresizingMaskIntoConstraints = false
    collectionView.topAnchor.constraint(equalTo: topAnchor).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    collectionView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
    collectionView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true

    //took out constraints here just to make the warning mentioned below easier to follow.
}

正如您在我的代码中看到的,我通常使用“锚定”方法来应用约束,因为它比可视化格式更容易。

关于ios - UICollectionView未显示以查看,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53453124/

10-12 14:38