UILabel 具有来自编程约束的内部填充

Posted

技术标签:

【中文标题】UILabel 具有来自编程约束的内部填充【英文标题】:UILabel has internal padding from programmatic constraints 【发布时间】:2016-10-10 00:44:02 【问题描述】:

所以,我不知道为什么会发生这种情况,但这里有一张描述它的图片。

如果你看绿色背景的 UILabel,上面和下面都有填充,但我不知道这是为什么。

这就是我创建它的方式:

var bodyLabel: ActiveLabel = 
    let label = ActiveLabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.isUserInteractionEnabled = false
    label.backgroundColor = .green
    label.numberOfLines = 0
    label.textColor = .darkGray
    label.font = UIFont.systemFont(ofSize: MessageTableViewCell.defaultFontSize())

    label.enabledTypes = [.mention]
    label.mentionColor = .gray //Figure this out

    return label
()

它是一个 ActiveLabel 的事实并不是发生这种情况的原因。

以下是它所涉及的所有约束:

self.contentView.addSubview(self.thumbnailView)
self.contentView.addSubview(self.titleLabel)
self.contentView.addSubview(self.bodyLabel)
self.contentView.addSubview(self.likeView)

let views = ["thumbnailView" : self.thumbnailView,
                 "titleLabel" : self.titleLabel,
                 "bodyLabel" : self.bodyLabel,
                 "likeView"  : self.likeView] as [String : Any]

let metrics = ["tumbSize" : Constants.kMessageTableViewCellAvatarHeight,
                   "padding" : 15,
                   "right" : 10,
                   "left" : 5]

self.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-left-[thumbnailView(tumbSize)]-right-[titleLabel(>=0)]-right-|", options: [], metrics: metrics, views: views))
self.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-left-[thumbnailView(tumbSize)]-right-[bodyLabel(>=0)]-right-|", options: [], metrics: metrics, views: views))
self.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-right-[thumbnailView(tumbSize)]-(>=0)-|", options: [], metrics: metrics, views: views))

if self.reuseIdentifier == Constants.MessageCellIdentifier 
    self.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-right-[titleLabel(20)]-left-[bodyLabel(>=0@999)]-left-|", options: [], metrics: metrics, views: views))
 else 
    self.contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[titleLabel]|", options: [], metrics: metrics, views: views))

我注意到,当我删除 if 语句中的约束时,视图显然会进入尴尬的位置,但我确实注意到它不再具有绿色填充。我真的不确定是什么导致了这种填充。

这就是the code is based on.

【问题讨论】:

【参考方案1】:

好吧,您通过使用 left 值包装该正文标签来添加该填充。

所以,而不是: V:|-right-[titleLabel(20)]-left-[bodyLabel(>=0@999)]-left-|

执行以下操作: V:|-right-[titleLabel(20)][bodyLabel(>=0@999)]|

这将删除顶部和底部的填充。希望对您有所帮助!

【讨论】:

我确实试过了,但也没有用。这会影响红色和绿色标签之间的空间。它实际上并不影响标签本身。在这一点上,我正在考虑尝试使用自定义 XIB。我认为这可能与强制单元格的最小高度有关,但即使我在绿色范围内键入几行,该空间仍然存在。 我最终创建了一个 XIB,它确实有助于向我展示正在发生的事情。这基本上是正确的,但我需要在其他地方进行更改才能真正得到我想要的。【参考方案2】:

您需要将边缘设置为 UILabel。

请参阅以下链接以获取解决方案: ios Add left padding to UILabel

【讨论】:

以上是关于UILabel 具有来自编程约束的内部填充的主要内容,如果未能解决你的问题,请参考以下文章

创建约束以在视图中居中标签

使用自动布局检索子视图的正确位置

具有动态高度的 UITableViewCell 中的多个 UILabel

以编程方式添加具有相对约束问题的标签

以编程方式更改 UILabel 上的约束打破布局

使用 NSLayout 以编程方式向 UILabel 添加约束