NSLayoutConstraint 边距为零而不是十六

Posted

技术标签:

【中文标题】NSLayoutConstraint 边距为零而不是十六【英文标题】:NSLayoutConstraint margin zero instead of sixteen 【发布时间】:2017-01-11 15:46:16 【问题描述】:

我正在通过代码构建 UICollectionViewCell 界面。一切正常,除了正确的约束。当我运行应用程序时,标题标签的右边距为零。这是我的代码

let titleLabel: UILabel = 
    let label = UILabel()
    label.backgroundColor = UIColor.purple
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
()

func setupViews() 
    addSubview(titleLabel)

    // titleLabel
    // top constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1, constant: 16))
    // left constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1, constant: 8))
    // right constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: 16))
    // height constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .height, relatedBy: .equal, toItem: self, attribute: .height, multiplier: 0, constant: 20))

我认为它与toItem: self 有关,因为selfuilabel,我想将它与UICollectionViewCell 关联起来

【问题讨论】:

添加子视图之前是否加载单元格大小?如果否,则加载单元格,然后运行 ​​setupViews,然后运行 ​​self.setNeedsDisplay()、self.layoutIfNeeded()。如果是,您也可以尝试运行上述功能。 如果你使用-16作为正确的约束常数会发生什么? @vacawama 它有效!怎么样? 【参考方案1】:

问题是约束中项目的顺序。您当前说的是标签在其超级视图的右边缘 16 处。您可以在右约束中切换itemtoItem,或使用-16 作为常量。

所以要么这样:

addConstraint(NSLayoutConstraint(item: self, attribute: .right, relatedBy: .equal, toItem: titleLabel, attribute: .right, multiplier: 1, constant: 16))

或者这个:

addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: -16))

会起作用的。

【讨论】:

工作就像一个魅力!

以上是关于NSLayoutConstraint 边距为零而不是十六的主要内容,如果未能解决你的问题,请参考以下文章

当数组值为零而不是空时,c循环停止

为啥 Fortran HDF5 的无限最大维度参数 (H5S_UNLIMITED_F) 的计算结果为零而不是 -1?

将文本框拉伸到页面的整个宽度,边距为 5px

flex-basis 的列边距为 33.33%? [复制]

检查数据框中的记录数是不是大于零而不使用计数火花

如何只为单元格内的某些视图提供值,同时留下一些零而不崩溃?