编程约束在 UICollectionViewCell Swift 中不起作用

Posted

技术标签:

【中文标题】编程约束在 UICollectionViewCell Swift 中不起作用【英文标题】:Programatically constraint doesn't work inside UICollectionViewCell Swift 【发布时间】:2019-02-06 09:39:56 【问题描述】:

我尝试在UICollectionViewCell 中以编程方式查看,我认为将“以编程方式查看代码”放在UICollectionViewCell 中是明智的。

这是我的代码:

override func awakeFromNib() 
        super.awakeFromNib()

        let view = UIView()
        view.frame = CGRect.zero
        view.backgroundColor = UIColor.black

        self.contentView.addSubview(view)
        self.contentView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            view.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 0),
            view.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: 0),
            view.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: 25),
            view.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 25),
            ])

        self.contentView.layoutIfNeeded()
    

我想知道为什么自动布局不起作用,如果我使用手动CGRect,视图确实出现了。

【问题讨论】:

【参考方案1】:

这解决它只需要设置 view.translatesAutoresizingMaskIntoConstraints = false 不是内容视图

override func awakeFromNib() 
    super.awakeFromNib()

    let view = UIView()
    view.frame = CGRect.zero
    view.backgroundColor = UIColor.black


    self.contentView.addSubview(view)
    view.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        view.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: 0),
        view.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: 0),
        view.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: 25),
        view.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 25),
        ])

【讨论】:

【参考方案2】:

尝试改变 self.contentView.translatesAutoresizingMaskIntoConstraints = false 到: view.translatesAutoresizingMaskIntoConstraints = false

您想关闭您的viewtranslatesAutoresizingMaskIntoConstraints,因为我们要对其应用autolayout

【讨论】:

【参考方案3】:

第一:你不应该调用layoutIfNeeded方法,在你改变规则(约束)后,自动布局循环会为你做这个

第二个:你应该将要布局的视图的translatesAutoresizingMaskIntoConstraints属性设置为false,所以你不应该这样做

self.contentView.translatesAutoresizingMaskIntoConstraints = false

但你应该这样做

view.translatesAutoresizingMaskIntoConstraints = false

这是因为自动调整大小的蒙版约束应用于您的 view,并带有您设置的约束。这可能并且可能会导致约束中断。

如果这没有帮助,则提供带有自动布局错误的控制台输出。

【讨论】:

注意到了。 layoutIfNeeded 的事情非常重要,谢谢伙计

以上是关于编程约束在 UICollectionViewCell Swift 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式创建 UICollectionViewCell

尝试以编程方式实现约束时忽略约束

Android:无法在约束布局中以编程方式正确添加约束集

约束布局中以编程方式添加的按钮将忽略约束 - Android

如何在显示旋转时以编程方式更改布局约束

如何在目标 c 中以编程方式添加约束