约束 UIView 内的标签,该标签位于可扩展 collectionViewCell 内

Posted

技术标签:

【中文标题】约束 UIView 内的标签,该标签位于可扩展 collectionViewCell 内【英文标题】:constrain a label inside of a UIView which is inside of a expandable collectionViewCell 【发布时间】:2020-01-02 08:21:05 【问题描述】:

我在 Xcode 中有一个可展开/可折叠的单元格,我正在尝试执行标题中所说的操作。当我展开单元格时,文本在单元格内部居中,我不知道为什么,因为我将标签限制在 UIView 内部。我会在下面留下代码,

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

    addSubview(SubView)
    SubView.anchors(top: topAnchor, topPad: 0, bottom: nil, bottomPad: 0, left: leftAnchor, leftPad: 0, right: rightAnchor, rightPad: 0, height: 80, width: self.bounds.width - 20)

    SubView.addSubview(textField)
    textField.anchor(top: SubView.topAnchor, leading: leadingAnchor, bottom: bottomAnchor, trailing: trailingAnchor, padding: .init(top: 0, left: 0, bottom: 0, right: 0))
    textField.centerYAnchor.constraint(equalTo: SubView.centerYAnchor).isActive = true
    textField.centerXAnchor.constraint(equalTo: SubView.centerXAnchor).isActive = true
    textField.translatesAutoresizingMaskIntoConstraints = false


这就是我创建锚点和 addSubview 的方式。

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
   let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "profCell", for: indexPath) as! profCell


    if indexPath.row == 0 

        cell.textField.text = "Skills & Preferences"


     else if indexPath.row == 1  

        cell.textField.text = "Bio"


     else if indexPath.row == 2  

        cell.textField.text = "Reviews"

    

    return cell

这就是我尝试创建标签文本的方式。我将留下两张图片来显示我的要求。

这就是我希望单元格在展开时的样子。

当它展开时,标签会移动到单元格的中心。

感谢大家的帮助!

【问题讨论】:

【参考方案1】:

您需要了解一点自动布局约束。如果您使用LeadingTrailingTop & Bottom 约束,则不需要添加Center X & Center Y 锚。但是,即使您添加了那些无关紧要的约束,您也需要非常小心,以免它们相互冲突。为此,您需要将其中一些设置为 优先级约束,同时将一些设置为 优先级约束或使它们 更大/相等 或 less/equal 而不是明确的equal。这是一个我无法在SO 中完全理解的话题。

其次,您已将leadingbottomtrailing 约束固定到UITableViewCell 本身的contentView,这与您的预期不符。你要么

    在此处将其更改为限制textField 相对于SubView 的锚点:

    textField.anchor(top: SubView.topAnchor, leading: SubView.leadingAnchor, 
                     bottom: SubView.bottomAnchor, trailing: SubView.trailingAnchor, 
                     padding: .init(top: 0, left: 0, bottom: 0, right: 0))
    

    并完全删除那些textField.centerXAnchortextField.centerYAnchor

或者

    删除设置leadingtrailingtopbottom约束的行,只保留中心约束。

注意:使用camelCased 标识符作为属性。

【讨论】:

以上是关于约束 UIView 内的标签,该标签位于可扩展 collectionViewCell 内的主要内容,如果未能解决你的问题,请参考以下文章

如何使第一行标签位于另一个 UIView 的同一中心位置

你如何自动布局约束按钮内的通知标签?

冲突约束 - 超级视图内的单个标签

UIView 元素布局约束

如何向 UICollectionView 标头中的标签添加约束?

对子类 UIView 的约束会抛出以编程方式创建的 UILabel 位置