约束 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】:您需要了解一点自动布局约束。如果您使用Leading
、Trailing
、Top
& Bottom
约束,则不需要添加Center X
& Center Y
锚。但是,即使您添加了那些无关紧要的约束,您也需要非常小心,以免它们相互冲突。为此,您需要将其中一些设置为 低 优先级约束,同时将一些设置为 高 优先级约束或使它们 更大/相等 或 less/equal 而不是明确的equal。这是一个我无法在SO 中完全理解的话题。
其次,您已将leading
、bottom
和trailing
约束固定到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.centerXAnchor
和textField.centerYAnchor
。
或者
-
删除设置
leading
、trailing
、top
和bottom
约束的行,只保留中心约束。
注意:使用camelCased
标识符作为属性。
【讨论】:
以上是关于约束 UIView 内的标签,该标签位于可扩展 collectionViewCell 内的主要内容,如果未能解决你的问题,请参考以下文章